最优化的方法来获取SQL Server 2005+中的列总计

时间:2010-10-13 14:57:53

标签: sql sql-server-2005 sql-server-2008 query-optimization sql-optimization

我正在为各个州使用的应用程序创建一些报告。数据库有可能非常大。我想知道哪种方式是获得列总数的最佳方式。

目前我的SQL类似于以下内容:

SELECT count(case when prg.prefix_id = 1 then iss.id end) +
       count(case when prg.prefix_id = 2 then iss.id end) as total,
       count(case when prg.prefix_id = 1 then iss.id end) as c1,
       count(case when prg.prefix_id = 2 then iss.id end) as c2
FROM dbo.TableName
WHERE ...

如您所见,列在那里两次。在一个例子中,即时添加它们并显示总数,在另一个实例中,我只显示报告所需的各个值。

这是SQL的一个非常小的样本,有20多列和w / i这些列中有4列或更多列有时会相加。

我正在考虑声明一些@Parameters并将每个列设置为等于@Parameter,然后我可以添加@serameters我需要显示列总数,IE:SET @Total = @c1 + @c2

但是,SQL Server引擎是否甚至关心这些列在那里多次?有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

任何原因都没有这样做

select prg.prefix_id, count(1) from tablename where... group by prg.prefix_id     

它将为您提供prefix_id的结果集,并且每个prefix_ID的行数...可能优先于一系列count(case)语句,我认为它应该更快,但我可以'确认无疑。

我会在使用@vars之前使用子查询。像这样:

   select c1,c2,c1+c1 as total from 
   (SELECT 
   count(case when prg.prefix_id = 1 then iss.id end) as c1, 
   count(case when prg.prefix_id = 2 then iss.id end) as c2 
   FROM dbo.TableName 
   WHERE ... ) a

答案 1 :(得分:1)

如果可以在使用T-SQL过程逻辑之前使用直接SQL。经验法则,如果你可以在SQL中做到这一点在SQL中做。如果要使用直接SQL模拟静态值,请尝试使用如下内联视图:

SELECT iv1.c1 + iv1.c2 as total,
       iv1.c1,
       iv1.c2
    FROM
    (
    SELECT count(case when prg.prefix_id = 1 then iss.id end) as c1,
           count(case when prg.prefix_id = 2 then iss.id end) as c2
    FROM dbo.TableName
    WHERE ...
    ) AS iv1

通过这种方式,您可以在逻辑上获取计数一次,并可以根据这些计数计算值。但是我认为SQL Server非常聪明,不必扫描计数n次,所以我不知道你的计划会与我发送的SQL和你拥有的SQL有所不同。