【问题标题】:Counting number of rows in result of dynamic query统计动态查询结果中的行数
【发布时间】:2014-02-19 17:37:10
【问题描述】:

我们有一个非常精细的查询,我们允许用户使用许多预定义的过滤器。 该查询涉及大约 20 个表,您可能可以想象结果中的行数(分页之前)是查询中最慢的部分。

目前我正在考虑通过基于用户提供的过滤器连接表来使 COUNT 查询动态化,从而使 COUNT 查询更加轻量级。

例如:

没有给出过滤器:

SELECT 
    COUNT(BaseTable.Id) 
FROM BaseTable

过滤其他表格:

SELECT 
    COUNT(BaseTable.Id) 
FROM BaseTable
JOIN OtherTable ON BaseTable.OtherTableId = OtherTable.Id
WHERE OtherTable.SomeColumn = 'criterion'

虽然从概念上讲很容易掌握并且可能需要几个小时的工作,但它可能会变得有点麻烦和混乱,尤其是考虑到所涉及的表格数量。

我想我并不是唯一一个遇到过这个(或类似)问题的人,所以我想知道其他人是如何处理类似情况的。没有更优雅的解决方案吗?

【问题讨论】:

  • 但是您必须为常规查询编写 from、join 和 where ?如果您的常规查询是分页,您只需要保留该部分。有基数、基数和页数。
  • 这样做的一个问题是所有表都在“常规”查询中连接,因此可以填充 DTO。所以总是涉及两个查询:一个用于数据部分,一个用于计数部分。计数查询不一定所有表都加入,而数据查询总是有。
  • 所以,额外的表不应该打破计数。如果他们这样做,那么计数是错误的。即使您将其分开,两个查询也应该有共同的核心部分,否则计数不正确。
  • 确实,他们并没有打破计数,但这正是现在的情况。在计数查询中加入许多表会导致严重的性能损失,因此是最初的问题。请记住,我们在这里计算了 15 多张桌子。最小公分母是查询基表。
  • 为什么投反对票?请详细说明。

标签: c# .net sql-server performance count


【解决方案1】:

阅读您的问题。
您要求建立计数和选择语句的方法。
这是构建这两个语句的一种方法。
我用它,既不麻烦也不乱。
通过查询构建器并将行放入 base、count 或 select 有多难?
您需要将查询分解为 from/join 和 where/sort。
选择语句将是独立的。

StringBuilder sbBaseFromJoin = new StringBuilder();
StringBuilder sbBaseWhere = new StringBuilder();

StringBuilder sbCountSelect = new StringBuilder();
StringBuilder sbCountFromJoin = new StringBuilder();
StringBuilder sbCountWhere = new StringBuilder();

StringBuilder sbDTOSelect = new StringBuilder();
StringBuilder sbDTOFromJoin = new StringBuilder();
StringBuilder sbDTOWhereSort = new StringBuilder();

浏览您当前的查询生成器并拆分行

count = sbCountSelect + sbBaseFromJoin+ sbCountFromJoin + sbBaseWhere + sbCountWhere

DTO = sbDTOSelect + sbBaseFromJoin+ sbDTOFromJoin + sbBaseWhere + sbDTOWhereSort

附:如果您有一个不参与 where 或 select 并且严重影响性能的连接,那么您需要查看查询。

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2014-02-17
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多