暂无图片
oracle 时间类字段加复合索引,为什么不推荐放在前面?
我来答
分享
暂无图片 匿名用户
oracle 时间类字段加复合索引,为什么不推荐放在前面?

oracle 时间类字段加复合索引,为什么不推荐放在前面?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
赵勇

你可以设想一下,假如你有一个大型超市的收银流水表,记录着每一个收银员在某个时间收到的每一笔钱。。如果我们在这张表的收银员的名字列和收银时间列上创建一个组合索引,当我们用 收银员='张三' and 收银时间 between to_date('2021-12-27 17:00','yyyy-mm-dd hh24:mi') and to_date('2021-12-27 17:10','yyyy-mm-dd hh24:mi') 这个条件来查询时。当我们在这两列以不同的顺序创建索引,在查询索引时,其需要访问的索引数据量是不同的。

次序1:收银员名字、收银时间

由于收银员名字在前,所以,所以收银流水,会先按收银员名字排序,当值相同时,再按收银时间排序。即,同一个收银员经手的流水,一定是挨在一起的,而且,这些流水又是按时间顺序排列的。在索引上查找时(你可以想象一下你在这样一个排好序的表格中查找时的情形),我们可以很顺利地先通过收银员姓名列找到收银员,然后通过收银时间,又能很快的找到过滤条件中的起始时间,然后顺着往下,逐条向下,直至时间大于了过滤条件中的结束时间就可以了。而且,在整个查找过程中,几乎没有访问到无效的数据(即不符合条件的数据)

次序2:收银时间,收银员名字

对于这样一个索引,我们可以很快的定位到过滤条件中的起始时间,但当我们再去查看收银员的名字时,你可能发现收银员的名字的出现是无规律的,只有当前面的收银时间完全相同时,收银员的名字才是有序的,所以,这时,你要找到张三,需要逐行向下,并判断是不是张三,是就要,不是就要继续向下找。直至收银时间超过了过滤条件上的结束时间。

显然,对于前述的过滤条件,次序1远好于次序2。

所以,在创建组合索引时,有一个原则:等值过滤条件列要往前放,非等值条件列要排在等值条件列后。

注:这只是原则,不是说任何情况下都要这么建。

因此,时间类的列做为复合索引的前导列可以,但如果SQL的过滤条件,对该列不是等值的比较,那么这样做就会导致索引访问效率不高。

暂无图片 评论
暂无图片 有用 1
打赏 0
暂无图片
chengang

因为复合索引遇到 范围比较就会停止使用后面的字段。

而日期很少用等值比较吧。

暂无图片 评论
暂无图片 有用 0
打赏 0
摸摸鱼

没有这种说法,复合索引是考虑选择性的,一般是将选择性好的放在前面作为前导列。

不过一般按照日期的选择性可能不太好。

比如

-- time选择性不好的情况

time:按天,

id :标识(选择性很好)

那么每天不可能只有一条数据,那么就可能存在1天有多个不同id值,那一定id列的选择性好与time。如果条件用time和id,那一定id放前面,先走id效率较好。

--time选择性好的情况

time:按照秒

type :类型只有4种

那一定是time选择性好,如果条件用到time(精确到秒)和type,那一定是time放在前面,效率较好。



暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
Oracle如何查看正在运行的dbms_jobs
回答 3
已采纳
直接查userjobs就能查到:selectfromuserjobswherejob411;看job的运行时间是否在变化,broken是否为N,failusers等于0即表示JOB运行正常。
Oracle 可以在 OracleLinux 9 上面安装 11GR2 数据库吗?
回答 3
已采纳
看了下官方支持列表,OracleLinux9是不被支持的但是通过脚本是可以成功安装的,可以参考:Oracle数据库一键安装脚本希望能帮助到你!
oracle为什么要设置高水位线?
回答 1
为了记录数据存储到哪里了,使用率。
ORA-00214: control file ‘string’ version string incompatible with ORACLE version string
回答 1
已采纳
ORA00214错误表示控制文件的版本与Oracle版本不兼容。恢复一个备份
一个服务器安装了多个数据库,有没有一个脚本统一startup或shutdown?
回答 2
加载数据库的变量,然后进去启动或者关闭。依次写吧
Oracle SSL证书问题
回答 1
https://oraclebase.com/articles/misc/configuretcpipwithsslandtlsfordatabaseconnectionshttps://docs.o
各位大佬,centos7安装了oracle 11g之后敲命令有明显的卡顿感,有遇到过的嘛?
回答 1
有明显的卡顿感首先检查下系统资源情况,cpumenswap,没准是你oracle内存分大了,大页配置配置大了。
oracle19c连接,访问,查询比较慢
回答 1
先看看awr报告
oracle sqlloader加载一个大文件是先把大文件一次性读取到内存中?
回答 3
没做过这样的实验还真不清楚,不过可以试想一下如果我的内存只有1G要加载2G的文件是会报错吗?如果文件100G内存2G也不会一次性加载进去,所以我觉得不是一次性全部加载进内存,应该是根据BINDSIZE
各位大佬怎么定义N为标识符而不报错 select N'34112000mm³' from dual; '34112000mm³'为传入参数?
回答 1
oracle有这个标识符么?