我应该在所有可搜索列上创建一个非聚集索引,还是只在每个列上分别创建一个非聚集索引?

Ale*_*win 6 sql-server nonclustered-index

我不确定是否正确使用非聚集索引。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]
    )
Run Code Online (Sandbox Code Playgroud)

我的查询是

SELECT * FROM tbl_shipping_rates_zones WHERE postal = '10001'
Run Code Online (Sandbox Code Playgroud)

我的问题是……我应该为所有可能的查找键创建索引吗?我在不同的查询中按 mzone、iso 和 postal 进行搜索。

谢谢

Han*_*non 6

SQL Server 将向您显示它想要使用的索引,因为它估计索引会使生活更轻松。当然没有必要在每个可搜索字段上创建索引,实际上这样做会使写入性能大大降低。如果给定表上的索引少于 5 到 10 个,并且一直运行该查询,则您可能希望完全按照 SSMS 显示的方式添加建议的索引。

JNK 的编辑如下

一起查看建议的索引也很重要。可以这么说,所有建议都在孤岛中,因此可以通过INCULDE在另一个索引上添加d 字段来替换整个建议索引。

例如,可以对这两个索引提出建议:

CREATE INDEX ix_IndexA ON Table (ColA, ColB)

CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Run Code Online (Sandbox Code Playgroud)

实际上,您可以通过以下方式满足两者的需求:

CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Run Code Online (Sandbox Code Playgroud)

我已经在更复杂的索引(10-20 个关键字段,10-20 个包含字段)中看到了这一点,其中向INCLUDE列表中添加一个字段将消除对第二个索引的需要。