2010-10-27 170 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