2016-03-04 174 views
-1

我有一個報表,它是從我的數據倉庫中的各種事實表填充的。問題是,對於該報表中的一位客戶,需要46秒才能提取他的數據。該客戶有4232424條記錄。該表總共有5336393條記錄,並且有4列。我將發佈表結構和我正在運行的查詢。我需要將結果時間降低到儘可能低。我試過在內存表中,各種索引和索引視圖。在SQL Server 2014中的大表優化

表結構

CREATE TABLE cache.Tree 
(
CustomerID INT NOT NULL PRIMARY KEY NONCLUSTERED, 
RelationA_ID INT NOT NULL, 
RelationB_ID INT NOT NULL, 
NestedLevel INT NOT NULL, 
lft  INT NOT NULL, 
rgt  INT NOT NULL 
INDEX IX_LEGS CLUSTERED (lft, rgt), 
INDEX IX_LFT NONCLUSTERED (lft) 
) 

報表查詢

SELECT 
tp.CustomerID AS DLine, 
t.CustomerID, 
t.RelationA_ID, 
Level = t.NestedLevel - tp.NestedLevel, 
IndentedSort = t.lft 
FROM cache.UnilevelTreeWithLC2 tp 
    INNER JOIN cache.UniLevelTreeWithLC2 t 
    ON t.lft between tp.lft AND tp.rgt 
    WHERE tp.CustomerID = 7664 

任何幫助或指導將不勝感激。

更新1:查詢執行計劃 Query Execution Plan

更新2:解決 我能獲得許可,過濾掉在樹上不活躍的人。如果我保留我放在桌面上的索引,這幾乎將查詢執行的一半削減了。

+0

請發佈查詢計劃。我懷疑INDEX IX_LFT NONCLUSTERED(lft)沒有被使用。但與其他兩個指標應該涵蓋聯合和地點。你違反了指數? – Paparazzi

+1

您是否看過執行計劃和統計數據?我建議使用這些統計數據:'SET STATISTICS IO ON'' 'SET STATISTICS TIME ON',只記得關閉它們。請使用這些工具來比較您的查詢和索引更改,然後將問題與結果一起發佈。 – jkdba

+0

我懷疑任何索引都會幫助這裏說實話。你將返回530萬行中的420萬。這是表中總行數的80%。更大的問題是爲什麼你有一個顯示420萬行的報告? –

回答

1

嘗試forcescan - 對於抽取80%窄表的查詢,我希望SQL可以掃描,但它可能並不是因爲錯誤的統計信息或各種基數估計錯誤之一(它們是固定的,但需要使用traceflags來啓用) 。

我也會拋棄celko-sets - 一個parent_id col會使你的表更窄,這會加速這些吞吐量限制的情況,讓你左/右維護,並且用遞歸查詢非常快。