oracle 12c 新特性之(相同字段上的多重索引、ddl 日志、限制PGA的大小、分页查询)

xiaoxiao2021-02-28  56

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
转载请注明原文地址: https://www.6miu.com/read-74850.html

最新回复(0)