CAST(DATETIME DATE) au cours de la clause where
Je suis à l'aide de SQL Server 2012 et je voudrais savoir si j'écris la phrase:
SELECT MyDateTimeColumn
FROM MyTable
WHERE CAST(MyDateTimeColumn AS DATE) = '2014-07-09'
est un ralentissement de la façon de couper à la fois sur les colonnes DATETIME, j'ai cherché mais je ne trouve rien à propos de cette stricte phrase et je ne sais pas comment montrer qu'pale statistiques sur les temps de cast/convertir à la sonde de moi-même.
Plus lent que quoi? Avez-vous une autre méthode pour la comparer? Le temps passé dans la
Toute fonction appliquée à une colonne de la colonne non SARGABLE. Ainsi, vous ne pouviez pas utiliser un index. Pourquoi ne pas l'utiliser OÙ MyDateTimeColumn >= '20140709" et MyDateTimeColumn < '20140710' ??
Utilisation des fonctions dans une clause where est généralement une mauvaise idée, si elle peut être évitée
BTW, qu'est-ce que vous demandez? :p
Je suis à la recherche d'un coffre-fort/moyen rapide de couper la fois sur des colonnes DATETIME, c'est mon approche au plus bas? est-il plus rapide/moyen plus sûr?
CAST
fonction sera très probablement insignifiant en comparaison avec les IO en temps et heure de la requête dans son ensemble. Êtes-vous certain que le CAST
est un goulot d'étranglement ou êtes-vous juste deviner?Toute fonction appliquée à une colonne de la colonne non SARGABLE. Ainsi, vous ne pouviez pas utiliser un index. Pourquoi ne pas l'utiliser OÙ MyDateTimeColumn >= '20140709" et MyDateTimeColumn < '20140710' ??
Utilisation des fonctions dans une clause where est généralement une mauvaise idée, si elle peut être évitée
BTW, qu'est-ce que vous demandez? :p
Je suis à la recherche d'un coffre-fort/moyen rapide de couper la fois sur des colonnes DATETIME, c'est mon approche au plus bas? est-il plus rapide/moyen plus sûr?
OriginalL'auteur Ivanzinho | 2014-07-09
Vous devez vous connecter pour publier un commentaire.
Dans SQL 2008+,
CAST(foo AS date)
est sargable, avec quelques autres manipulations. Regardez les plans d'exécution dans le sqlfiddle.SQL Violon Démo
il fait, mais il faut un peu de charge-les 30 secondes
sargable
?? Qu'est-ce que cela signifie?OriginalL'auteur Anon
Donc, permet d'utiliser Anon exemple. Je l'ai changé pour avoir à la fois une Clé Primaire sur un numéro de ligne et Non de l'index Cluster sur la date.
Aussi, j'ai choisi de créer aléatoire dates au lieu d'une simple mise à jour incrémentielle.
Voici le code ci-dessous pour créer la base de données de test.
Maintenant, permet de jeter un coup d'oeil à chaque solution. Les avantages et les inconvénients.
Je vais utiliser des indicateurs de trace de regarder la requête algébrique arbre d'analyse ainsi que le plan de requête.
Solution 1: analyse d'Index qui est mauvais et doit appliquer la conversion à la date de chacun de champ.
Solution 2: Indice de chercher ce qui est bon et pas de conversion à la date de champ. Cependant, culturel format de date spécifique.
Solution 3: Indice de chercher ce qui est bon et pas de conversion à la date de champ. Cependant, vous devez convertir la date en entier.
Solution 4: Indice de chercher ce qui est bon et pas de conversion à la date de champ. La Date est culturel (pays) neutre format. La meilleure solution!
Solution 5: Indice de chercher ce qui est bon. S'applique de conversion à la date de chacun de champ qui est mauvais. Culturel spécifique de la date de la constante. Le plus compliqué, plan de requête.
En résumé, l'utilisation de la solution 4, qui tire parti de l'indice et n'est pas culturel spécifique.
À l'aide de cast() n'est pas une bonne suggestion. Il utilise l'index, mais plus de temps passé sur la conversion de chaque valeur de l'indice au cours de la comparaison.
Note à moi-même, assurez-vous que j'explique en détail ce que je veux dire.
Voici quelques bonnes lectures sur le sujet!
Références - Tout sur les dates.
http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes
De référence - Aaron suggestions sur la date d'utilisation.
https://sqlblog.org/2009/10/16/bad-habits-to-kick-mis-handling-date-range-queries
Qu'est-ce que SARGABLE.
http://en.wikipedia.org/wiki/Sargable
OriginalL'auteur CRAFTY DBA
Utiliser cette méthode éprouvée pour "zéro" de la composante temporelle d'un datetime:
Éviter de jeter pour différents types date si il y a un moyen plus rapide (comme l'astuce ci-dessus), et certainement essayer d'éviter d'utiliser les littéraux de chaîne pour les dates sans les envelopper dans une CONVERTIR() pour vous assurer que votre format de chaîne de caractères sera interprété correctement.
Si vous avez des problèmes de rendement et veulent le forcer à utiliser un index, je vous suggère d'ajouter une colonne de type
date
(remplir avec la valeur de la colonne moins le temps de la partie), et de l'index/la recherche sur ce, ou de créer une vue indexée qui accomplit la même chose.OriginalL'auteur SlimsGhost