Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi cette sous-requête (non corrélée) cause-t-elle de tels problèmes ?

D'après mon expérience, plus vos requêtes sont complexes, moins l'optimiseur SQL est capable de créer des plans habiles. Ici, vous avez 16 jointures, certaines ou la plupart sont des jointures externes, vous avez au moins une sous-requête ... ajoutez suffisamment d'index, de cardinalités, de vues, d'applications externes et qui sait quoi d'autre et personne, pas même Microsoft ingénieurs*, peuvent déterminer des routines qui généreront uniformément et régulièrement les plans les plus optimaux.

Ce que vous avez décrit, je l'ai vécu à plusieurs reprises - changez une chose simple dans une requête désordonnée et tout est d'un ordre de grandeur plus rapide (ou, grince des dents, plus lent). Je n'ai aucune méthode pour déterminer si complexe est trop complexe, c'est plus un sentiment qu'autre chose. Ma règle d'or générale est que si cela semble trop long ou trop complexe, simplifiez là où vous le pouvez, comme votre valeur imbriquée unique présélectionnée, ou divisez une partie de la requête que ne le fera toujours exécuter rapidement avec un petit ensemble de résultats, et l'exécuter en premier et stocker les résultats dans une table temporaire.

( * Veuillez noter qu'il s'agit de sarcasme doux)