2013-03-19 1 views
2

J'ai une méthode dans mon projet qui met à jour mes tables SQL en utilisant un DataAdapter ADO.NET.Comment puis-je calculer dynamiquement l'UpdateBatchSize optimal pour un DataAdapter ADO.NET

Maintenant, certaines de ces tables peuvent être assez volumineuses avec peut-être 5000 lignes et certaines ne contiennent que quelques lignes de données. Ce que je veux pouvoir faire est de calculer automatiquement le UpdateBatchSize optimal pour chaque table, basé sur la taille du DataTable.

Le aproche j'ai pris jusqu'à présent est d'utiliser la méthode d'extension suivante:

public static void SetBatchUpdateSize(this DbDataAdapter adapter, int rowCount) 
{ 
    if (rowCount <= 5) 
    { 
     adapter.UpdateBatchSize = 5; 
    } 
    else if (rowCount <= 1000) 
    { 
     adapter.UpdateBatchSize = rowCount/2; 
    } 
    else 
    { 
     adapter.UpdateBatchSize = 500; 
    } 
} 

Cela ne fonctionne, mais je semble obtenir une baisse de performance sur des tables plus petites.

Pour être complet est ici comment je définir la taille de l'adaptateur:

var db = dbAccessLayer.CreateConnection(); 

try 
{ 
    adapter.SelectCommand.Connection = db; 
    adapter.SelectCommand.Connection.Open(); 
    adapter.SelectCommand.Transaction = transaction; 
    SetTimeout(timeout); 
    adapter.SetBatchUpdateSize(dataTable.Rows.Count); 
    int result = adapter.Update(Table); 
    adapter.SelectCommand.Transaction = null; 
    return result; 
} 
catch (Exception) 
{ 
    dataTable.RejectChanges(); 
    throw; 
} 

Il semble y avoir beaucoup de spéculations sur la beneftis performance des lots de mise à jour, mais pas de faits concrets sur la relation optimale. Je trouve que j'ai des problèmes avec les mises à jour SQL sur les connexions à faible vitesse et de mauvaise qualité, donc je cherche des façons d'optimiser cela autant que possible.

Répondre

0

Si vous avez une taille de mise à jour updatebatch plus grande qu'en un seul passage, beaucoup de données doivent être transférées sur le réseau, de sorte que UpdateBatchSize ne fait pas beaucoup de différence. En revanche, une taille plus petite sera plus performante.

+1

cela ne répond pas vraiment à la question. Quelle est la relation entre la vitesse de connexion, la taille du lot et la taille de la table. Comment puis-je trouver une solution optimale sans juste choisir des valeurs arbitraires et espérer le meilleur? Vous dites que les petites tailles fonctionnent mieux, mais ce n'est clairement pas le cas. Si j'ai 1000 lignes par table et une taille de lot de 2, je finis avec 500 appels à SQL, clairement pas efficace. – Mintey

Questions connexes