TSQL DateTime pour DateKey Int
Dans Mise à l'échelle Jusqu'à Votre Entrepôt de Données avec SQL Server 2008 R2, l'auteur recommande l'utilisation d'un nombre entier date clé dans le format AAAAMMJJ comme un index cluster sur vos tables de faits pour aider à optimiser la vitesse de requête.
Quel est le meilleur moyen de convertir votre clé champ de date à la Date de la Clé? Je sens que la suite pourrait fonctionner, mais il est un peu bâclée:
select Replace(CONVERT(varchar,GETDATE(),102),'.','')
Clairement, je ne suis pas en utilisant la fonction getdate, mais plutôt une date de colonne de la table qui sera utiliser dans mon agrégations.
D'abord, comment pourriez-vous suggérer de faire cette conversion? Est mon idée acceptable?
Seconde, quelqu'un a eu beaucoup de succès à partir de la Date de la Clé comme un index cluster?
Vous devez vous connecter pour publier un commentaire.
ISO longue (112) ferait l'affaire:
Casting getdate() directement à l'int de la norme ISO 112 donne 41008 pour une raison quelconque, mais passer par un VARCHAR semble fonctionner - je vais mettre à jour si je pense à une fonte plus rapide.
MODIFIER: En ce qui concerne l'int seulement vs varchar débat, voici mes conclusions (répétable sur mon banc d'essai & serveur de production) Varchar méthode utilise moins de temps processeur pour un demi-million de jette, mais une fraction plus lent globale négligeable, à moins que votre affaire avec des milliards de lignes
EDIT 2: mise à jour de cas de test pour effacer le cache et les différentes dates
SELECT CONVERT(INT, GETDATE(), 112), DATEDIFF(day,0,GETDATE())
Au lieu de créer un DateKey en utilisant le format AAAAMMJJ, vous pouvez utiliser le DATEDIFF fonction permettant d'obtenir le nombre de jours entre 0 (c'est à dire "la date représentée par 0") et la date de l'DateKey pour.
L'inconvénient est que vous ne pouvez pas facilement examiner la valeur et de fixer la date, mais vous pouvez utiliser le DATEADD fonction pour calculer la date d'origine (j'ai aussi vu ce truc tronquer le temps d'une partie d'un datetime).
(Note: 41007 est le résultat de la fonction DATEDIFF ci-dessus quand je l'ai couru sur 4/10/2012.)
La conversion de chaînes et de nouveau de retour peuvent être étonnamment lente. Au lieu de cela, vous pourriez faire face entièrement avec des entiers, comme ceci:
Dans mon bref essai, ce qui est légèrement plus rapide que la conversion de chaîne, puis à l'int. L'Année, le Mois et le Jour de la fonction de chaque retourne un entier, de sorte que la performance est légèrement mieux.