暂无图片
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
暂无图片
chengang

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

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

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

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

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

比如

-- time选择性不好的情况

time:按天,

id :标识(选择性很好)

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

--time选择性好的情况

time:按照秒

type :类型只有4种

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



暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