Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有SQL Server的情况下计算c中的SQL where子句_C#_Sql Server - Fatal编程技术网

C# 在没有SQL Server的情况下计算c中的SQL where子句

C# 在没有SQL Server的情况下计算c中的SQL where子句,c#,sql-server,C#,Sql Server,我有一个很大的条件集,我不知道他们提前,我需要对一个相对较小的SQL Server表

我有一个很大的条件集,我不知道他们提前,我需要对一个相对较小的SQL Server表<10000行计数。每个条件的形式都是SQLWHERE子句。目前,我以select count*的形式从一些_表where+where_子句中构建了一个完整的sql语句;我让SQL Server将计数返回给我。我在一个循环中这样做,以获得各种条件下所需的所有计数

当我有几十个或数百个计数需要运行时,我正在寻找加速的方法。我事先不知道这些陈述。有些将选择整个表,有些可能不选择任何行。我尝试了以下解决方案:

并行地发出查询——即使在不执行任何锁定的情况下,也能看到最小的改进 将它们作为复杂语句写入case语句,这样我就可以在一个语句中运行多个where子句 将多个查询作为联合传递到一起,并将结果作为一个结果集返回 这些选项中没有一个在运行时有过惊人的改进,有时它会运行得更慢,而且会增加复杂性,我觉得它们中的任何一个都不值得

我的问题是:只需对整个表运行一个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方法支持这一点,或者说它非常快。因此,给定内存中的一个数据表,我可以非常快速地或并行地使用T-SQL语法创建行吗

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];
尝试的事情

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];

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

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

您可以研究动态LINQ,看看它是否执行得更好。。。。如果已知筛选条件列表,您也可以使用PredicateBuilder…是否有一组预定义的where子句?或者它们是根据用户的要求合成的?用户使用其他工具创建它们。每个查询也有一个名称,因此在生成报告时,他们希望知道有多少行与每组条件匹配,并在其上加上一个名称。所以他们会收到报告说:好:100,坏:50,红色:25,黄色:100。。。等等。任意多个查询,不管它们设计了什么条件,但都是针对一个小表的,这就是为什么我想加载一次表并在内存中运行它们。可以尝试的一件事是使用一个数据库系统,将数据库存储在内存中,而不是持久存储上。我曾经在一个类中使用过MonetDB,虽然它对于我们使用它所做的工作来说有点过头了,但它的性能非常棒。您可以查看动态Linq,看看它是否有更好的性能。。。。如果已知筛选条件列表,您也可以使用PredicateBuilder…是否有一组预定义的where子句?或者它们是根据用户的要求合成的?用户使用其他工具创建它们。每个查询也有一个名称,因此在生成报告时,他们希望知道有多少行与每组条件匹配,并在其上加上一个名称。所以他们会收到报告说:好:100,坏:50,红色:25,黄色:100。。。等等。任意多个查询,不管它们设计了什么条件,但都是针对一个小表的,这就是为什么我想加载一次表并在内存中运行它们。可以尝试的一件事是使用一个数据库系统,将数据库存储在内存中,而不是持久存储上。我曾经在一个类中使用过MonetDB,尽管我们使用它做的事情有点过火,但它的性能非常棒。有太多的列需要索引,我不知道提前哪些列需要它们。你们对语句中的多个查询的建议是关于我在我的帖子的想法3中所做的——除了我只有一个语句。令人惊讶的是,同时运行100条语句并不比运行100条单独的查询快。这意味着需要花费时间的是查询本身,而不是到服务器的往返行程。如果没有更好的索引,我想不出多少。也许试着让da正常化
ta被分成不同的表,而不是一个大的表?有太多的列需要索引,我不知道提前哪些列需要它们。你们对语句中的多个查询的建议是关于我在我的帖子的想法3中所做的——除了我只有一个语句。令人惊讶的是,同时运行100条语句并不比运行100条单独的查询快。这意味着需要花费时间的是查询本身,而不是到服务器的往返行程。如果没有更好的索引,我想不出多少。也许可以尝试将数据标准化为单独的表,而不是一个大表?