2010-10-27 18 views
1

Je suis en train de mettre à niveau un serveur de base de données SQL Server 2000 vers SQL Server 2008 R2. Une de mes requêtes prenait moins d'une seconde à s'exécuter et prend maintenant plus de 3 minutes (fonctionnant plus vite qu'une machine plus rapide). Je pense que j'ai trouvé où ça ne va pas, mais pas pourquoi cela ne va pas. Quelqu'un pourrait-il expliquer quel est le problème et comment je pourrais le résoudre?Problème de requête SQL lors de la mise à niveau de SQL Server 2000 vers SQL Server 2008 R2

Le code abrégé est la suivante:

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 
) 

Je crois que la question est situé sur la "txn.transactionid IS NULL OU" ligne. Si je supprime cette condition, elle s'exécute aussi rapidement qu'avant (moins d'une seconde) et renvoie tous les enregistrements moins les 3 lignes que cette instruction aurait incluses. Si je supprime la deuxième partie de l'instruction OR, elle renvoie les trois lignes auxquelles je m'attendrais en moins d'une seconde.

Quelqu'un pourrait-il me diriger dans la bonne direction pour expliquer pourquoi cela se produit et quand ce changement s'est produit?

Un grand merci à l'avance

Jonathan


J'ai accepté la solution d'Alex et inclus la nouvelle version du code. Il semble que nous ayons trouvé 0,1% de requêtes que le nouvel optimiseur de requête s'exécute plus lentement.

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: Merci pour l'édition –

Répondre

3

Essayez la requête de restructuration au moyen d'un CTE et 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