代码之家  ›  专栏  ›  技术社区  ›  TonE

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

  •  0
  • TonE  · 技术社区  · 16 年前

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

    例如

    有条件A(45)
    和条件B(33)

    和条件d(15)

    总计:48

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

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

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

    查询处理器用完了 内部资源,无法

    构建和运行这样一个查询的最具伸缩性和效率的方法是什么?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Remus Rusanu    16 年前

    使用LINQ怎么样?

    你可以让IQueryable从直线开始 from t in table select t 并不断添加表达式(通过 Where )然后让linqtosql提供程序生成查询。您所需要的只是一些代码来编译任意 ConditionA 表达式(可假定的文本)转换为等价的lambda表达式。这不是一件小事。

    希望LINQ提供者将所有表达式折叠成一个WHERE子句,并避免子查询。

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

        2
  •  0
  •   Beth    16 年前

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

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

        3
  •  0
  •   chris    16 年前

    我不确定这背后的要求,但你可能想考虑一些替代品。

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

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

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

        4
  •  0
  •   TonE    16 年前