|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : février 2011 Messages : 1 ![]() |
Bonjour,
Ma requête initiale : Code :
Code :
Question 1 : Est-il possible que lorsque madate1 et madate2 sont nulles, le test suivant soit FAUX ? Code :
ISNULL(madate1,GETDATE())=ISNULL(madate2,GETDATE()) Merci pour vos réponses. |
||||
|
|
00
|
|
|
#2 | ||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Pour la question 1, la réponse est non. Si madate1 est null, et madate2 est null, alors la comparaison revient à : ce qui sera toujours vrai (la fonction GETDATE() est évaluée une seule fois par le moteur, et aura toujours la même valeur, même si ta requete mets plusieurs secondes à s'exécuter, car je crois que c'était le fond de ta question Pour la seconde question, le fait d'utiliser OR dans ton filtre empêche le le moteur de tirer parti des index. De façon générale, il vaut mieux écrire : Code sql :
Code sql :
|
||||
|
|
00
|
|
|
#3 |
![]() ![]() |
Vous généralisez un peu trop quand même, ce que vous dites est vrai sur des conditions complexes combinées par des OR, mais sûrement pas dans le cas de figure que vous exposez où l'emploi du OR (ou d'un IN) se justifie pleinement.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#4 |
|
Membre du Club
![]() Inscription : mars 2002 Messages : 52 ![]() |
Bonjour,
utiliser l'opérateur OR n'interdit en rien de solliciter un index. Une simple consultation du plan d'exécution de vos requête pourra vous en convaincre. Je vous conseille de vous documenter : 1- structure des indexes 2- fonctionnement de l'optimiseur SQL Server Le fonctionnement est bien compliqué. Aussi optimiser une requête ne dois pas relever du hasard. @+ |
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Effectivement un OR est souvent "transformé" en UNION ALL automatiquement et de manière transparente par SQL Server, afin de bénéficier des index s'il y en a....
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Surtout qu'en relisant de plus près, dans la requete de chouffe59, il s'agit de comparer deux colonnes de la même table, ma requete engendrera donc même sans doute deux scans de la table... Citation:
![]() "plus on rate, plus on a de chance de réussir..." ![]() Merci pour le scoop en tout cas ! @chouffe59 : Qu'est-ce qui te fait dire que ta deuxième requete est plus rapide ? Si tu les exécutes l'une après l'autre, il est possible que la deuxième requête "semble" plus rapide car les données ont été mises en cache lors de la première, ce qui fausse les résultats si tu ne te bases que sur le temps de réponse de la requête... |
||
|
|
00
|
|
|
#7 | |
|
Membre du Club
![]() Inscription : mars 2002 Messages : 52 ![]() |
Citation:
L'éventualité d'un balayage d'index n'est pas à éliminer. Il n'y aura pas forcément de table scan. Tous est fonction de l'indexation, de l'état des statistique calculées, de la volumétrie, etc. Par exemple sur une table de très faible volumétrie, le table scan est souvent privilégié à un index scan. Ce n'est qu'une question de coût et de choix de l'optimiseur. @+ |
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Je ne l'élimine pas...
bien sûr, si un index adéquat existe, le balayage pourra être effectué sur cet index plutôt que sur la table, mais cela restera un balayage. Je faisais simplement remarquer que dans le cas de la requete de chouffe59, UNION ALL, ne permettrait effectivement pas une recherche d'index (ce qui était le but de l'UNION ALL que je proposait initialement, mais ça, je pensais que vous l'aviez compris...) mais qu'il s'agirait bien de balayage, et que ce balayage pourrait en plus avoir lieu deux fois, ce qui au final pourrait être pire que mieux... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com