计算动态查询结果中的行数

时间:2014-02-19 17:37:10

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

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

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

E.g:

没有给出过滤器:

SELECT 
    COUNT(BaseTable.Id) 
FROM BaseTable

过滤其他表:

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

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

我想我不是唯一一个面对这个(或类似的)问题的人,所以我想知道其他人是如何接近同样的情况的。是不是有更优雅的解决方案?

1 个答案:

答案 0 :(得分:0)

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

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

P.S。如果您的联接没有参与where或select并且严重影响性能,那么您需要查看查询。