gpt4 book ai didi

sql - 为什么索引不用于某些值?

转载 作者:行者123 更新时间:2023-12-02 01:53:41 24 4
gpt4 key购买 nike

我们有包含电子邮件和站点 ID 列的表“客户”。并且有一个由这两列组成的索引。因此,相关查询在通过电子邮件执行查询和过滤时始终使用此索引,例如:

select * from customers where email = 'someEmail@gmail.com';

我们可以确保使用了索引,因为我们已经使用解释计划检查了查询。现在,我们昨天有一个有趣的案例。带有子句“email = 'random@gmail.com' 的相同查询根本没有使用索引。解释计划显示 oracle 进行了全面扫描。该表包含数百万条记录,因此没有索引的查询达到了 30 秒。有趣的部分查询是否将索引与任何其他电子邮件值(ransom@gmail.com、randon@gmail.com)一起使用。oracle 不使用索引的原因是什么?

我想到索引不包含这样的值的一个原因,所以首先 oracle 遍历索引然后进行全扫描,但随后解释计划应该显示它执行了索引扫描。在我们的例子中,解释计划只显示完整扫描。另一个原因是它与 db restore 有某种关系,但也不确定索引怎么可能不包含这样的值。

UPDATE 恢复后的所有表的 last_analyzed 日期值均为一周前。在电子邮件的这种特殊情况下,由于更新后的客户隐私,所有电子邮件都更新为一些随机值。客户表有数百万条记录,所以是的,恢复后发生了相当大的变化,但仍然不明白它与不使用电子邮件有何关系,因为该客户表在恢复前已经有数百万条记录。

UPDATE2 在我们对表进行统计后使用索引。

UDATE3 好吧,客户表中的所有电子邮件值都是唯一的,因此 CBO 不太可能认为此类特定电子邮件的行太多。只是有很多电子邮件具有相同的起始字符“随机...”,但这不应该被视为相同的值,对吧?

最佳答案

服务器不会查看索引中的数据,如果找不到则扫描表。在它做任何事情之前,它会查看统计信息以确定是否应该使用索引或扫描表。我猜测由于某种原因传递的电子邮件地址使 oracle 认为扫描表比查看索引更好。因素太多,无法得出准确的结论。查看此统计信息Oracle Doc on Stats .您可能会考虑更改索引统计所涵盖的数据量,这会有所帮助。

关于sql - 为什么索引不用于某些值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21434995/

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