运行查询后,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也包含在上面的建议中
现在让我们创建并观察两种结构..
—根级——-
—-叶级——-
正如您所看到的,根据建议创建没有任何区别,即使它是无效的.
我假设索引顾问基于查询运行提出了建议,并且专门用于查询,并且它不知道涉及其他索引