DataTable IN语法性能
DataTable IN syntax performance
我有一个包含 10k 条记录的数据表。
如果我使用 foreach 从数据表中 select 1k 条记录,一切似乎都正常。
但是当我在 IN sql 查询中组合所有 1k 条记录时,select 命令需要更多时间才能完成。
测试代码:
DataTable cacheTable = new DataTable() {Columns = {{"ID", typeof(int)}, {"TEXT", typeof(string)}}};
for(int i = 0; i < 10000; i++)
{
cacheTable.Rows.Add(i, "aaaaaaa");
}
List<object> ids = new List<object>();
for (int i = 0; i < 100; i++)
{
ids.Add(cacheTable.Rows[i]["ID"]);
}
Stopwatch w = new Stopwatch();
w.Start();
foreach (var id in ids)
{
cacheTable.Select(string.Format("ID='{0}'", id));
}
w.Stop();
Console.WriteLine("=:");
Console.WriteLine("ElapsedMilliseconds: {0}", w.ElapsedMilliseconds);
Console.WriteLine("ElapsedTicks: {0}", w.ElapsedTicks);
Console.WriteLine("ElapsedTicks: {0}", w.Elapsed);
string sql = string.Format("ID in ('{0}')", string.Join("','", ids));
Stopwatch w1 = new Stopwatch();
w1.Start();
var rows = cacheTable.Select(sql);
w1.Stop();
Console.WriteLine("IN:");
Console.WriteLine("ElapsedMilliseconds: {0}", w1.ElapsedMilliseconds);
Console.WriteLine("ElapsedTicks: {0}", w1.ElapsedTicks);
Console.WriteLine("ElapsedTicks: {0}", w1.Elapsed);
输出:
=:
ElapsedMilliseconds: 20
ElapsedTicks: 47827
ElapsedTicks: 00:00:00.0204534
IN:
ElapsedMilliseconds: 557
ElapsedTicks: 1303385
ElapsedTicks: 00:00:00.5573985
为什么会这样?
另外,DataTable类在使用上有什么推荐吗?
DataTable.Select
接受一个类似于 SQL 的查询,解析并执行它。这是一个非常强大和灵活的功能,但它并不能保证与自定义代码一样好。
我的推荐:
- 如果可以,请避免使用
DataTable
class。众所周知,它非常重,通常会助长错误的设计决策。
- 如果您无论如何都要使用它,请避免将
Select
方法用于您可以轻松编写代码的内容。
我有一个包含 10k 条记录的数据表。
如果我使用 foreach 从数据表中 select 1k 条记录,一切似乎都正常。
但是当我在 IN sql 查询中组合所有 1k 条记录时,select 命令需要更多时间才能完成。
测试代码:
DataTable cacheTable = new DataTable() {Columns = {{"ID", typeof(int)}, {"TEXT", typeof(string)}}};
for(int i = 0; i < 10000; i++)
{
cacheTable.Rows.Add(i, "aaaaaaa");
}
List<object> ids = new List<object>();
for (int i = 0; i < 100; i++)
{
ids.Add(cacheTable.Rows[i]["ID"]);
}
Stopwatch w = new Stopwatch();
w.Start();
foreach (var id in ids)
{
cacheTable.Select(string.Format("ID='{0}'", id));
}
w.Stop();
Console.WriteLine("=:");
Console.WriteLine("ElapsedMilliseconds: {0}", w.ElapsedMilliseconds);
Console.WriteLine("ElapsedTicks: {0}", w.ElapsedTicks);
Console.WriteLine("ElapsedTicks: {0}", w.Elapsed);
string sql = string.Format("ID in ('{0}')", string.Join("','", ids));
Stopwatch w1 = new Stopwatch();
w1.Start();
var rows = cacheTable.Select(sql);
w1.Stop();
Console.WriteLine("IN:");
Console.WriteLine("ElapsedMilliseconds: {0}", w1.ElapsedMilliseconds);
Console.WriteLine("ElapsedTicks: {0}", w1.ElapsedTicks);
Console.WriteLine("ElapsedTicks: {0}", w1.Elapsed);
输出:
=:
ElapsedMilliseconds: 20
ElapsedTicks: 47827
ElapsedTicks: 00:00:00.0204534
IN:
ElapsedMilliseconds: 557
ElapsedTicks: 1303385
ElapsedTicks: 00:00:00.5573985
为什么会这样?
另外,DataTable类在使用上有什么推荐吗?
DataTable.Select
接受一个类似于 SQL 的查询,解析并执行它。这是一个非常强大和灵活的功能,但它并不能保证与自定义代码一样好。
我的推荐:
- 如果可以,请避免使用
DataTable
class。众所周知,它非常重,通常会助长错误的设计决策。 - 如果您无论如何都要使用它,请避免将
Select
方法用于您可以轻松编写代码的内容。