Je rencontre des goulots d'étranglement au niveau des performances lorsque mon client C# insère des données en masse dans une base de données SQL Server 2005 et je cherche des moyens d'accélérer le processus.
J'utilise déjà le SqlClient.SqlBulkCopy (qui est basé sur TDS) pour accélérer le transfert de données à travers le fil, ce qui m'a beaucoup aidé, mais je cherche encore 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 en train d'insérer des données en morceaux d'environ 300 lignes en moyenne, où ContainerId et BinId sont constants dans chaque morceau, la valeur de la séquence est 0-n et les valeurs sont pré-triées en fonction de la clé primaire.
Le compteur de performance %Disk time passe beaucoup de temps à 100%, il est donc clair que les entrées-sorties sur disque sont le principal problème, mais les vitesses que j'obtiens sont plusieurs ordres de grandeur en dessous d'une copie de fichier brut.
Est-ce que ça aide si je :
- Supprimer la clé primaire pendant que je fais l'insertion et la recréer plus tard.
- Effectuer des insertions dans une table temporaire avec le même schéma et les transférer périodiquement dans la table principale afin de maintenir la taille de la table où les insertions ont lieu à un niveau faible.
- Autre chose ?
-- Sur la base des réponses que j'ai reçues, permettez-moi de clarifier un peu :
Portman : J'utilise un index clusterisé parce que lorsque les données seront toutes importées, j'aurai besoin d'accéder aux données de manière séquentielle dans cet ordre. Je n'ai pas particulièrement besoin que l'index soit présent pendant l'importation des données. Y a-t-il un avantage à avoir un index PK non clusterisé pendant les insertions plutôt que de laisser tomber la contrainte entièrement pour l'importation ?
Chopeen : Les données sont générées à distance sur de nombreuses autres machines (mon serveur SQL ne peut en gérer qu'une dizaine actuellement, mais j'aimerais pouvoir en ajouter d'autres). Il n'est pas pratique d'exécuter l'ensemble du processus sur la machine locale car il faudrait alors traiter 50 fois plus de données d'entrée pour générer la sortie.
Jason : Je ne fais pas de requêtes simultanées sur la table pendant le processus d'importation, je vais essayer de supprimer la clé primaire et voir si cela aide.