對象管理
1、表
sql
表數據和索引數據都放到索引段中
用到表的數據量很大,將表數據和索引數據放到同一個索引段中,只須要掃描一個段就能夠取出數據,減小塊的讀取
索引組織表先插入的放到前面,後插入的放到後面,根據大小排序
建表語法:
create table <>(column datatype.....,) organization index //必需要指定主鍵列
刪除,修改與表一致
數據庫
列下面還有列vim
| ename | tel |
|name | sex | tel1 | tel2 |
>>>insert into teel valuse('aa',tel_type('123456','123564'),'cd ');
>>>select e.tel.tel1 from teel e; //必需要給一個別名才能夠查到
>>>update teel t set t.tel.tel1='13012345' where name='aa';
>>>alter type tel_type frop attribute(tel1) cascade; //刪除某一列下的子列,由於該語句爲PLSQL語句,因此用戶掉不到數據,只有退出後從新登陸,或者執行一些DDL操做後,才能從表中查到數據
安全
(項目中不經常使用)
多表查詢的時候,兩個表當中有相同的列(列名相同,數據類型相同,內容相同)
create cluster <> (column datatype);
create index <> on cluster();
create table <> ();
服務器
(使用頻率和堆表一致)網絡
當一個表中的數據量達到1G,而咱們的堆表沒法知足時,咱們須要將普通表建立爲分區表
session
1)每一個分區的數據能夠分開存放,放到不一樣磁盤中,減小磁盤IO
2)數據能夠按分區進行備份
3)用戶能夠查詢某一個記錄時,能夠只掃描某一個分區,減小掃描時間
4)每一個分區能夠指定到不一樣的磁盤,保證數據的安全
oracle
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1)range範圍分區:要分區的列,值在某個範圍內
create table <> (column datatype ,...) partition by range(column)
partition <> values less than () ,
partition <>values less than(),
....
partition <> valuse less than (maxvalue);
app
SQL> l 1 create table remp (deptno number,ename varchar2(20),sal number) 2 partition by range(sal) 3 (partition p1 values less than(1000), 4 partition p2 values less than(2000), 5 partition p3 values less than(3000), 6* partition p4 values less than(maxvalue)) SQL> / Table created.
>>>select * from remp p1;
>>>select segment_name from user_segments; //每個分區一個段less
create table hemp (deptno number,ename varchar2(20),hirdate date) partition by range(hirdate) (partition p1 values less than(to_date('1981-01-01','yyyy-mm-dd')), partition p1 values less than(to_date('1982-01-01','yyyy-mm-dd')), partition p1 values less than(to_date('1983-01-01','yyyy-mm-dd')), partition p1 values less than(to_date('1988-01-01','yyyy-mm-dd')) );
11g中引進的範圍分區的一種:間隔分區(年,月,天,小時,分鐘,秒)
分隔函數
numtoyminterval(2,'year') //每隔兩年分區
numtoyminterval(1,'month') //每隔一月分區
numtodsinterval(7,'day')
,每隔一年就會建一個分區
create table r1 (name varchar2(10) ,hdate date) partition by range(hdate) interval (numtoyminterval(1,'year')) ( partition p1 values less than(to_date('1981-01-01','yyyy-mm-dd')) );
2)hash哈希分區:對錶中的列進行分區,但這個列沒有規律可循
create table <> (column datatupe,...) partition by hash (column)
(
partition <>,
partition <>.
....
);
SQL> create table hemp (ename varchar2(20),empno number) partition by hash (ename) 2 (partition p1, 3 partition p2, 4 partition p3); Table created. SQL> SQL> select * from hemp p2;
3)list列表分區:要分區的列,列的值是固定的
要分區的列重複值不少,可使用in列舉出來
SQL> create table lemp(deptno number,ename varchar2(20))partition by list(deptno) 2 (partition p1 values(10), 3 partition p2 values(20), 4 partition p3 values(30) 5 partition p4 values(default)); Table created. SQL>
11g的新功能
create table lemp (hiredate date,ename varchar2(20),hdate (as to_char(hiredate,'yyyy'))) partition by list(hdate) ( partition p1 values('1980'), partition p2 values('1981'), partition p3 values('1982'), partition p4 values(default));
4)組合分區:表已經分區,但須要在進行分區
10g---
(by list+by range
by range+by hash
by list+by hash
)
11g---9種分區 by range+by range
create table <> (column datatype ....) partition by list(column)
subpartition by range(colunm)
(
partition <> values(..)
(
subpartition <> values less than(..),
subpartition <> values less than(..),
subpartition <> values less than(..)
)
partition <> values(...)
(
subpartition <> values less than(..),
subpartition <> values less than(..),
subpartition <> values less than(..)
)
);
create table lremp(ename varchar2(20),deptno number,sal number) partition by list(deptno) subpartition by range(sal) ( paratition p1 values (10) ( subpartition p11 values less than(1000), subpartition p12 values less than(2000), subpartition p13 values less than(3000), subpartition p14 values less than(maxvalue) ), partition p2 values(20,30) ( subpartition p11 values less than(1000), subpartition p12 values less than(2000), subpartition p13 values less than(3000), subpartition p14 values less than(maxvalue)) ); >>select * from lremp subpatition p22;
d.分區表與普通表的轉換
1)插入數據法
會產生大量的redo,不適合數據量大的表,也不適合7*24小時的數據庫
insert
2)交換分區法
10-20-30 適合數據量較大的表,速度較快,也會產生redo也會產生undo,業務量較大,業務高峯期,也不建議使用
建分區表
create table t12 (ename varchar2(10),deptno number(2) ,sal number(7,2)) partition by list(deptno) ( partition p1 values (10), partition p2 values (10), partition p3 values (10), partition p4 values (default) ); // 建和分區表對應的普通表,並在表中寫入數據 create table e1 as select ename,deptno,sal from emp where deptno=10; create table e1 as select ename,deptno,sal from emp where deptno=20; create table e1 as select ename,deptno,sal from emp where deptno=30; create table e1 as select ename,deptno,sal from emp where deptno not in (10,20,30);
alter table t12 exchange partition p1 with table e1; //將咱們的普通表中的數據交換到分區表中去,普通表會被清空,分區表會更新咱們的普通表數據
alter table t12 exchange partition p2 with table e2;
alter table t12 exchange partition p3 with table e3;
3)在線重定義(工做中可用,能夠保證兩個表中的數據一致)
必需要有主鍵列
SQL> desc DBMS_REDEFINITION
1>建立分區表
2>使用在線重定義錶轉換
dbms_redefinition.start_redef_table('SCOOT','EMP','LEMP') //括號裏的內容依次爲(uname , orig_table, int_table)
dbms_redefinition.sync_interim__table('SCOOT','EMP','LEMP')
dbms_redefinition.finish_redef__table('SCOOT','EMP','LEMP') //若是不執行完成同步操做,emp中只要有數據插入都會同步到lemp表中,可是會鎖住lemp表,因此也不適合高峯時期
1.增長分區
alter table <> add partition <> values() ;//增長list分區
alter table <> add partition <> valuse less than () ;//增長range分區
alter table <> add partition <> ; //增長hash分區
alter table <> add subpartition <> values(); //組合分區list
alter table <> add subpartition <> values() less than ();
alter table <> add subpartition <> ; //組合分區hash
2.刪除分區
alter table <> drop partition <> values();
alter table <> drop partition <> ;
3.合併分區
alter table <> merge partitions p1,p2 into partition p2;
alter table <> merge subpartitions <> ,<> into subpartition <> ;//合併子分區
四、分區索引建立
1)全局索引:一個分區表上只建立一個索引
create index <> on <> (colmn) global;
alter index <> rebuild online ; //在線重建,必需要事務完成後才能成功,不多有用戶作DML操做時才能取建立
2)本地索引:一個分區表上每一個分區都建立一個索引 ,適用於DDL 操做較多的分區
create index <> on <> (clomn) local ;
alter index <> rebuild partition <>;
>>>desc user_indexes //查看建立的索引
>>>desc user_ind_partitions //查看分區表的索引
數據不是存放在數據庫中,而是在外部文件中
1.將其餘數據庫的數據先導成文本格式,而後再用sqllosder 方式導進去
sqlloader : 將外部文件導入到表中,數據就存放到數據文件中了,能夠作DML操做,DQL操做
1>$sqlloader
2>infile =/tmp/a.txt 對應的表,對應的列
$sqlldr scott/tiger control=/tmp/sqlload.ctl
vim /tmp/sqlload.ctl
load data infile ‘/tmp/a.txt ’ //從哪一個地方加載 append //以怎樣的方式加載 into table dept //加載到哪裏去 fields terminated by ‘,’ //列以什麼方式間隔 trailling nullcols //過濾最後的空行 (deptno,dname,loc) //加載的每一個數據對應的列
cd /opt/u01/oracle/11g/sqldeveloper/
2.下面這兩種方式,是引用的方式,數據仍是放在外部空間裏,只能作查詢操做,不能夠作DML操做 (工做中基本不會用到這種方式)
oracle loader : 加載文本外部文件
create table <> () organization external ( type oracle load create directory ext1 as '/tmp'; grant read,write on directory ext1 scott ; create table extab(deptno number ,name varchar2(20) ,loc varchar2(10)) organization external ( type oracle_loader default directory ext1 access parameters ( records delimited by newline fields terminated by ‘,’ ) location (a.txt);
oracle datapump :只能加載二進制文件,基本不會使用
通常用做測試
1.居於事務的臨時表
事物一旦被提交,表就會被清空
create global temporary table <> (colmn datatype ,...) on commit delete rows;
2.居於會話的臨時表,當前會話建立,一旦結束會話,表就會被清空
create global temporary table <> (column datatype,...,...) on commit preserve rows ;
3.普通臨時表
create global temporary table <> (column datatype,...,); //用戶執行用戶切換,rollback ,退出會話,commit 表都會被清空
>>>create global temporary table t1 (name varchar2(20) ,deptno number ) on commit delete rows ;
1.專有鏈接
用戶鏈接有專門的進程進行相應
user ----server process
2.共享鏈接 []
用戶鏈接數據庫時,沒有服務進程相應,而將用戶的信息放到調度裏,而調度放到隊列[隊列]中
uesr ----dispater --[SAG] ----server ------data buffer ------|
3.監聽程序工做原理
用戶進程跟服務器能不能鏈接主要是去問咱們的監聽
客戶端程序------tnsnames.ora/本地命名解析文件
1.sqlplus sys/oracle@updb as sysdba //遠程鏈接
b.去客戶端驗證用戶名密碼
c.經過服務器鏈接實例
2.sqlplus sys/oracle@ip:1521/service_names as sysdba
服務器端程序listener.ora
1.靜態註冊
將實例名/服務名寫到了監聽文件中
SID_DESC (實例名/服務名 oracle家目錄 ....)
2.動態註冊
由pmon 進程去動態註冊
alter system register; //手動註冊,pmon也是去執行這條命令
lsnrctl status //查看監聽狀態
lsnrctl stop //停掉咱們的監聽
ready : 動態註冊
unknow: 靜態註冊
項目中通常使用靜態監聽,能夠保證用戶時時能夠鏈接
一個數據庫中只使用一個listener.ora
一個監聽能夠監聽一個數據庫,也可監聽多個數據庫
一個監聽程序能夠被多個實例監聽 ----集羣
監聽的默認端口爲:1521
4.如何配置監聽
在grid 目錄下面執行 netca 建立出來的爲動態的監聽 圖形界面建立 ,監聽文件會放到/opt/u01/grid/11g/nerwork/admin/listener.ora ,在哪一個文件下面執行就會建立到相應的文件目錄下
add-->listener-->ipc--->1521--->no-->
netmgr 建立出來的爲 靜態的監聽
靜態註冊,監聽兩個庫
有參數的修改,必須重啓監聽
lsnrctl stop
lsnrctl start
tnsname.ora
5.監聽程序的管理
11g之前 : lsnrtcl start
lsnrctl status
lsnrctl stop
lsnrctl reload
11g 之後---
srvctl start listener //只能啓動監聽名字爲listener的監聽
srvctl start listener -l listener1 //啓動名字爲listener1的監聽
srvctl add listener -l listener1 //監聽沒有在grid文件裏,加入到grid文件裏進行管理
srvctl remove listener
lsnrctl start
show parameter service_name //查看服務名,若是爲updba.com 通常走的專有鏈接
select service_name ,username,server for v$session //service 爲dedicated 表示是專有鏈接
shared 是sys用戶的共享鏈接,none是普通用戶的共享鏈接
vim /opt/u01/oracle/11g/network/admin/tnsnames.ora
增長server
查看網絡是否通暢,用
tsping updb
tnsping updb