Quel est le moyen le plus rapide pour vrac insérer un grand nombre de données dans SQL Server, C# client)

Je suis frapper certains goulots d'étranglement de performances avec mon client C# insertion en bloc de données dans une base de données SQL Server 2005 et je suis à la recherche de moyens pour accélérer le processus.

Je suis déjà à l'aide de la SqlClient.SqlBulkCopy (qui est basé sur TDS) pour accélérer le transfert de données à travers le fil qui m'a beaucoup aidé, mais je suis toujours à la recherche pour plus.

J'ai un tableau simple qui ressemble à ceci:

 CREATE TABLE [BulkData](
 [ContainerId] [int] NOT NULL,
 [BinId] [smallint] NOT NULL,
 [Sequence] [smallint] NOT NULL,
 [ItemId] [int] NOT NULL,
 [Left] [smallint] NOT NULL,
 [Top] [smallint] NOT NULL,
 [Right] [smallint] NOT NULL,
 [Bottom] [smallint] NOT NULL,
 CONSTRAINT [PKBulkData] PRIMARY KEY CLUSTERED 
 (
  [ContainerIdId] ASC,
  [BinId] ASC,
  [Sequence] ASC
))

Je suis d'insertion de données dans des morceaux moyenne d'environ 300 lignes où ContainerId et BinId sont constants dans chaque bloc et la valeur de la Séquence est de 0-n et les valeurs sont pré-triés en fonction de la clé primaire.

Le %de temps du Disque du compteur de performance passe beaucoup de temps à 100% donc c'est clair que l'e /s disque est le principal problème, mais les vitesses que je reçois sont de plusieurs ordres de grandeur au-dessous d'un fichier raw copie.

Il aide tout si j':

  1. Drop la clé Primaire alors que je suis en train de faire de l'insertion et de le recréer plus tard
  2. Faire des insertions dans une table temporaire avec le même schéma et périodiquement les transférer dans la table principale de maintenir la taille de la table où les insertions sont en passe de petites
  3. Autre chose?

--
Sur la base des réponses que j'ai obtenu, permettez-moi de clarifier un peu:

Portman: je suis en utilisant un index cluster, car lorsque les données sont importées, j'ai besoin d'accéder à des données de manière séquentielle dans l'ordre. Je n'ai pas particulièrement besoin de l'index pour être là lors de l'importation des données. Est-il un avantage à avoir un cluster PK index tout en faisant de la insère, par opposition à une chute de la contrainte entièrement pour l'importation?

Chopeen: Les données sont générées à distance sur d'autres machines (my SQL server ne peut traiter environ 10 actuellement, mais j'aimerais être en mesure d'ajouter plus). C'est pas pratique pour exécuter l'ensemble du processus sur la machine locale, car il serait alors à traiter de 50 fois plus de données d'entrée pour générer la sortie.

Jason: je ne fais pas toutes les requêtes simultanées contre la table pendant le processus d'importation, je vais essayez de laisser tomber la clé primaire et voir si cela aide.

InformationsquelleAutor Andrew | 2008-08-23