SQL Server insérant grand nombre de lignes à un tableau avec des valeurs par défaut et de l'identité de ses colonnes
J'ai besoin d'insérer sur 6400000 les lignes d'une table avec 2 colonnes
CREATE TABLE [DBName].[DBO].[BigList]
(
[All_ID] [int] identity(1,1) NOT NULL,
[Is_It_Occupied] [int] default(0) not null
)
Je suis en utilisant le code suivant aujourd'hui, qui est très longue d'environ 100 minutes.
SET @NumberOfRecordsToInsert = 6400000;
WHILE (@NumberOfRecordsToInsert > 0)
BEGIN
INSERT [DBName].[DBO].[BigList] DEFAULT VALUES;
SET @NumberOfRecordsToInsert = @NumberOfRecordsToInsert - 1
END
Quelqu'un aurait-il une meilleure façon de le faire?
Est-il un indice sur cette table?
Avez-vous envisagé de déclarer Is_It_Occupied que PEU?
Qu'en est FACTEUR de REMPLISSAGE de votre base de données?
Est la base de données assez grande pour contenir la table sans auto croissante au cours de l'insertion? Vous pouvez obtenir une augmentation de la performance par pré-allouer assez d'espace pour contenir les données (log) pour l'ensemble de la table, avant de commencer le processus d'insertion. Si vous surveillez le serveur (à l'aide de l'analyseur de performances, etc.) tandis que les insertions sont passe, vous pouvez regarder "journal de la croissance" et "base de données à grandir", les événements, etc. pour voir si elles se produisent trop souvent (et avoir une incidence défavorable de la performance).
Avez-vous envisagé de déclarer Is_It_Occupied que PEU?
Qu'en est FACTEUR de REMPLISSAGE de votre base de données?
Est la base de données assez grande pour contenir la table sans auto croissante au cours de l'insertion? Vous pouvez obtenir une augmentation de la performance par pré-allouer assez d'espace pour contenir les données (log) pour l'ensemble de la table, avant de commencer le processus d'insertion. Si vous surveillez le serveur (à l'aide de l'analyseur de performances, etc.) tandis que les insertions sont passe, vous pouvez regarder "journal de la croissance" et "base de données à grandir", les événements, etc. pour voir si elles se produisent trop souvent (et avoir une incidence défavorable de la performance).
OriginalL'auteur Naresh | 2013-12-01
Vous devez vous connecter pour publier un commentaire.
Se saisir de 6400000 lignes à partir de quelque part et de les insérer tous à la fois.
Fait quelques tests sur combien de temps les différentes solutions a pris sur mon ordinateur.
OriginalL'auteur Mikael Eriksson
Votre principal problème est que chaque instruction est exécutée dans une transaction distincte. Mettre le tout dans une transaction n'est pas recommandée, car de très grandes opérations de créer leurs propres problèmes.
Mais le plus gros goulot d'étranglement dans votre code sera le I/O sur le journal des transactions. Le code suivant permet d'atteindre un 14 MO/s global de la vitesse d'écriture sur mon ordinateur Portable (un Samsung SSD 840) et s'exécute en 75 secondes:
OriginalL'auteur TToni
Pourquoi n'utilisez-vous pas ceci:
dans SQL Server Management STudio, ce sera exécuter la commande autant de fois que vous spécifiez dans la
GO xxxx
déclarationMais tout de même: l'insertion de plus de 6 millions de lignes prendra un peu de temps!
eh bien: ce version de SQL Server et qui edition (Express, Web, Standard, etc.) utilisez-vous? Avez-vous entrez dans une nouvelle requête vide de la page? Ou avez-vous juste mettre en évidence ces deux lignes pour les exécuter? Il fonctionne très bien pour moi - SQL Server 2008 R2 ou 2012, Éditions de développement.
SQL Server 2008. Aussi, encore une fois, j'ai de l'utilisation de cette instruction dans une procédure stockée. Donc, probablement ALLER n'est pas une meilleure option pour moi.
il ne fonctionne pas à l'intérieur d'une procédure stockée, depuis
GO
est pas un mot clé SQL - SQL Server Mgmt Studio spécifiques délimiteur. Il fonctionne très bien si vous l'exécutez en Mgmt Studio (vous n'avez jamais mentionné quoi que ce soit à propos de ce code à exécuter à l'intérieur d'une procédure stockée!)ceux qui sont défini sur cette table, vous pouvez définir des valeurs par défaut pour chaque colonne de votre tableau de définition - ou si aucun n'est spécifié, SQL Server utilise ses propres paramètres par défaut (comme 0 pour un
int
colonne, etc.) pour chaque colonneOriginalL'auteur marc_s
Vous pouvez essayer quelque chose comme cela, cela m'a pris moins de temps que l'exécution de votre requête:
Espère que cela aide
OriginalL'auteur Milica Medic
OriginalL'auteur Mihai Bejenariu