L'exemple de code dans cet élément de connexion
Affiche un bug où
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Renvoie les résultats corrects. Mais ce qui suit renvoie des résultats incorrects (en 2014 en utilisant le nouvel estimateur de cardinalité)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Comme il charge de manière incorrecte les résultats pour L2 dans une bobine de sous-expression commune, puis relit le résultat de celui pour le résultat L1.
J'étais curieux de savoir pourquoi la différence de comportement entre les deux requêtes. L'indicateur de trace 8675 montre que celui qui fonctionne entre search(0) - transaction processing
et celui qui échoue entre search(1) - quick plan
.
Je suppose donc que la disponibilité de règles de transformation supplémentaires est à l'origine de la différence de comportement (la désactivation de BuildGbApply ou GenGbApplySimple semble le corriger par exemple).
Mais pourquoi les deux plans pour ces requêtes très similaires rencontrent-ils différentes phases d'optimisation? D'après ce que j'ai lu, il search (0)
faut au moins trois tableaux et cette condition n'est certainement pas remplie dans le premier exemple.
la source