SQL Server et la matérialisation intermédiaire?

Après avoir lu cet article intéressant sur la matérialisation intermédiaire – j'ai encore quelques questions.

J'ai cette requête:

SELECT * FROM ... WHERE isnumeric(MyCol)=1 and ( CAST( MyCol AS int)>1) 

Cependant, l'ordre de clause where n'est pas déterministe.

Donc, je pourrais avoir une exception ici (s'il essaye d'abord de lancer "k1k1" )

Je suppose que cela va résoudre le problème

 SELECT MyCol FROM (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (MyCol ) > 1 ORDER BY MyCol ) bar WHERE CAST(MyCol AS int) > 100 
  • pourquoi est-ce que le fait de placer le top 100 + order change ma requête habituelle?

J'ai lu dans les commentaires:

(le résultat "intermédiaire" – en d'autres termes, un résultat obtenu au cours du process, qui sera utilisé pour calculer le résultat final) sera physiquement stocké ("matérialisé") dans TempDB et utilisé à partir de là pour le rest de l'user , au lieu d'être interrogé à partir des tables de base.

  • Quelle différence cela fait-il si elle est stockée dans tempDB ou interrogée à partir des tables de base? ce sont les mêmes données !

La manière prise en charge pour éviter les erreurs dues à la réorganisation de l'optimiseur consiste à utiliser CASE :

 SELECT * FROM YourTable WHERE 1 <= CASE WHEN aa NOT LIKE '%[^0-9]%' THEN CONVERT(int, aa) ELSE 0 END; 

La matérialisation intermédiaire n'est pas une technique supscope, elle ne devrait donc être utilisée que par des users très experts dans des circonstances particulières où les risques sont compris et acceptés.

TOP 100 PERCENT est généralement ignoré par l'optimiseur dans SQL Server 2005 et ultérieur.

En ajoutant la clause TOP dans la requête interne, vous obligez SQL Server à exécuter cette requête avant d'exécuter la requête externe, annulant ainsi toutes les lignes pour lesquelles ISNUMERIC renvoie la valeur false.

Sans la clause TOP, l'optimiseur peut réécrire la requête pour qu'elle soit identique à votre première requête.