La première chose que je voudrais dire, c'est que ce n'est pas exactement ce que j'essaie d'atteindre. J'ai beaucoup abouti à cette requête beaucoup pour que ma question se pose plus clairement.
J'ai un index non clusterné sur une table (CallDetail) sur deux valeurs, Termindate (int) et SourceSystemid (int). Pour être complet, je comprendrai la définition précise de l'indice ici: P>
DECLARE @TermDate AS INT SET @TermDate = 1101221 SELECT * FROM CallDetail WHERE CallDetail.TermDate >= @TermDate AND SourceSystemID = 1
3 Réponses :
mise à jour em> Compte tenu des commentaires, je suis exclu. Vous dites que vous avez abouti aux détails pour expliquer le problème, il est possible que certains de ces détails causent le problème. Voyons-vous les mêmes problèmes avec les exemples exacts que vous affichez ci-dessus? P> J'ai vu des requêtes plus compliquées contenant de moulage ou de convertir avoir des problèmes similaires - est-ce une des choses que vous avez gênées? p> ou peut-être que le paramètre reniflant alors que Marc suggère. p> réponse originale em> p> Ceci est dû au fait que cela doit lancer chaque valeur Dans la table des colonnes pour taper Int (la colonne Terminaté doit être autre chose.) P> Dans la première requête, l'optimiseur est intelligente et sait qu'il peut lancer la constante sur le type de colonne et le fait. P> En outre, il ne peut pas utiliser l'index quand il doit être coulé pour chaque ligne. p> changer cette ligne p> Au même type que la colonne et vous serez heureux. P> p>
Bonjour Hogan, Termdate est de type INT dans la table.
Vous êtes très probablement souffrant de paramètre reniflant < / a> et ici < / a>. p>
Pouvez-vous comparer les plans de requête pour vos deux questions? Celui avec la valeur fixe contre celle avec le paramètre? Est-ce qu'ils vous donnent le même plan d'exécution actuel? p>
N'oubliez pas de faire un «nettoyage» approprié et émettre dbcc libresProctacaccaché code> entre les courses de sorte que les deux ne s'influencent pas ... p>
Je pensais que cela pourrait être un paramètre reniflant, mais la façon dont il décrit le problème qui n'a pas de sens ...
Ceci est 100% correct. Je vois le même comportement que l'OP. J'ai eu une requête SELECT * de MyTable où MYROW> 12972100 CODE> et j'ai 1 plan. Quand j'ai changé le numéro à 2, j'ai eu un plan différent. Cependant, lorsque j'utilise une variable, le deuxième plan est toujours utilisé!
OK, j'ai reproduit la situation avec ma requête: Après avoir lu sur le message par Marc_s, j'ai fait ceci: P> declare @a as int
set @a = 12972100
select * from MyTable where (MyColumn > @a) option (recompile)
@Christophaler Haws, lisez l'article Marc_s posté sur le paramètre reniflant et vous comprendrez.
Quel est le type de données de la colonne Terminez-vous?
@Lamak: La post de l'OP dit Termindate (int) i> (deuxième paragraphe, première ligne)
Voyons la définition de la table entière alors.
J'ai vérifié ce comportement sur mon propre serveur. J'ai une table avec 12 000.324 enregistrements qui possède un indice non groupé sur un entier. J'ai fait la même chose et ma requête est allée de <1 seconde à 51 secondes. Remarque: SQL Server 2008 R2