2016-08-02 130 views
4

运行查询后,在SQL Server 2014的实际查询计划显示缺失索引象下面这样:SQL Server 2014索引优化:在索引中包含主键的好处?

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

的缺失索引建议将包括在索引中的主键列。该表是具有PK_Column的聚集索引。

我很困惑,似乎我没有得到聚集索引主键的概念。

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

+1

我认为这个建议是多余的(一般来说,缺少的索引建议需要仔​​细审查,看哪个是真正的好主意,因为优化器会建议所有东西和厨房水槽)。你可以尝试用'INCLUDE(S​​omeOtherColumn)'创建索引,并查看查询是否使用它,并且提示消失,这将是一个非常可靠的确认。 –

+0

您能否显示涉及的表的查询计划和模式 – TheGameiswar

+0

您的理解是正确的 - 任何非聚簇索引的*叶级*包含该索引本身的列,任何*包括*列,**和**聚簇键列(S)。问题确实是调优顾问:这是一个已知暗示不必要的软件,完全是多余的改变。不要盲目使用这些建议! –

回答

1

摘要:
指数劝无效,但它不会使任何以下测试difference.See的细节部分..

研究了一段时间后,发现了一个answer here及以下声明解释令人信服地关于缺少索引功能..

他们只看单个查询,或单个查询中的单个操作。他们不考虑已经存在的或您的其他查询模式。

你仍然需要一个有思想的人来分析整体索引策略,并确保你的索引结构是高效和有凝聚力的。

因此,你的问题,这个建议可能是有效的,但不应被视为理所当然。建议的索引对于执行的特定查询对于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也在上述建议纳入

现在,让我们创建它,并观察这两个结构..

---根级别-------

对于索引onlyempid ..
enter image description here

索引empidalongwithorderiddate
enter image description here

----叶级-------

对于指数onlyempid ..
enter image description here

索引empidalongwithorderiddate
enter image description here

正如你所看到的,根据建议创建没有区别,即使它是无效的。

我认为建议是基于查询索引顾问做跑,是专为查询,且无其他指标的想法参与

+0

模式与查询中的内容保持一致。您是否建议IX_1对您的查询有效?基于其他评论,我认为PK_Column不应该被包括在内,并且没有任何好处的存储开销。你同意吗? –

+0

是的查询类型我在我的答案,索引建议是有效的,但只为这个查询 – TheGameiswar

+0

好吧,现在我明白你的答案。你的第一个查询如何从包含PK_Column中受益?该指数已经有PK数据,为什么我们需要再次包含它? –

0

我不知道你的模式,也不是你的查询。只是猜测。

如果这个理论不正确,请纠正我。

你说得对,非聚集索引指向PK值。想象一下,你有一个大型的数据库(例如千兆字节的文件)存储在普通硬盘上。让我们假设磁盘碎片化并且PK_index被保存在远离Table1索引的物理位置。

想象一下,您的查询还需要评估Column1和PK_column。查询执行时读取Column1值,然后是PK_value,然后是Column1值,然后是PK_value ...

硬盘驱动器盘片正从一个物理位置旋转到另一个位置,这可能需要一些时间。

在一个索引中拥有所有你需要的功能会更有效,因为它意味着依次读取一个文件。