oracle 12c 新特性之(相同欄位上的多重索引、ddl 日誌、限制PGA的大小、分頁查詢)

張衝andy發表於2017-05-07
1. 相同欄位上的多重索引
   在Oracle 12c R1之前,一個欄位是無法以任何形式擁有多個索引的。或許有人會想知道為什麼通常一個欄位需要有多重索引,事實上需要多重索引的欄位或欄位集合是很多的。在12c R1中,只要索引型別的形式不同,一個欄位就可以包含在一個B-tree索引中,同樣也可以包含在Bitmap索引中。注意,只有一種型別的索引是在給定時間可見可用的。

SQL>create table more_ind as select * from user_objects;
Table created.
SQL> create index ind_one on more_ind(object_id);
Index created.
SQL> create index ind_two on more_ind(object_id);                          
ORA-01408: such column list already indexed
SQL> create bitmap index ind_two on more_ind(object_id);
ORA-01408: such column list already indexed
SQL> create bitmap index ind_two on more_ind(object_id) invisible;
Index created.

2. ddl 日誌
在之前的版本中沒有可選方法來對DDL操作進行日誌記錄。而在12c R1中,你現在可以將DDL操作寫入xml和日誌檔案中。這對於瞭解誰在什麼時間執行了create或drop命令是十分有用的。要開啟這一功能必須對ENABLE_DDL_LOGGING 初始引數加以配置。這一引數可以在資料庫或會話級加以設定。當此引數為啟用狀態,所有的DDL命令會記錄在$ORACLE_BASE/diag/rdbms/DBNAME/log|ddl 路徑下的xml和日誌檔案中。一個xml中包含DDL命令,IP地址,時間戳等資訊。這可以幫助確定在什麼時候對使用者或表進行了刪除亦或是一條DDL語句在何時觸發。

SQL> ALTER SYSTEM|SESSION SET ENABLE_DDL_LOGGING=TRUE; 

alter system set enable_ddl_logging=true;

以下的DDL語句可能會記錄在xml或日誌檔案中:

CREATE|ALTER|DROP|TRUNCATE TABLE

DROP USER

CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENC

實驗:
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> alter system  set enable_ddl_logging=true;

System altered.
SQL> truncate table select_top;

Table truncated.

[oracle@12c01 ddl]$ pwd
/home/oracle/app/oracle/diag/rdbms/andycdb/andycdb/log/ddl
[oracle@12c01 ddl]$ ll
total 4
-rw-r-----. 1 oracle oinstall 308 May  7 21:28 log.xml
[oracle@12c01 ddl]$ cat log.xml 
<msg time='2017-05-07T21:28:36.028+08:00' org_id='oracle' comp_id='rdbms'
 msg_id='opiexe:4695:2946163730' type='UNKNOWN' group='diag_adl'
 level='16' host_id='12c01' host_addr='10.100.25.16'
 pid='8858' version='1' con_uid='1'
 con_id='1' con_name='CDB$ROOT'>
 <txt>truncate table select_top
 </txt>
</msg>

3. 限制PGA的大小
在Oracle 12c R1之前,沒有選項可以用來限制和控制PGA的大小。雖然你設定某個大小為PGA_AGGREGATE_TARGET 的初始引數,Oracle會根據工作負載和需求來動態地增大或減小PGA的大小。而在12c中,你可以透過開啟自動PGA管理來對PGA設定硬性限制,這需要對PGA_AGGREGATE_LIMIT 引數進行設定。因此,你現在可以透過設定新的引數來對PGA設定硬性限制以避免過度使用PGA。
SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=2G; 
SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=0; --disables the hard limit  
提示:當超過了當前PGA的限制,Oracle會自動終止/中止會話或程式以保持最合適的PGA記憶體。

4. 分頁查詢
   在12c之前,只能透過一些間接手段來獲取前N行的結果,如:rownum。在12c中,透過FETCH FIRST|NEXT|PERCENT可以直接得到top_n。
11g中分頁查詢示範:
select * 
from(select a.*,rownum rn 
     from emp a
     where rownum<=10) 
where rn>=5 ;

12c:
1.準備實驗環境
create table select_top (id int);
insert into select_top values(1);
insert into select_top values(2);
insert into select_top values(3);
insert into select_top values(4);
insert into select_top values(5);
insert into select_top values(6);
insert into select_top values(7);
insert into select_top values(8);
insert into select_top values(9);
insert into select_top values(5);
insert into select_top values(10);

SQL> select * from select_top;

ID
----------
1
2
3
4
5
6
7
8
9
5
        10

11 rows selected.
2. 取id數字大小為前5的記錄
模式一:重複記錄只顯示一次
SQL> select id from select_top order by id fetch first 5 rows only;

ID
----------
1
2
3
4
5

模式二:重複記錄顯示多次
SQL> select id from select_top order by id fetch first 5 rows with ties;

ID
----------
1
2
3
4
5
5

6 rows selected.
3. 跳過前五條記錄,返回後五條記錄
SQL> select id from select_top order by id offset 5 rows fetch next 5 rows only;

ID
----------
5
6
7
8
9

4.取id前50%的記錄(這只是近似值)
SQL> select id from select_top order by id fetch first 50 percent rows only;

ID
----------
1
2
3
4
5
5
SQL> select count(*) from select_top;

  COUNT(*)
----------
11

SQL> select 6/11 from dual;

      6/11
----------
.545454545

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2138620/,如需轉載,請註明出處,否則將追究法律責任。

相關文章