【SQL开发实战技巧】系列(四十):Oracle12C常用新特性☞可以在同样的列(列组合)上创建多个索引以及可以对DDL操作进行日志记录

系列文章目录

【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事
【SQL开发实战技巧】系列(二):简单单表查询
【SQL开发实战技巧】系列(三):SQL排序的那些事
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起
【SQL开发实战技巧】系列(十一):拿几个案例讲讲translate|regexp_replace|listagg|wmsys.wm_concat|substr|regexp_substr常用函数
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加
【SQL开发实战技巧】系列(十四):计算消费后的余额&计算银行流水累计和&计算各部门工资排名前三位的员工
【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算
【SQL开发实战技巧】系列(十七):数据仓库中时间类型操作(初级)确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数
【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算
【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据
【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据
【SQL开发实战技巧】系列(二十二):数仓报表场景☞ 从分析函数效率一定快吗聊一聊结果集分页和隔行抽样实现方式
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
【SQL开发实战技巧】系列(二十四):数仓报表场景☞通过案例执行计划详解”行转列”,”列转行”是如何实现的
【SQL开发实战技巧】系列(二十五):数仓报表场景☞结果集中的重复数据只显示一次以及计算部门薪资差异高效的写法以及如何对数据进行快速分组
【SQL开发实战技巧】系列(二十六):数仓报表场景☞聊聊ROLLUP、UNION ALL是如何分别做分组合计的以及如何识别哪些行是做汇总的结果行
【SQL开发实战技巧】系列(二十七):数仓报表场景☞通过对移动范围进行聚集来详解分析函数开窗原理以及如何一个SQL打印九九乘法表
【SQL开发实战技巧】系列(二十八):数仓报表场景☞人员分布问题以及不同组(分区)同时聚集如何实现
【SQL开发实战技巧】系列(二十九):数仓报表场景☞简单的树形(分层)查询以及如何确定根节点、分支节点和叶子节点
【SQL开发实战技巧】系列(三十):数仓报表场景☞树形(分层)查询如何排序?以及如何在树形查询中正确的使用where条件
【SQL开发实战技巧】系列(三十一):数仓报表场景☞分层查询如何只查询树形结构某一个分支?如何剪掉一个分支?
【SQL开发实战技巧】系列(三十二):数仓报表场景☞对表中某个字段内的值去重
【SQL开发实战技巧】系列(三十三):数仓报表场景☞从不固定位置提取字符串的元素以及搜索满足字母在前数字在后等条件的数据
【SQL开发实战技巧】系列(三十四):数仓报表场景☞如何对数据分级并行转为列
【SQL开发实战技巧】系列(三十五):数仓报表场景☞根据条件返回不同列的数据以及Left /Full Join注意事项
【SQL开发实战技巧】系列(三十六):数仓报表场景☞整理垃圾数据:查找数据的连续性时间和重叠时间的关系,初始化开始结束时间
【SQL开发实战技巧】系列(三十七):数仓报表场景☞从表内始终只有近两年的数据,要求用两列分别显示其中一年的数据聊行转列隐含信息的重要性
【SQL开发实战技巧】系列(三十八):数仓报表场景☞拆分字符串进行连接
【SQL开发实战技巧】系列(三十九):Oracle12C常用新特性☞新增分页查询
【SQL开发实战技巧】系列(四十):Oracle12C常用新特性☞可以在同样的列(列组合)上创建多个索引以及可以对DDL操作进行日志记录


文章目录

  • 系列文章目录
  • 前言
  • 一、可以在同样的列(列组合)上创建多个索引
    • 案例
  • 二、可以对DDL操作进行日志记录
    • 案例
  • 总结


前言

本篇文章主要给讲解的Oracle12C+的两个新特性是:自12c起,可以在同样的列(列组合)上创建多个索引,但这么做有一个前提条件:这些索引必须是物理上完全不同的,如果想要在某列上先创建一个Btree索引,那么接下来只能在这个列再创建一个位图索引。此外,相同的列上索引只能有一个为可见的、在12C之前的版本中没有Oracle提供的可选方法来对DDL操作进行日志记录,而12c(R1)中,可以将DDL操作写入xml和日志文件中(需要开启ENABLE_DDL_LOGGING )。这对于了解谁在什么时间执行了create或drop命令是十分有用的。*

