2016-11-09 39 views
0

海蘭傢伙,簇索引的小桌子

我繼承了下表和數據庫只有200行:

CREATE TABLE [MyTable](
    [Id] [uniqueidentifier] NOT NULL, 
    [Name] [varchar](255) NULL, 
    [Value] [varchar](8000) NULL, 
    [EffectiveStartDate] [datetime] NULL, 
    [EffectiveEndDate] [datetime] NULL, 
    [Description] [varchar](2000) NOT NULL DEFAULT (''), 
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

正如你可以看到有一個羣集的PK上唯一標識符列。我在做一些性能檢查,到目前爲止(CPU和IO)最昂貴的查詢如下:

SELECT @Result = Value 
FROM MyTable 
WHERE @EffectiveDate BETWEEN EffectiveStartDate AND EffectiveEndDate 
AND [email protected] 

上述查詢被封裝在一個UDF,通常的UDF不叫在選擇列表中或在子句,而是它的返回通常被分配給一個變量。

執行計劃顯示了一個聚集索引掃描

我們的系統是基於在大量實時聚合和數學處理的。每次我們的Web應用程序刷新主頁面時,都會調用一堆存儲過程和UDF,上面的查詢每個用戶每次刷新運行約500次。

我的問題是:我應該將PK更改爲非聚簇,並在這樣一個小表中的Name,EffectiveStartDate,EffectiveEndDate上創建聚簇索引?

回答

1

不,你不應該。你可以只添加一個指數,這將涵蓋指數:

CREATE INDEX [IDX_Covering] ON dbo.MyTable(Name, EffectiveStartDate, EffectiveEndDate) 
INCLUDE(Value) 

如果@VariableName@EffectiveDate是變量與正確的類型,您現在應該看到索引查找。

我不確定這會有幫助,但您需要嘗試,因爲200行的索引掃描不算什麼,但調用500次可能是一個問題。順便說一下,如果這200行是在一個頁面,我懷疑這不會幫助。問題可能在其他地方,如打開連接500次或類似的東西...

+0

謝謝。這確實是我想象的。由於所有操作都是在數據庫內完成的,因此我沒有連接問題 –