Đi theo là phương pháp tiếp cận một hàng một lần, chỉ chuyển tiếp, đọc dữ liệu tuần tự để bạn có được hồ sơ ngay sau khi được đọc khi được kết nối, sẽ là tốt nhất cho bộ nhớ và hiệu suất.
Điều đó nói rằng, giữa hai cách tiếp cận, tôi tìm thấy IDataAdapter.Fill
nhanh hơn nhiều so với DataTable.Load
. Tất nhiên điều đó phụ thuộc vào việc triển khai .. Dưới đây là một chuẩn mực giữa hai mà tôi được đăng here:
public DataTable Read1<T>(string query) where T : IDbConnection, new()
{
using (var conn = new T())
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = query;
cmd.Connection.ConnectionString = _connectionString;
cmd.Connection.Open();
var table = new DataTable();
table.Load(cmd.ExecuteReader());
return table;
}
}
}
public DataTable Read2<S, T>(string query) where S : IDbConnection, new()
where T : IDbDataAdapter, IDisposable, new()
{
using (var conn = new S())
{
using (var da = new T())
{
using (da.SelectCommand = conn.CreateCommand())
{
da.SelectCommand.CommandText = query;
da.SelectCommand.Connection.ConnectionString = _connectionString;
DataSet ds = new DataSet(); //conn is opened by dataadapter
da.Fill(ds);
return ds.Tables[0];
}
}
}
}
Cách tiếp cận thứ hai luôn luôn vượt trội so với lần đầu tiên.
Stopwatch sw = Stopwatch.StartNew();
DataTable dt = null;
for (int i = 0; i < 100; i++)
{
dt = Read1<MySqlConnection>(query); // ~9800ms
dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms
dt = Read1<SQLiteConnection>(query); // ~4000ms
dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms
dt = Read1<SqlCeConnection>(query); // ~5700ms
dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms
dt = Read1<SqlConnection>(query); // ~850ms
dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms
dt = Read1<VistaDBConnection>(query); // ~3900ms
dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms
}
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
Read1
trông tốt hơn trên đôi mắt, nhưng bộ chuyển đổi dữ liệu thực hiện tốt hơn (không phải để gây nhầm lẫn rằng một db vượt trội so với khác, các truy vấn đều khác nhau). Sự khác biệt giữa hai phụ thuộc vào truy vấn mặc dù. Lý do có thể là Load
yêu cầu các ràng buộc khác nhau để kiểm tra hàng theo hàng from the documentation khi thêm hàng (phương thức của nó trên DataTable
) trong khi Fill
nằm trên DataAdapters được thiết kế chỉ để tạo nhanh DataTables.
Xem bài đăng của tôi: ít mã hơn sử dụng DataAdapter. –