2015-10-14 94 views
0

我有以下SQL優化SQL MS SQL Server中,表中

SELECT Cast(Format(Sum(COALESCE(InstalledSubtotal, 0)), 'F') AS MONEY) AS TotalSoldNet, 
     BP.BoundProjectId            AS ProjectId 
FROM BoundProducts BP 
WHERE (BP.IsDeleted IS NULL 
      OR BP.IsDeleted = 0) 
GROUP BY BP.BoundProjectId 

我已經在此列順序表BoundProducts的指數收益超過90%的記錄(BoundProjectId,請將isDeleted)

目前這個查詢大約需要2-3秒才能返回結果。我試圖將其降低到零秒。

截至目前,該查詢返回25077行。

請爲我提供即興查詢的任何想法。

enter image description here

enter image description here

+0

25077行是相當大的一塊數據。我認爲你可能無法進一步調整。 – Mithrandir

+0

如果我提到過濾條件爲BP.IsDeleted = 0而不是(BP.IsDeleted爲null或BP.IsDeleted = 0)。我可以看到有一個索引搜索,但不幸的是我不能這樣做,因爲我也有空值的記錄。 – StackUser

+2

您仍然獲取超過90%的數據?就像我上次所說,掃描將比尋找更快:http://stackoverflow.com/questions/32971763/performance-tuning-sql/32973346#32973346 –

回答

0

如果你真的想嘗試索引查找,應該可以使用查詢提示forceseek,但我不認爲這會讓它更快了。

我建議last time仍然有效的選項,刪除格式和/或創建索引視圖。

您還應該測試,如果問題是查詢本身或只顯示後的結果,例如使用「SELECT ... INTO #tmp」嘗試它。如果這很快,那麼問題不在於查詢。

截圖中的索引名稱與create table語句中的索引名稱不同,但我認爲這只是您爲該問題更改的名稱。如果掃描發生在另一個索引上,那麼你也應該包含它。

+0

我用Forceseek試過但我得到錯誤「由於查詢中定義的提示,查詢處理器無法生成查詢計劃......」 – StackUser

+0

也許吧只適用於聯接的情況,而不是如果你只是從單個表中獲取 –

1

在有點不同的角度看這個問題,我可以認爲你或狀況是搞砸了您的查詢,爲什麼不重寫它這樣的嗎?

SELECT CAST(FORMAT(SUM(COALESCE(BP.InstalledSubtotal, 0)), 'F') AS MONEY) AS TotalSoldNet 
    , BP.BoundProjectId AS ProjectId 
FROM (
    SELECT BP.BoundProjectId, BP.InstalledSubtotal 
    FROM dbo.BoundProducts AS BP 
    WHERE BP.IsDeleted IS NULL 

    UNION ALL 

    SELECT BP.BoundProjectId, BP.InstalledSubtotal 
    FROM dbo.BoundProducts AS BP 
    WHERE BP.IsDeleted = 0 
    ) AS BP 
GROUP BY BP.BoundProjectId; 

我有更好的體驗與UNION ALL而非OR

我認爲它應該完全一樣。最重要的是,我會創建這個索引:

CREATE NONCLUSTERED INDEX idx_BoundProducts_IsDeleted_BoundProjectId_iInstalledSubTotal 
    ON dbo.BoundProducts (IsDeleted, BoundProjectId) 
    INCLUDE (InstalledSubTotal); 

它應該滿足您的查詢條件並且尋找索引相當好。我知道索引位字段不是一個好主意,但值得嘗試。

P.S.爲什麼不把你的IsDeleted列值默認爲0,並使它NOT NULLABLE?通過這樣做,它應該足以做一個簡單的檢查WHERE IsDeleted = 0,這也會提高你的查詢。

+0

如果你寫了BP.IsDeleted <> 1它將排除NULL值的行 – Galma88

+1

@ Galma88感謝您的位置,我已經改變了我的回答,希望現在是正確的。 –