gpt4 book ai didi

sql - Oracle:利用两个索引

转载 作者:行者123 更新时间:2023-12-04 21:35:17 27 4
gpt4 key购买 nike

如您所见,Oracle 可以利用两个索引并解决整个查询,而无需通过 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)上的索引非常有选择性。

enter image description here

enter image description here

enter image description here

最佳答案

你说 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 Fiddle 被抛出)

关于sql - Oracle:利用两个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10007598/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com