TSQL - 查看与存储过程:应用谓词时的性能注意事项

时间:2013-05-09 11:51:56

标签: sql sql-server sql-server-2008 tsql

假设我的视图定义如下:

CREATE VIEW [dbo].[vData_Values] AS
   SELECT ParentId, TimeStamp, Value From Table1
   UNION ALL
   SELECT ParentId, TimeStamp, Value FROM Table2
   UNION ALL
   SELECT ParentId, TimeStamp, Value FROM Table3
   UNION ALL
   SELECT ParentId, TimeStamp, Value FROM Table4

假设我针对我的视图编写了一个查询,如下所示:

   SELECT ParentId, TimeStamp, Value
   FROM vData_Values
   WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59'

是否有人希望对视图的查询执行方式与具有与视图相同的内部查询的存储过程的执行方式不同,但每一步都使用相同的WHERE子句。例如:

CREATE PROCEDURE [dbo].[GetValues]
(
...
)
AS
BEGIN

   SELECT ParentId, TimeStamp, Value From Table1
   WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59'
   UNION ALL
   SELECT ParentId, TimeStamp, Value FROM Table2
   WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59'
   UNION ALL
   SELECT ParentId, TimeStamp, Value FROM Table3
   WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59'
   UNION ALL
   SELECT ParentId, TimeStamp, Value FROM Table4
   WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59'

END

我正在尝试概念化这两者是否/如何以不同方式处理/优化。通过“分块”单个查询并单独将谓词应用于每个查询来获得性能提升吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我自己也有这个问题,并且发现存储过程版本的速度要快得多。我相信(我没有做太多的调查)但我相信它会首先完成所有记录的联合然后过滤。存储过程对每个部分进行过滤,然后将它们联合起来,因此假设记录较少。

现在我没有尝试过的是一个联合所有包含重复的东西(并且可能没有检查这些值。)

所以不幸的是,如果你要处理大量的记录,在你展示的两个样本之间 - 存储过程会更快。 (不幸的是,我说你必须预先构建where子句。)

尝试查看执行计划,看看它的内容(我也很好奇。)

答案 1 :(得分:0)

比较执行计划

下面有相同的执行计划

  CREATE VIEW [dbo].[docSVsysInt] AS
  select sID 
  from docSVsys 
  union 
  select sID 
  from docSVint

  select sID 
  from [docSVsysInt] 
  where sID > 100000 and sID <  100010

  select sID 
  from docSVsys 
  where sID > 100000 and sID <  100010
  union 
  select sID 
  from docSVint
  where sID > 100000 and sID <  100010

  select sID 
  from
  (
  select sID 
  from docSVsys 
  union 
  select sID 
  from docSVint
  )  comb
  where sID > 100000 and sID <  100010