假设我的视图定义如下:
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
我正在尝试概念化这两者是否/如何以不同方式处理/优化。通过“分块”单个查询并单独将谓词应用于每个查询来获得性能提升吗?
感谢。
答案 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