【问题标题】:SQL query problem when upgrading from SQL Server 2000 to SQL Server 2008 R2从 SQL Server 2000 升级到 SQL Server 2008 R2 时的 SQL 查询问题
【发布时间】:2011-05-01 08:27:10
【问题描述】:

我目前正在将数据库服务器从 SQL Server 2000 升级到 SQL Server 2008 R2。我的一个查询过去需要不到一秒钟的时间才能运行,现在需要超过 3 分钟(在更快的机器上运行)。

我想我已经找到了出错的地方,但没有找到出错的原因。有人能解释一下问题是什么以及如何解决吗?

节略代码如下:

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 IS NULL OR" 行。如果我删除此条件,它会像以前一样快(不到一秒)运行并返回所有记录减去该语句将包含的 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

【问题讨论】:

    标签: tsql null sql-server-2000 sql-server-2008-r2


    【解决方案1】:

    尝试使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 2011-11-20
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多