SQL server Query Count() 优化

Posted

技术标签:

【中文标题】SQL server Query Count() 优化【英文标题】:SQL server Query Count() Optimization 【发布时间】:2013-10-12 08:32:17 【问题描述】:

我使用的是 SQL Server 2005。我在查询中使用了 3 次 Count()

select    
    p.side,
    p.uid as uid,
    count (p.side) as cside,
    (count (p.side)/ 3) as pairs,
    ((count (p.side)/ 3) * 15 ) as commisonPrice
from  
    tempComm as p
group by 
    p.side , p.uid
order by 
    p.uid;

它给了我正确的输出,但问题是如何通过在我的查询中使用这种重复性来防止?

【问题讨论】:

你追求效率还是优雅? 为了效率,数据会快速增长,所以我主要关注性能,高效地计算和检索数据 您应该在问题中说明这一点。你得到的答案并不比你的查询更有效率。 这似乎效率不高。 . .你能建议我写这个查询的一种有效方法吗 【参考方案1】:
select 
    side,
    uid,
    cside,
    cside/3 as pairs,
    cside/3*15 as commisonPrice 
from
(
    select
    p.side ,
    p.uid as uid , 
    count (p.side) as cside
    from tempComm as p 
    group by p.side , p.uid
) t
order by uid; 

【讨论】:

也需要一点解释 所以你声称这样更有效率? 问题不在于效率,而在于口是心非【参考方案2】:

几种方法。

1. Common Table Expression - 在 SQL Server 2005 中引入

;用 cte 作为 (

    select    
          p.side,
          p.uid as uid,
          count (p.side) as cside
    from  tempComm as p
    group by p.side , p.uid

)

select * , cside / 3 as pairs , (cside / 3) * 15 as commisonPrice
from cte
order by p.uid;

2。派生表

select 
    side,
    uid,
    cside,
    cside/3 as pairs,
    (cside/3)*15 as commisonPrice 
from
(
    select
    p.side ,
    p.uid as uid , 
    count (p.side) as cside
    from tempComm as p 
    group by p.side , p.uid
) t
order by uid; 

其他方法是使用临时表、视图,您必须首先在其中插入数据并对列执行进一步操作,但我认为您的问题不需要它们。

注意:

    CTE 和派生表都只能使用一次,如果您需要 对您的数据执行多项操作,然后使用临时 表格。

    性能方面,CTE 和派生表具有相似的性能, 它只是偏好问题,您希望哪一个更具可读性 并且可以理解。

【讨论】:

以上是关于SQL server Query Count() 优化的主要内容,如果未能解决你的问题,请参考以下文章

MS ACCESS SQL QUERY COUNT DISTINCT

mysql quick query row count using sql

SQL Server - 在子查询中使用列别名

一个sqlserver存储过程,创建时没报错,执行时有错误

SQL Query排序并实现Unique Count

SQL -- SQL Server 查询优化器(Query Optimizers)