6
votes

Pourquoi mon énoncé SQL prend-il à N fois plus longtemps pour exécuter lorsque je définirai une valeur comme une variable?

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


4 commentaires

Quel est le type de données de la colonne Terminez-vous?


@Lamak: La post de l'OP dit Termindate (int) (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


3 Réponses :


1
votes

mise à jour

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?

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?

ou peut-être que le paramètre reniflant alors que Marc suggère.


réponse originale

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.)

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.

En outre, il ne peut pas utiliser l'index quand il doit être coulé pour chaque ligne.

changer cette ligne xxx

Au même type que la colonne et vous serez heureux.


1 commentaires

Bonjour Hogan, Termdate est de type INT dans la table.




6
votes

OK, j'ai reproduit la situation avec ma requête: XXX PRE>

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)


1 commentaires

@Christophaler Haws, lisez l'article Marc_s posté sur le paramètre reniflant et vous comprendrez.