2012-02-01 27 views
0

我有一個SQL查詢包含一個derieved表。帶有派生表的SQL查詢 - 性能問題

派生的查詢看起來是這樣的:

SELECT 
    ObjectId, MIN(StatusHistoryId) AS FirstStatusHistoryId 
FROM 
    dbo.StatusHistory 
WHERE 
    ObjectType = 'SchemeTypeApplication' 
    AND (StatusId = 504 OR StatusId = 501) 
    AND IsDeleted = 0  
GROUP BY 
    ObjectId 

這需要大約2分鐘來完成它自己,它拉回來近30萬行。整個查詢(這裏面)大致相同。沒有派生表,它只需要不到一秒鐘的時間,所以我知道這是造成問題的問題。

我的問題是,有無論如何提高dereived表查詢的速度?也許增加一些索引到StatusHistory表(我有點垃圾索引...)?或者使用派生表以外的其他方法?

任何建議表示讚賞。

感謝

+0

有在您的文章沒有導出查詢,只有一些布爾代數。您還應該首先在您的where子句中放置限制性最強的列。例如,如果您知道只有3條記錄的狀態被刪除,並且有100萬條記錄的對象類型爲schemetypeapplication,那麼您應該將刪除的狀態作爲您的開始位置。優化器可能會選擇它,特別是如果它是sql server,但它肯定值得注意。 – JonH 2012-02-01 15:54:23

+2

猜猜該學習索引了,如果要編寫數據庫查詢,就沒有理由「垃圾索引」。 – HLGEM 2012-02-01 16:22:35

+0

@JonH,我沒有發佈整個查詢,因爲它太大了。帖子中的查詢是沒有外部查詢的派生查詢 - 如果這是有道理的。 – Jamie 2012-02-01 16:27:15

回答

1

正如JonH指出的那樣,根據WHERE標準擴展索引並獲得基於預期結果的最小粒度的關鍵元素......如果是「字符串」,字符串的「ObjectType」可能會更好地優化更多的是一個可比的文本整數值的基礎。至於粒度。哪個會返回最少量的記錄...狀態ID是501和504(通過您的OR條件)相比「SchemeTypeApplication」的對象類型。如果501有50,000條記錄,504條記錄有30,000條記錄,但是「SchemeTypeApplication」有475,000條記錄,我會首先在狀態標識上索引我的索引,反之亦然,反之亦然......讓索引遍歷80,000條記錄,許多475,000個對象類型分別是501和504,大概是5萬個,你就完成了。是的,您的原始評論指的是返回約300k行,但這僅僅是根據您的查詢通常如何使用而確定優化索引技術的示例。所以,我想對像指數

(statusID,對象類型,請將isDeleted,對象ID)

+0

@Jamie,最近接受了答案,我只是好奇你的修改後的表/索引/查詢正在執行的性能。 – DRapp 2012-03-14 13:04:07

1

見我的評論上面 - 如果沒有一個已上你也可以引入對StatusID領域的指標。嘗試按照可以返回多少條記錄的順序,將更多限制性的列放在WHERE子句中。