【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。


一、可以在同样的列(列组合)上创建多个索引

自12c起,可以在同样的列(列组合)上创建多个索引。
为什么要在相同的列上创建多个索引?举个例子,原先准备建一个星形的数据仓库,首先在事实表的外键列上加了一个btree索引,但是后来测试了一下,发现其实位图索引更适合一些,所以想尽可能无缝的把这个btree索引转换为位图索引。此时就可以创建一个不可见的位图索引,在相关工作准备好后,将btree索引删除,再将位图索引转为可见。
但这么做有一个前提条件:这些索引必须是物理上完全不同的,如果想要在某列上先创建一个B
tree索引,那么接下来只能在这个列再创建一个位图索引。此外,相同的列上索引只能有一个为可见的。

案例

在12C之前,不能在完全相同的列(或列组合)上创建多个索引,例如:

SQL> create index ta on emp(job);
索引已创建。
SQL> create bitmap index tb on emp(job) invisible;
create bitmap index tb on emp(job) invisible                           *1 行出现错误:
ORA-01408: 此列列表已索引

前面的create index语句在12C是可以正常运行的:

15:50:18 用户名: SCOTT >create index ta on small_table(id);
Index created.
Elapsed: 00:00:04.31
15:50:43 用户名: SCOTT >create bitmap index tb on small_table(id) invisible;
Index created.
Elapsed: 00:00:04.97

二、可以对DDL操作进行日志记录

在12C之前的版本中没有Oracle提供的可选方法来对DDL操作进行日志记录。
而12c(R1)中,可以将DDL操作写入xml和日志文件中。这对于了解谁在什么时间执行了create或drop命令是十分有用的。
要开启这一功能必须对ENABLE_DDL_LOGGING 初始参数做一下配置。此参数可以在数据库或会话级设置。
当参数为启用状态时,所有的DDL命令会记录在$ORACLE_BASE/diag/rdbms/DBNAME/log/ddl 路径下的xml和日志文件中。一个xml中包含DDL命令,IP地址,时间戳等信息。这可以帮助确定在什么时候对用户或表进行了删除或是一条DDL语句在何时触发。

案例

15:51:02 用户名: SCOTT >alter system set enable_ddl_logging=true;
16:08:31 用户名: SCOTT >create table ddl_test(a number);
16:08:48 用户名: SCOTT >alter table ddl_test add b varchar2(20);
16:08:52 用户名: SCOTT >truncate table ddl_test;
16:09:01 用户名: SCOTT >drop table ddl_test;

执行完上述操作后,到/u01/app/oracle/12/diag/rdbms/orcl/orcl/log/ddl目录查看log.xml
【SQL开发实战技巧】系列(四十):Oracle12C常用新特性☞可以在同样的列(列组合)上创建多个索引以及可以对DDL操作进行日志记录_第1张图片

会看到如上的内容。以下的DDL语句可能会记录在xml或日志文件中:

CREATE|ALTER|DROP|TRUNCATE TABLE
DROP USER
CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENC

总结

本篇文章主要给讲解的Oracle12C+的两个新特性是:自12c起,可以在同样的列(列组合)上创建多个索引,但这么做有一个前提条件:这些索引必须是物理上完全不同的,如果想要在某列上先创建一个Btree索引,那么接下来只能在这个列再创建一个位图索引。此外,相同的列上索引只能有一个为可见的、在12C之前的版本中没有Oracle提供的可选方法来对DDL操作进行日志记录,而12c(R1)中,可以将DDL操作写入xml和日志文件中(需要开启ENABLE_DDL_LOGGING )。这对于了解谁在什么时间执行了create或drop命令是十分有用的。*

你可能感兴趣的:(Oracle开发运维实战,sql,数据库,Oracle12C新特性,同样的列建多个索引,保留记录DDL日志)