1

我有大量条件(我不提前知道它们),我需要对一个相对较小的 SQL Server 表(< 10,000 行)进行计数。每个条件都采用 SQL where 子句的形式。目前,我构建了一个完整的sql语句,形式为“select count(*) from some_table where” + Where_Clause; 我让 SQL Server 将计数返回给我。我在一个循环中执行此操作以获得所有各种条件所需的所有计数。

当我需要运行数十或数百个计数时,我正在寻找加快速度的方法。我不知道这些声明提前。有些会选择整个表格,有些可能不会选择任何行。我尝试了以下解决方案:

  1. 并行发出查询 - 即使没有进行任何锁定,改进也很小
  2. 将它们写成 case 语句的复杂计数,这样我就可以在一个语句中运行多个 where 子句
  3. 将许多查询作为 UNION 一起传递,并将结果作为一个结果集返回

这些选项都没有在运行时有显着的改进(有时它会运行得更慢),而且随着复杂性的增加,我觉得它们中的任何一个都不值得。

我的问题是:只需对它运行一个“select *”,我就可以非常快速地将整个表加载到 DataTable 对象中。如果我将整个表放在内存中,有没有办法在不来回 SQL Server 的情况下对它进行计数?我希望减少以下开销:网络、I/O、锁定等。

最复杂的 where 子句类似于:

a=1 or b in (2,3) or c<4 or d like '%5' or substring(e,2,1)='z'

所以这不是微不足道的,尽可能多地支持 T-SQL 是理想的,但我认为 DataTable 的 .Select() 方法不支持这个 OR 是否非常快。因此,给定内存中的数据表,我可以使用 T-SQL 语法快速(或并行)行吗?

4

2 回答 2

1

您可以考虑使用 LINQ to SQL,或者可能将查询构建为您可以执行的存储过程。

于 2012-11-01T03:16:58.747 回答
0

要尝试的事情

a) 确保您拥有正确的索引 - 检查最复杂查询的查询计划,并确保其中没有表扫描。

b)使用类似的方法在同一个请求中执行多个查询。

var cmd = new SqlCommand(@"SELECT TOP 10 * FROM Foo; SELECT TOP 10 * FROM Bar", con))
var ad = new SqlDataAdapter(cmd);
var ds = new DataSet();
ad.Fill(ds);

var foo = ds.Tables[0];
var bar = ds.Tables[1];
于 2012-10-31T15:38:51.700 回答