使用SQL Server和.NET构建增量查询

使用SQL Server和.NET构建增量查询,.net,sql,sql-server-2008,.net,Sql,Sql Server 2008,我正在从事一个ASP.NETMVC项目,该项目允许用户通过一次添加items子句来构造任意复杂的查询 然后,应用程序生成相应的SQL,运行它(当前使用SQL Server 2008)并显示结果,其中包括每个添加项的匹配记录数 e、 g 用户查询: 有条件A(45) 和条件B(33) 或条件C(55) 和条件D(15) 总数:48 问题是如何最好地构建和运行SQL,以便在考虑性能和可伸缩性的情况下生成这些结果 最初的实现依次为每个项(与前一项组合)构建一个查询(使用子查询),将它们作为标量单独运行

我正在从事一个ASP.NETMVC项目,该项目允许用户通过一次添加items子句来构造任意复杂的查询

然后,应用程序生成相应的SQL,运行它(当前使用SQL Server 2008)并显示结果,其中包括每个添加项的匹配记录数

e、 g

用户查询:

有条件A(45)
和条件B(33)
或条件C(55)
和条件D(15)

总数:48

问题是如何最好地构建和运行SQL,以便在考虑性能和可伸缩性的情况下生成这些结果

最初的实现依次为每个项(与前一项组合)构建一个查询(使用子查询),将它们作为标量单独运行。每次执行都涉及到生成SQL和打开新的SqlConnection、创建新的SqlCommand和执行

我花了一段时间重新编写它,以生成一个查询(使用CTE)返回一行,并将每个项的结果作为一列

这只需要一次执行,在查询变得复杂且SQL Server开始抛出错误之前,性能似乎略为有利:

查询处理器的内存不足 内部资源,无法使用 生成查询计划

构建和运行此类查询的最具可扩展性和效率的方法是什么?

使用LINQ如何

您可以让IQueryable从表中的t直接开始,选择t,并继续向其添加表达式(via),然后让LINQ to SQL提供程序生成查询。您只需要一些代码就可以将任意的
条件a
表达式(可能的文本)编译成等价的lambda表达式。这不是一件小事

希望LINQ提供程序将所有表达式压缩到一个WHERE子句中,并避免子查询


尽管最终,您不能让查询包含令人厌恶的筛选表达式,但无论您如何表达它,有时都会变得非常复杂。

您支持从每个条件以及提供的所有条件返回结果,这是不必要的。如果他们想知道某个条件的结果,他们可以单独运行该条件来获得结果


我将把子句存储在一个表中,并让sp将查询条件附加到WHERE子句中。对每个条件子句有一个子查询比服务器少,

我不确定后面的要求,但您可能想考虑一些备选方案。

首先,通过显示受每个子句影响的记录数,您真的获得了什么吗?在您的示例中,这些数字并没有真正帮助理解查询的总体影响。去除这些可能会简化事情

您是否可以转到客户端解决方案,在那里您可以使用javascript框架过滤结果


我参与过一些试图做类似事情的项目;最后,有一小部分人需要能够执行复杂的即席查询,而我们最终只是给他们提供了适当的报告工具。

我们的前进方向是为每个子句使用临时表来构建查询,并在其中应用随后添加的每个子句(通过联合/交叉/例外)到由上一个子句生成的临时表

还为结果创建了一个临时表,并在填充每个临时表时使用一个诱人的Id和行数进行更新

处理查询后,通过从results temp表中选择所有行返回结果,该表提供完整的逐项细分


防止了大量SQL查询状态的需要,它包含了许多子查询,也阻止了相同SQL的不断重新执行,提供了在可扩展性和性能上的巨大改进。谢谢,这是一个有用的建议,因为它使我对问题有不同的考虑。不过,我没有机会尝试实施它。