2014-11-16 133 views
0

我是新來的,不得不管理我們的sqlserver數據庫。得到了這個請求。sql server 2008緩慢查詢總和

我有一個有100萬條記錄的大表。想運行這個報告。它使用SQL Server 2008需要花費一個多小時。

Rowid是PK,並且在dx和varcharfield上有一個索引。

SELECT T1.VarcharField, 
     T1.DX, 
     T1.ROWID, 
     (SELECT Sum(t2.QC) AS Total 
     FROM tbl t2 
     WHERE T2.VarcharField = T1.VarcharField 
       AND t2.dx <= t1.dx) AS Total 
FROM tbl AS T1 
+2

這種計算運行總計的方法不會擴展到100萬行。 –

回答

0

我認爲這會跑得更快:

SELECT 
    T1.VarcharField, 
    T1.DX, 
    T1.ROWID, 
    SUM(t2.QC) AS Total 
FROM 
    tbl t2 
    JOIN tb1 T1 ON T2.VarcharField = T1.VarcharField 
GROUP BY 
    T1.VarcharField, 
    T1.DX, 
    T1.ROWID 
WHERE 
    t2.dx <= t1.dx 
+1

它會有與OP相同的問題。問題在於1,000,000個組平均每個「SUM」500,000個值。總共有5000億個值被總結。 –

+0

我沒有嘗試,但可能刪除where子句並將該條件放入連接有助於提高速度。 –

+0

我在想,表達爲子選擇的SUM會比分組查詢更直接的方法慢。 – JohnS

2

這是所有在SQL Server更容易2012

SELECT T1.VarcharField, 
     T1.DX, 
     T1.ROWID, 
     SUM(QC) OVER (PARTITION BY VarcharField ORDER BY DX) AS Total 
FROM tbl AS T1 

如你在2008年和上面的語法不你可以嘗試添加這個索引

CREATE INDEX ix ON tbl(VarcharField,DX) INCLUDE (ROWID, QC) 

然後使用以下查詢

WITH RecursiveCTE 
    AS (SELECT VarcharField, 
       DX, 
       ROWID, 
       QC, 
       QC AS Total 
     FROM (SELECT *, 
         ROW_NUMBER() OVER (PARTITION BY VarcharField ORDER BY DX) AS RN 
       FROM tbl) T 
     WHERE RN = 1 
     UNION ALL 
     SELECT R.VarcharField, 
       R.DX, 
       R.ROWID, 
       R.QC, 
       R.Total 
     FROM (SELECT T.*, 
         T.QC + Total AS Total, 
         rn = ROW_NUMBER() OVER (ORDER BY T.DX) 
       FROM tbl T 
         JOIN RecursiveCTE R 
          ON R.VarcharField = T.VarcharField 
          AND R.DX < T.DX) R 
     WHERE R.rn = 1) 
SELECT VarcharField, 
     DX, 
     ROWID, 
     Total 
FROM RecursiveCTE 
OPTION (MAXRECURSION 0); 
+0

這是什麼工作。我加了上面的索引。 CREATE INDEX IX ON TBL(VarcharField,DX)INCLUDE(ROWID,QC) 選擇T1.VarcharField,T1.DX,t1.rowid, \t總計= \t \t( \t \t \t SELECT SUM(t2.QC )AS總共TBL T2 \t \t \t WHERE t2.VarcharField = T1.VarcharField \t \t \t而t2.dx <= t1.dx \t \t \t和t2.rowid = t1.rowid \t \t) FROM tbl AS T1 ORDER BY DX,VarcharField,rowid – kdigman

+0

@kdigman添加't2.rowid = t1.rowid'會顯着改變語義。 –