首先附加数据然后将附加组分组或分组

时间:2015-10-29 22:12:18

标签: sql sql-server

我有两张表,格式完全相同。由于每个表都有日期列(用于创建表的日期),因此第一组或第一个追加将不会对结果产生任何影响。

我使用两个查询进行测试:

SELECT * FROM 
(SELECT 
 TXN,CONT,ReportingDate,sum(AMT) AS TOT
  FROM Table1
  GROUP BY TXN,CONT,ReportingDate
 UNION ALL
 SELECT 
 TXN,CONT,ReportingDate,sum(AMT) AS TOT
  FROM Table2
  GROUP BY TXN,CONT,ReportingDate)
  TEST

SELECT TXN, CONT,Reportingdate,sum(AMT)
from
(
SELECT 
 TXN,CONT,AMT,ReportingDate
  FROM Table1
  UNION ALL
  SELECT 
 TXN,CONT,AMT,ReportingDate
  FROM Table2
  )
  test
  GROUP BY
  TXN,CONT,Reportingdate

(22596行(s)受影响)

SQL Server执行时间:    CPU时间= 156 ms,经过时间= 2582 ms。

(22596行(s)受影响)

SQL Server执行时间:    CPU时间= 125 ms,经过时间= 2337 ms。

统计数据没有显示出很大的差异。每次运行查询时,时间都会发生变化。

执行计划 enter image description here

哪一个会更快?我在这里列出一个结果。我运行这两个查询10次,其中7次显示查询1更快。

reportdate列在两个表中将完全不同,因此查询1将不会出现重复结果。例如,表1中的reportingdate是10/28/2015s的列,表2中的报告日期是2015年10月29日。

由于

1 个答案:

答案 0 :(得分:1)

通常在决定使用哪个版本的SQL语句时,我会考虑以下内容:

  1. 他们都会返回相同的结果吗?正如Gordon在评论中提到的那样,概念上第一个会将两个表中重复的行作为单独的行返回,而第二个将它们组合在一起,你会看到它们的总和。
  2. 表现差异。这里没有太大的性能差异,但第二个似乎更快(这是有道理的,因为DBMS能够获得所有行然后总和一次而不是获得一些行,总和,然后得到更多的行,并且总和)
  3. 可读性/可维护性。在您看来,当有人稍后调试时,他们是否会使用或不使用分组语句来测试内部语句?真的是你打电话给这个。