我可以依靠估计执行计划来推荐索引吗?

car*_*reo 3 index sql-server sql-server-2016

我在 Microsoft SQL Server 2016 上有一个数据库,有一个大约一百万行的表,我们称之为书籍。这个查询需要超过一分钟,这是不可接受的:

select * from books wherepublisher_id in (857413, 857317, 857316)

从publisher_id 到publishers 表有一个合适的FK。我显示了 Estimated Execution Plan,它告诉我 100% 的成本都在 book 表的主键上的“Clustered Index Scan (clustered)”中。让我担心的是,它根本不推荐索引。通过查看查询,很明显索引会有所帮助。事实上,当我创建索引时,查询会立即返回结果。我的数据库中有什么东西损坏了,也许是统计数据?或者您认为我应该也不相信我在估计的执行计划中读到的内容?

Tar*_*zer 7

当查询计划微不足道时,它不会为您提供缺少索引的限制,也许这就是您遇到的情况。

右键单击 SELECT 运算符并选择属性。检查优化级别是否为 TRIVIAL。

在此处输入图片说明

在进行性能故障排除时,我大量使用估计的执行计划。我很少有真正的计划。关于缺失的索引,我不只是添加计划认为缺失的内容。我测试了索引、它的变体等。