【发布时间】: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