2010-10-27 184 views
1

我目前正在將數據庫服務器從SQL Server 2000升級到SQL Server 2008 R2。我的一個查詢以前需要一秒鐘才能運行,現在需要超過3分鐘(使用更快的機器運行)。從SQL Server 2000升級到SQL Server 2008 R2時出現SQL查詢問題

我想我已經找到了它出錯的地方,但沒有找到錯誤的原因。有人可以解釋問題是什麼以及我如何解決它?

刪節的代碼如下:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

... 

FROM 
    Registrar reg 
    JOIN EnabledType et ON et.enabledTypeCode = reg.enabled 
    LEFT JOIN [Transaction] txn ON txn.registrarId = reg.registrarId 
WHERE  
    txn.transactionid IS NULL OR 
    txn.transactionid IN 
    (
    SELECT MAX(transactionid) 
    FROM [Transaction] 
    GROUP BY registrarid 
) 

我相信這個問題是位於「txn.transactionid爲空或」線。如果我刪除這個條件,它會像以前那樣運行(不到一秒),並返回所有記錄減去該語句將包含的3行。如果我刪除了OR語句的第二部分,它將返回我預期在不到一秒鐘內的3行。

有人可以指出我正確的方向,爲什麼會發生這種情況,當這種變化發生?

提前

喬納森


非常感謝我已經接受了Alex的解決方案,其中包括代碼的新版本。看來,我們發現新查詢優化器運行速度較慢的查詢只有0.1%。

WITH txn AS ( 
    SELECT registrarId, balance , ROW_NUMBER() OVER (PARTITION BY registrarid ORDER BY transactionid DESC) AS RowNum 
    FROM [Transaction] 
) 
SELECT 
    reg.registrarId, 
    reg.ianaId, 
    reg.registrarName, 
    reg.clientId, 
    reg.enabled, 
    ISNULL(txn.balance, 0.00) AS [balance], 
    reg.alertBalance, 
    reg.disableBalance, 
    et.enabledTypeName 
FROM 
    Registrar reg 
    JOIN EnabledType et 
     ON et.enabledTypeCode = reg.enabled 
    LEFT JOIN txn 
     ON txn.registrarId = reg.registrarId 
WHERE 
    ISNULL(txn.RowNum,1)=1 
ORDER BY 
    registrarName ASC 
+0

@marc_s:感謝編輯 – 2010-10-27 14:13:33

回答

3

嘗試利用重組的CTE和ROW_NUMBER查詢...

WITH txn AS (
    SELECT registrarId, transactionid, ... 
     , ROW_NUMBER() OVER (PARTITION BY registrarid ORDER BY transactionid DESC) AS RowNum 
    FROM [Transaction] 
) 
SELECT 
    ... 
FROM 
    Registrar reg 
    JOIN EnabledType et ON et.enabledTypeCode = reg.enabled 
    LEFT JOIN txn ON txn.registrarId = reg.registrarId 
     AND txn.RowNum=1 
相關問題