oracle 12c 新特性之(相同欄位上的多重索引、ddl 日誌、限制PGA的大小、分頁查詢)
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
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle12c新特性(4)---相同欄位上的多重索引Oracle索引
- oracle12c新特性(9)--限制PGA的大小Oracle
- oracle 12c 新特性之不可見欄位Oracle
- oracle 12c 新特性之二:可以記錄DDL日誌Oracle
- Oracle12C新特性_DDL日誌Oracle
- 查詢表上的索引及對應的欄位索引
- 查詢oracle表的資訊(表,欄位,約束,索引)Oracle索引
- Oracle12c新特性(2)記錄DDL日誌Oracle
- clob欄位對於parallel ddl的限制Parallel
- 查詢SGA和PGA大小
- Oracle的分頁查詢Oracle
- Oracle分頁查詢之order byOracle
- Oracle 12C 新特性:關於歸檔日誌的備份Oracle
- Oracle 12c新特性之Sequence的Session特性OracleSession
- Oracle 12c新特性之:使用高階索引壓縮建立索引Oracle索引
- mysql 5.7 新特性中線上in-place 修改欄位的大小MySql
- 限制 Apache日誌檔案大小的方法Apache
- mysql查詢欄位內容無法區分大小寫問題MySql
- mysql 日誌之普通查詢日誌MySql
- oracle分頁查詢Oracle
- Oracle 12C 新特性之表分割槽部分索引(Partial Indexes)Oracle索引Index
- Oracle查詢資料表結構(欄位,型別,大小,備註)Oracle型別
- MySQL資料庫查詢多個欄位值全部相同的記錄MySql資料庫
- Oracle 查詢欄位詳細資訊Oracle
- 查詢oracle欄位預設值Oracle
- Oracle分頁查詢格式Oracle
- MySQL查詢索引的選擇性、索引欄位、註釋等基本資訊的SQLMySql索引
- MySQL 查詢索引的選擇性、索引欄位、註釋等基本資訊的SQLMySql索引
- mysql之 日誌體系(錯誤日誌、查詢日誌、二進位制日誌、事務日誌、中繼日誌)MySql中繼
- Oracle的特性分頁Oracle
- 使用Oracle的外部表查詢警告日誌Oracle
- loki的日誌查詢Loki
- 筆記 mongo查詢慢日誌,建立索引筆記Go索引
- Oracle 12c 新特性之 temp undoOracle
- MySQL 庫大小、表大小、索引大小查詢命令MySql索引
- ORACLE查詢欄位中含有空格的資料Oracle
- 使用 Eloquent ORM 使用 with 模型關聯查詢,如何處理select不同模型的欄位(欄位名可能相同)ORM模型
- Oracle資料庫中的分頁查詢Oracle資料庫