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