Comment insérer une grande quantité d'enregistrements dans la base de données en peu de temps?

8

Je dois insérer un tas d'enregistrements ( 500 000 ) dans la base de données à la fois, en utilisant le moyen le plus rapide. J'ai essayé d'insérer 1 700 enregistrements à la fois mais cela a pris vingt minutes !! J'utilise SQL-SERVER, et C#.

Bien que le tableau suivant ne contribue pas à la technique d'insertion rapide, je décide de le lier de toute façon afin que vous compreniez mieux le nombre de champs que je dois insérer (le dupliquer d'environ 500 Ko ).

Les champs

Ori Ben Ezra
la source

Réponses:

12

Il existe plusieurs options. Voici les principaux qui me viennent à l'esprit.

SSIS - SQL Server Integration Services: il s'agit de l'outil SQL Server ETL et vous pouvez déplacer des données de pratiquement n'importe quelle source vers à peu près n'importe quelle destination et cela peut être assez rapide.

BCP - Programme de copie en bloc: il s'agit d'un outil de ligne de commande fourni avec SQL Server. Il est très bon pour déplacer des fichiers texte dans SQL Server ou vous pouvez exporter dans un format natif à partir d'un SQL Server et importer en utilisant ce même format dans un autre SQL Server. BCP est également très rapide mais un peu plus limité que SSIS.

INSERT INTO tablename SELECT fieldlist FROM othertable : Cela suppose que vous vous déplacez d'une table SQL à une autre sur le même serveur. C'est le plus rapide, mais à 500 000 lignes, vous envisagez une transaction assez importante ou devez la casser comme vous l'avez dit.

OPENROWSET : Il s'agit d'une fonction SQL Server qui vous permettra d'extraire des données dans une table de différents formats. C'est aussi censé être assez rapide mais je n'y ai pas beaucoup travaillé.

Remarque générale: votre clé primaire est mbr_id. Si c'est quelque chose qui est stocké dans vos données source (par opposition à une colonne d'identité), votre insert ira BEAUCOUP plus rapidement si les données source sont dans l'ordre mbr_id.

Kenneth Fisher
la source
0

Depuis que vous utilisez. NET, vous pouvez réellement diffuser les données sans appeler un processus externe. Vous utiliseriez des paramètres table. Voir ma réponse sur StackOverflow pour plus de détails et un lien vers une autre variante de cette méthode:

https://stackoverflow.com/a/25815939/577765

Solomon Rutzky
la source
0

Afin de le rendre plus rapide (surtout s'il s'agit d'une population initiale d'une table), consultez également la suppression des index.

Josh Simar
la source