sql-server – SQL Server 2014索引优化:在索引中包含主键有什么好处?

运行查询后,SQL Server 2014实际查询计划显示缺少的索引,如下所示:

 CREATE NONCLUSTERED INDEX IX_1 ON Table1 (Column1) INCLUDE
 (PK_Column,SomeOtherColumn)

缺失的索引建议在索引中包含主键列.该表是带有PK_Column的聚簇索引.

我很困惑,似乎我没有得到Clustered Index Primary Key的概念.

我的假设是:当一个表有一个聚簇PK时,所有非聚集索引都指向PK值.我对么?如果我是,为什么缺少索引的查询计划要求我在索引中包含PK列?

最佳答案 摘要:

建议的索引无效,但没有任何区别.有关详细信息,请参阅下面的测试部分.

经过一段时间的研究,发现一个answer here及以下的声明令人信服地解释了缺失的索引特征.

they only look at a single query, or a single operation within a single query. They don’t take into account what already exists or your other query patterns.

You still need a thinking human being to analyze the overall indexing strategy and make sure that you index structure is efficient and cohesive.

所以提出这个问题,建议的这个指数可能是有效的,但不应该被视为理所当然.对于执行的特定查询,建议的索引对SQL Server很有用,以降低成本.

这是建议的指数..

 CREATE NONCLUSTERED INDEX IX_1 ON Table1 (Column1) 
        INCLUDE (PK_Column, SomeOtherColumn)

假设您有如下查询..

select pk_column, someothercolumn 
from table 
where column1 = 'somevalue'

SQL Server尝试扫描一个窄索引(如果可用),因此在这种情况下,建议的索引将有所帮助..

此外,如果您有如下索引,则不会共享表的架构

create index nci_test on table(column1)

并且下面表格的查询将再次建议与所述相同的索引

select pk_column, someothercolumn 
from table 
where column1 = 'somevalue'

更新:
我有以下架构的订单表..

[orderid] [int] NOT NULL Primary key,
[custid] [char](11) NOT NULL,
[empid] [int] NOT NULL,
[shipperid] [varchar](5) NOT NULL,
[orderdate] [date] NOT NULL,
[filler] [char](160) NOT NULL

现在我创建了一个以下结构的索引..

create index onlyempid on orderstest(empid)

现在当我查询下面的表格时

select empid,orderid,orderdate --6.3 units
from orderstest 
where empid=5

指数顾问将建议以下缺失指数.

CREATE NONCLUSTERED INDEX empidalongwithorderiddate
ON [dbo].[orderstest] ([empid])
INCLUDE ([orderid],[orderdate])--you can drop orderid too ,it doesnt make any difference

如果你能看到orderid也包含在上面的建议中

现在让我们创建并观察两种结构..

—根级——-

仅供索引使用..
《sql-server – SQL Server 2014索引优化:在索引中包含主键有什么好处?》

索引empidalongwithorderiddate
《sql-server – SQL Server 2014索引优化:在索引中包含主键有什么好处?》

—-叶级——-

仅供索引使用..
《sql-server – SQL Server 2014索引优化:在索引中包含主键有什么好处?》

索引empidalongwithorderiddate
《sql-server – SQL Server 2014索引优化:在索引中包含主键有什么好处?》

正如您所看到的,根据建议创建没有任何区别,即使它是无效的.

我假设索引顾问基于查询运行提出了建议,并且专门用于查询,并且它不知道涉及其他索引

点赞