甲骨文:取使用两个指数的优点(Oracle: take advantage of using two

2019-09-16 08:12发布

正如你所看到的甲骨文可以利用两个指标,解决了整个查询,而无需通过ROWID访问表?

SELECT  'Scarti letture GAS' tipo, campo47 pdf, COUNT (1) n
  FROM out.CONSUMI_GEE_LC_T500_00 v
  WHERE stato = 'SC'
  AND stato is not null
  AND campo47 is not null
  GROUP BY 'Scarti letture GAS', campo47;

我做了一个测试将现场campo47到STATO指数。 从1' 49‘’到0,6s的性能提升。

在stato指数是没有选择性。 在campo47指数(这意味着field47)确实是有选择性的。

Answer 1:

你说CAMPO47是高度选择性的。 但是,你只筛选上IS NOT NULL。 所以不要紧有多少不同的值了,优化器是不会使用它作为切入点。

并且是如何选择的? 正如你可以从说明计划的基数,选择在STATO看到=“SC”在你的表,发现12856行。 显而易见的那些行的12702具有带有值CAMPO47,因此只有154行由该测试为无效过滤掉。 如果优化已经扑通上CAMPO47指数多少行会回来吗? 也许更多。

优化器只能使用一个堆索引来访问表中的行。 (该机制是位图索引不同,当他们申请一个星型转换)。 所以,如果你想附加表的访问是不可忍受的负担,那么你有一个选择:一个复合索引。 如果STATO是真正的非选择性(相对较少的行),那么你很可能与一个上(STATO,CAMPO47)取代现有的指数是安全的。


有一个老把戏轻推到数据库使用索引来访问IS NOT NULL操作,那就是使用一个操作数,其中列包含的值只能是真。 举例来说,像这样的字符串列(我假设一些所谓CAMPO47只是长谷是一个字符串):

AND campo47 >= chr(0)

这将匹配包含一个或多个ASCII字符的任意列。 不知道这是否会导致你所描述的“双指标”的优化,但它是值得一试。 (我会测试这个自己,但我没有访问Oracle数据库,现在,SQL小提琴投掷时,我想看看解释计划)



文章来源: Oracle: take advantage of using two index