2016-08-02 67 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 ...

硬盤驅動器盤片正從一個物理位置旋轉到另一個位置,這可能需要一些時間。

在一個索引中擁有所有你需要的功能會更有效,因爲它意味着依次讀取一個文件。