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 的查询,解析并执行它。这是一个非常强大和灵活的功能,但它并不能保证与自定义代码一样好。

我的推荐:

  1. 如果可以,请避免使用 DataTable class。众所周知,它非常重,通常会助长错误的设计决策。
  2. 如果您无论如何都要使用它,请避免将 Select 方法用于您可以轻松编写代码的内容。