2017-09-04 19 views
1

有時(並不總是!)我與a有性能問題。後面的SQL不是很好,但通常(當它正常工作時)性能就足夠了。SQL Server - 有時性能不佳並且缺少索引提示 - 爲什麼?

現在我注意到,有時性能非常差(需要花費10倍左右)。所以我用執行計劃檢查了SQL。

在情況下,我發現性能問題,我得到

缺少指數(影響59.007)消息:創建非聚集索引....

所以我檢查了命名錶時的索引我有問題,什麼時候沒有。在這兩種情況下,我都有相同的索引。

所以,現在,我的問題:

  • 爲什麼我得到有時缺失索引信息,有時不是當我指定表的索引不會改變?
  • 你有什麼想法爲什麼我有時會遇到這些性能問題(以及不同的執行計劃)嗎?

編輯: CREATE TABLE語句:

CREATE TABLE [dbo].[t1](
[c1] [int] IDENTITY(1,1) NOT NULL, 
[c2] [nvarchar](50) NULL, 
[c3] [nvarchar](50) NULL, 
[c4] [nvarchar](50) NULL, 
[c5] [date] NULL, 
[c6] [date] NULL, 
[c7] [nvarchar](50) NULL, 
[c8] [int] NULL, 
[c9] [int] NULL, 
[c10] [nvarchar](50) NULL, 
[c11] [decimal](15, 2) NULL, 
[c12] [int] NULL, 
[c13] [int] NULL, 
[c14] [nvarchar](50) NULL 
) ON [PRIMARY] 

5單獨的索引(4個非集羣,1 clusted)

如果您需要了解更多信息,請告訴我

+2

SQL代碼和/或用於創建表的腳本在哪裏? – madtyn

+0

具有不同計劃的SQL查詢是否相同?如果是這樣,您可以嘗試添加'OPTION(RECOMPILE)'提示以避免參數嗅探。將執行計劃上傳到https://www.brentozar.com/pastetheplan/ –

+0

您能向我們展示在此表上執行的查詢嗎? –

回答

1

爲什麼我有時會丟失索引消息,有時候我的索引表的索引沒有更改時有時不會變爲 ?

這完全取決於正在運行的查詢,如果SQL引擎認爲指數會幫助它選擇完成該查詢,然後它會告訴你該計劃。

注意:這些並不總是最好的!

引擎不會生成「最佳」執行計劃,它會得到一個「足夠好」的執行計劃,否則它可能會花費更多時間來獲得最好的結果,而不是實際完成查詢。所以當它提出一個指數時,它就會提出一個足夠好的計劃。查看查詢並根據它選擇索引。如果您開始使用索引管理首先查看聯接和where子句,請在測試服務器上查看哪些是最好的。

你有什麼想法爲什麼我有這些性能問題(和 不同的執行計劃)有時嗎?

有點在我的第一個答案中解釋了這一點,當你得到不同的執行計劃時,你是否運行相同的查詢?每個不同的查詢都會生成一個不同的執行計劃,即使在查詢結尾添加一個額外的空白區域也會生成一個新的空間。