2010-10-27 3 views
1

В настоящее время я обновляю сервер базы данных с SQL Server 2000 до SQL Server 2008 R2. Один из моих запросов использовался для запуска в течение секунды, и теперь он занимает более 3 минут (работает на более быстрой машине).Проблема SQL-запроса при обновлении с SQL Server 2000 до SQL Server 2008 R2

Я думаю, что я обнаружил, что это происходит неправильно, но не почему это происходит неправильно. Может ли кто-нибудь объяснить, в чем проблема, и как я могу ее решить?

Сокращенный код выглядит следующим образом:

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 строки, которые я ожидаю менее чем за секунду.

Может ли кто-нибудь указать мне в правильном направлении, почему это происходит и когда это изменение произошло?

Большое спасибо заранее

Джонатан


Я принял решение Алекса и включал в себя новую версию кода. Похоже, что мы нашли 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: спасибо за редактирование –

ответ

3

Попробуйте реструктуризации запрос с помощью КТР и 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