J'ai également examiné cela, et après avoir comparé la méthode SqlDataAdapter.Fill avec les fonctions SqlDataReader.Load, j'ai constaté que la méthode SqlDataAdapter.Fill est plus de deux fois plus rapide avec les ensembles de résultats que j'ai utilisés
Code utilisé:
[TestMethod]
public void SQLCommandVsAddaptor()
{
long AdapterFillLargeTableTime, readerLoadLargeTableTime, AdapterFillMediumTableTime, readerLoadMediumTableTime, AdapterFillSmallTableTime, readerLoadSmallTableTime, AdapterFillTinyTableTime, readerLoadTinyTableTime;
string LargeTableToFill = "select top 10000 * from FooBar";
string MediumTableToFill = "select top 1000 * from FooBar";
string SmallTableToFill = "select top 100 * from FooBar";
string TinyTableToFill = "select top 10 * from FooBar";
using (SqlConnection sconn = new SqlConnection("Data Source=.;initial catalog=Foo;persist security info=True; user id=bar;password=foobar;"))
{
// mesures du jeu de données volumineux
AdapterFillLargeTableTime = MesurerTempsExecutionMéthode(sconn, LargeTableToFill, ExecuteDataAdapterFillStep);
readerLoadLargeTableTime = MesurerTempsExecutionMéthode(sconn, LargeTableToFill, ExecuteSqlReaderLoadStep);
// mesures du jeu de données moyen
AdapterFillMediumTableTime = MesurerTempsExecutionMéthode(sconn, MediumTableToFill, ExecuteDataAdapterFillStep);
readerLoadMediumTableTime = MesurerTempsExecutionMéthode(sconn, MediumTableToFill, ExecuteSqlReaderLoadStep);
// mesures du jeu de données petit
AdapterFillSmallTableTime = MesurerTempsExecutionMéthode(sconn, SmallTableToFill, ExecuteDataAdapterFillStep);
readerLoadSmallTableTime = MesurerTempsExecutionMéthode(sconn, SmallTableToFill, ExecuteSqlReaderLoadStep);
// mesures du jeu de données minuscule
AdapterFillTinyTableTime = MesurerTempsExecutionMéthode(sconn, TinyTableToFill, ExecuteDataAdapterFillStep);
readerLoadTinyTableTime = MesurerTempsExecutionMéthode(sconn, TinyTableToFill, ExecuteSqlReaderLoadStep);
}
using (StreamWriter writer = new StreamWriter("result_sql_compare.txt"))
{
writer.WriteLine("10000 lignes");
writer.WriteLine("Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 10000 lignes : {0} millisecondes", AdapterFillLargeTableTime);
writer.WriteLine("Lecteur de données SQL 100 fois la vitesse de chargement du tableau 10000 lignes : {0} millisecondes", readerLoadLargeTableTime);
writer.WriteLine("1000 lignes");
writer.WriteLine("Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 1000 lignes : {0} millisecondes", AdapterFillMediumTableTime);
writer.WriteLine("Lecteur de données SQL 100 fois la vitesse de chargement du tableau 1000 lignes : {0} millisecondes", readerLoadMediumTableTime);
writer.WriteLine("100 lignes");
writer.WriteLine("Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 100 lignes : {0} millisecondes", AdapterFillSmallTableTime);
writer.WriteLine("Lecteur de données SQL 100 fois la vitesse de chargement du tableau 100 lignes : {0} millisecondes", readerLoadSmallTableTime);
writer.WriteLine("10 lignes");
writer.WriteLine("Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 10 lignes : {0} millisecondes", AdapterFillTinyTableTime);
writer.WriteLine("Lecteur de données SQL 100 fois la vitesse de chargement du tableau 10 lignes : {0} millisecondes", readerLoadTinyTableTime);
}
Process.Start("result_sql_compare.txt");
}
private long MesurerTempsExecutionMéthode(SqlConnection conn, string query, Action Méthode)
{
long time; // savoir C#
// exécuter une seule étape de lecture hors du temps de mesure, pour chauffer le cache ou autre
Méthode(conn, query);
// démarrer le chronométrage
time = Environment.TickCount;
for (int i = 0; i < 100; i++)
{
Méthode(conn, query);
}
// retourner le temps en millisecondes
return Environment.TickCount - time;
}
private void ExecuteDataAdapterFillStep(SqlConnection conn, string query)
{
DataTable tab = new DataTable();
conn.Open();
using (SqlDataAdapter comm = new SqlDataAdapter(query, conn))
{
// Fonction de remplissage du tableau de l'adaptateur
comm.Fill(tab);
}
conn.Close();
}
private void ExecuteSqlReaderLoadStep(SqlConnection conn, string query)
{
DataTable tab = new DataTable();
conn.Open();
using (SqlCommand comm = new SqlCommand(query, conn))
{
using (SqlDataReader reader = comm.ExecuteReader())
{
// Fonction de chargement de l'IDataReader
tab.Load(reader);
}
}
conn.Close();
}
Résultats:
10000 lignes :
Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 10000 lignes : 11782 millisecondes
Lecteur de données SQL 100 fois la vitesse de chargement du tableau 10000 lignes : 26047 millisecondes
1000 lignes :
Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 1000 lignes: 984 millisecondes
Lecteur de données SQL 100 fois la vitesse de chargement du tableau 1000 lignes: 2031 millisecondes
100 lignes :
Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 100 lignes : 125 millisecondes
Lecteur de données SQL 100 fois la vitesse de chargement du tableau 100 lignes : 235 millisecondes
10 lignes :
Adaptateur de données SQL 100 fois la vitesse de remplissage du tableau 10 lignes : 32 millisecondes
Lecteur de données SQL 100 fois la vitesse de chargement du tableau 10 lignes: 93 millisecondes
Pour des problèmes de performances, utiliser la méthode SqlDataAdapter.Fill est bien plus efficace. Donc sauf si vous voulez vous tirer une balle dans le pied, utilisez cela. Cela fonctionne plus rapidement pour les petits et grands ensembles de données.