La réponse, comme d'habitude (d'accord, la plupart du temps), réside dans le plan d'exécution.
Certains opérateurs exigent que toutes les lignes leur parviennent avant de pouvoir commencer à traiter ces lignes et à les transmettre en aval, par exemple:
- Hash Join (pour construire la table de hachage)
- Match de hachage
- Trier (sauf flux de hachage distinct)
Ils sont appelés bloqueurs ou opérateurs stop and go pour cette raison, et ils sont souvent choisis lorsque l'optimiseur pense qu'il va falloir traiter de nombreuses données pour retrouver vos données.
Il existe d'autres opérateurs capables de commencer la diffusion en continu ou de transmettre immédiatement les lignes trouvées.
- Boucles imbriquées
- Index pris en charge les jointures de fusion
- Agrégats de cours d'eau
Lorsque les requêtes commencent à renvoyer des données immédiatement, mais ne se terminent pas immédiatement, cela indique généralement que l'optimiseur a choisi un plan pour localiser et renvoyer rapidement certaines lignes à l'aide d'opérateurs présentant un coût de démarrage moins élevé.
Cela peut arriver à cause d'objectifs de lignes que vous avez définis ou que vous avez optimisés.
Cela peut également arriver si un mauvais plan est choisi pour une raison quelconque (manque de SARGability, détection de paramètre, statistiques insuffisantes, etc.), mais cela prend plus de temps à comprendre.
Pour plus d'informations, consultez le blog de Rob Farley ici
Et la série de Paul White sur les buts alignés ici , ici , ici et ici .
Il convient également de noter que, si vous parlez de SSMS, les lignes n'apparaissent qu'une fois le tampon complet rempli, et pas seulement à volonté.
WHERE t.x IN (<complex SELECT subquery>)
, l'équivalent LEFT JOIN,LEFT JOIN (<complex SELECT subquery>) AS r ON r.x = t.x .... WHERE r.x IS NULL
la sous-requête doit également être évaluée (le même plan complexe avec le paramètre NOT Version IN).NOT EXISTS
OracleNOT IN
dans les requêtes. Mais aujourd'hui, cela doit être considéré comme une erreur dans le générateur de plans