我不确定是否正确使用非聚集索引。SSMS 计划估计器说当以下索引已经在表上时添加另一个索引。
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones]
(
[iso] ASC, [mzone] ASC, [postal] ASC
)
INCLUDE
(
[region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci],
[zone_ups], [zone_fed]
)
我的查询是
SELECT * FROM tbl_shipping_rates_zones WHERE postal = '10001'
我的问题是......我应该为所有可能的查找键创建一个索引吗?我在不同的查询中按 mzone、iso 和 postal 进行搜索。
谢谢
SQL Server 将向您显示它想使用的索引,因为它估计索引会使生活更轻松。当然没有必要在每个可搜索字段上创建索引,实际上这样做会使写入性能大大降低。如果您在给定表上的索引少于 5 到 10 个,并且您一直运行该查询,您可能希望完全按照 SSMS 显示的方式添加建议的索引。
JNK的编辑如下
一起查看建议的索引也很重要。可以说,这些建议都是孤立的,因此可以通过
INCULDE
在另一个索引上添加 d 字段来替换整个建议索引。例如,可以对这两个索引提出建议:
实际上,您可以通过以下方式满足两者的需求:
我在更复杂的索引(10-20 个关键字段,10-20 个包含字段)中看到了这一点,在
INCLUDE
列表中添加一个字段将消除对第二个索引的需要。它告诉您创建新索引的原因是因为您拥有的索引可能不是最佳索引。查询优化器在选择使用哪个索引的方式上非常有选择性,以下链接应该可以帮助您理解选择性:
<链接>
您在上面说过您已在索引中包含所有列 - 实质上是复制表数据。在此基础上,在您提到的列上创建 3 个单独的索引会有什么危害?使用的空间会更少,速度会更快。我会冒险猜测这就是 DTA/执行计划告诉你的——只是以不同的方式。
查看查询生成的执行计划详细信息,以确定瓶颈在哪里,并将其用作设计索引的指南。SQL Server 非常擅长知道什么是最好的——相信它告诉你的东西。
我希望这可以帮助你。