我有大量条件(我不提前知道它们),我需要对一个相对较小的 SQL Server 表(< 10,000 行)进行计数。每个条件都采用 SQL where 子句的形式。目前,我构建了一个完整的sql语句,形式为“select count(*) from some_table where” + Where_Clause; 我让 SQL Server 将计数返回给我。我在一个循环中执行此操作以获得所有各种条件所需的所有计数。
当我需要运行数十或数百个计数时,我正在寻找加快速度的方法。我不知道这些声明提前。有些会选择整个表格,有些可能不会选择任何行。我尝试了以下解决方案:
- 并行发出查询 - 即使没有进行任何锁定,改进也很小
- 将它们写成 case 语句的复杂计数,这样我就可以在一个语句中运行多个 where 子句
- 将许多查询作为 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 语法快速(或并行)行吗?