2010-10-20 6 views
3

Je dois insérer une grande quantité de données dans une table. Est-ce que sqlserver 2008 (par rapport à 2005) a de nouvelles fonctionnalités pour augmenter les performances dans ce cas?SQL Server 2008 - fonctions de réglage des performances pour insérer une grande quantité de données

+0

« Je dois insérer grande quantité de données dans une table. " - peut-être voudriez-vous expliquer comment vous avez l'intention de le faire? il y a plusieurs façons ... –

+0

J'insère en utilisant une procédure stockée, dans laquelle j'ai insérer une instruction Select. – Relativity

Répondre

1

Je ne sais pas si cela est faisable pour votre problème, mais si vous le pouvez j'essaierais vraiment de développer ceci dans le code. J'ai eu une question similaire pour un grand projet dans le passé, qui devait importer 15 ans de données de production dans un nouveau schéma (dans SQL Server 2005.) System.Data.SqlClient.SqlBulkCopy était de loin la option la plus rapide.

Si vous allez dans ce sens, je vous suggère de faire des insertions par lots d'environ 1 Go à la fois, puis d'appeler manuellement le .NET GC pour libérer votre table en mémoire. Je suis obligé de faire ces deux choses pour ne pas courir dans les erreurs de mémoire (système 32 bits, bien que.)

Edit - pseudocode pour mon solutiong était quelque chose comme:

Table dataToInsert = new Table(); 
var sqlCommand = new SqlCommand("select * from old database"); 
DataReader dataFromOldSystem = sqlCommand.ExecuteReader(); 
foreach (DataRow oldRow in dataFromOldSystem.Tables[0]) 
{ 
// I had to modify/transpose the row from the old table in some way 
DataRow newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(2)); 
dataToInsert.AddRow(newRow); 

newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(3)); 
dataToInsert.AddRow(newRow); 

newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(4)); 
dataToInsert.AddRow(newRow); 

// check if the number of rows is over some magic number that is below the memory limit 
// you can check the private bytes in use by your app to help guess this number 
if (dataToInsert.Rows.Count > 1000000) 
{ 
SqlBulkCopy bulkCopier = new BulkCopy(blah); 
bulkCopier.Execute(); 

dataToInsert = null; 
GC.Finalize(); 
GC.Free; 

dataToInsert = new Table(); 
} 
} 
+0

Vous voulez dire.call SQL bulk Copy dans une boucle et appelez GC pour libérer? Si oui, comment puis-je spécifier la taille de la copie en bloc de 1 Go. Avez-vous un exemple de code pour le même? – Relativity

+0

J'ai peur que j'ai déménagé des travaux depuis lors, donc n'ai pas l'échantillon de code. Dans mon cas, j'ai utilisé des essais et des erreurs et quelques suppositions éclairées pour le faire. – Coxy

+0

J'ai ajouté un pseudo-code qui est l'idée de base derrière l'application que j'ai développée. – Coxy

4

SQL Server 2008 contient l'instruction TSQL MERGE qui peut accélérer certains types d'opérations INSERT, UPDATE et DELETE combinées.

Si vous avez l'intention d'exécuter via le code, je suggère d'utiliser la classe System.Data.SqlClient.SqlBulkCopy (mais également présente dans SQL Server 2005).

+0

Je ne le fais pas par le code. Mais est-il comme fatser SqlBulkCopy que l'insertion de base de données normar ??? Si oui, à quelle vitesse? – Relativity

+0

Vérifiez le Guide de performance de chargement de données http://bit.ly/9Due9T, SqlBulkCopy classe lui-même http://bit.ly/8Xxu2R et le chargement en bloc de haute performance à SQL Server en utilisant SqlBulkCopy http://bit.ly/a9KZ2l si vous toujours concerné. Mais si vous faites avec TSQL alors allez MERGE –

Questions connexes