Quelle est la meilleure façon de créer et remplir un tableau de nombres Stack Overflow

voici quelques exemples de code prises à partir du Web et de réponses à cette question.

Pour chaque méthode, j'ai modifié le code d'origine de sorte que chaque utiliser la même table et de la colonne: NumbersTest et numéro, avec 10.000 lignes ou aussi près que possible. En outre, j'ai fourni des liens vers le lieu d'origine.

MÉTHODE 1 ici est une méthode de mise en boucle très lente d'ici
avg 13.01 secondes
ran 3 fois éliminés le plus, voici les temps en secondes: 12,42, 13,60

MÉTHODE 2 est ici une boucle d'ici beaucoup plus rapide
avg 1.1658 secondes
ran 11 fois enlevé le plus, voici les temps en secondes: 1.117, 1.140, 1.203, 1.170, 1.173, 1.156, 1.203, 1.153, 1.173, 1.170

MÉTHODE 3 Voici un INSERT basé sur le code d'ici
avg 488,6 millisecondes
ran 11 fois enlevé le plus, voici les temps en millisecondes: 686, 673, 623, 686.343.343.376.360.343.453

MÉTHODE 4 ici est une méthode « semi-boucle » d'ici avg 348,3 millisecondes (il était difficile d'obtenir un bon moment à cause de la « GO » au milieu du code, des suggestions seraient appréciés)
ran 11 fois enlevé le plus, voici les temps en millisecondes: 356, 360, 283, 346, 360, 376, 326, 373, 330, 373

MÉTHODE 5 est ici un INSERT de la réponse de Philip Kelley
avg 92,7 millisecondes
ran 11 fois enlevé le plus, voici les temps en millisecondes: 80, 96, 96, 93, 110, 110, 80, 76, 93, 93

MÉTHODE 6 est ici un INSERT de réponse Mladen Prajdic
avg 82,3 millisecondes
ran 11 fois enlevé le plus, voici les temps en millisecondes: 80, 80, 93, 76, 93, 63, 93, 76, 93, 76

MÉTHODE 7 est ici un INSERT basé sur le code d'ici
avg 56,3 millisecondes
ran 11 fois enlevé le plus, voici les temps en millisecondes: 63, 50, 63, 46, 60, 63, 63, 46, 63, 46

Après avoir examiné toutes ces méthodes, je vraiment Méthode 7, qui était le plus rapide et le code est assez simple aussi.

Si vous faites juste cela dans SQL Server Management Studio ou sqlcmd, vous pouvez utiliser le fait que le séparateur de lots vous permet de répéter le lot:

Ceci va insérer 100000 enregistrements dans la table des nombres.

Je commence par le modèle suivant, qui est dérivé de nombreuses impressions de la routine de Itzik Ben-Gan:

Le « où N<= 1000000" clause limits the output to 1 to 1 million, and can easily be adjusted to your desired range.

Étant donné que c'est une clause, il peut être travaillé dans une instruction INSERT. SÉLECTIONNER. ainsi:

L'indexation de la table après sa construction sera le meilleur moyen de l'indexer.

Oh, et je parler comme une table « Tally ». Je pense que c'est un terme commun, et vous pouvez trouver des tas de trucs et des exemples par googler.

Je fais la même chose avec des dates, ayant une table allant de 10 ans dans le passé 10 ans dans l'avenir (et des heures de la journée pour des rapports plus détaillés). Il est une astuce pour être en mesure d'obtenir des valeurs pour toutes les dates, même si vos tables de données « réelles » ne disposent pas de données pour eux.

J'ai un script que j'utiliser pour créer ceux-ci, quelque chose comme (ce qui est de la mémoire):

Le nombre de lignes double à chaque ligne de sorte qu'il ne prend pas beaucoup pour produire des tables vraiment énormes.

Je ne suis pas sûr que je suis d'accord avec vous qu'il est important de créer rapidement puisque vous créez seulement une fois. Le coût de cette est amorti sur tous les accès à ce, ce qui rend cette époque assez insignifiante.

répondit le 8 septembre '09 à 13h35

chaque commits; résultats dans Msg 3902, niveau 16, état 1, ligne 1 La requête COMMIT TRANSACTION n'a pas BEGIN TRANSACTION correspondante. - KM. 10 septembre 09 à 19h36

seulement 128 lignes insérées se - KM. 10 septembre 09 à 19h37

Certaines des méthodes proposées sont fondées sur la base des objets du système (par exemple sur les « sys.objects »). Ils sont en supposant que ces objets système contiennent suffisamment de dossiers pour générer nos numéros.

Comme solution, nous pouvons créer notre propre table avec des enregistrements. Nous utilisons ensuite que l'on place ces objets liés au système (table avec tous les numéros doivent être bien si nous savons que la gamme à l'avance sinon nous pourrions aller pour celui de faire la jointure croisée sur).

La solution CTE fonctionne bien, mais il a des limites liées aux boucles imbriquées.

Articles Liés