SQL Server 2008:与其他视图一起加入视图:预先估计而无需求助于临时表
-
29-09-2019 - |
题
要在数据库中执行转换,我经常使用一组链式视图。在视图中,将是常见的表格表达式。例如,我将有以下内容:
CREATE VIEW TransformationStep1 AS
WITH Transformation1A AS (
SELECT Field1, Field2, Field3, Bla(Field1) AS Calc FROM Table1
),
Transformation1B AS (
SELECT Field1, Field2, Field3, Calc FROM Transformation1A
)
SELECT * FROM Transformation1B
CREATE VIEW TransformationStep2 AS
WITH Transformation2A AS (
SELECT Field1, Calc FROM TransformationStep1
), ....
随着查询计划变得更加复杂,在TransforationStep4附近的某个地方,视图将变得越来越慢。这是预期的,还可以。
但是,当我想将TransformationStep4的一部分加入本身时,当优化器试图将其返回到源表并寻找某种索引时,查询将大大减慢。通常这还可以,但是有时我只想存储我的临时结果并加入这一点,因为(在故事中是设计人),我知道结果表将很小,加入会更快得多反对它的“预取”。
我有没有办法写一个查询提示,这会影响查询计划的方式,以使子查询将被预取,然后加入?否则,我将不得不在存储过程中求助于临时表,但是如果可以的话,我想避免使用。
感谢您的任何建议,当您认为我的设计很烂时:-)
解决方案
视图是一个扩展的宏:没有缓存或预取预算。
除非您有索引视图可以使用notextand。
但是,您也可以使用内部/订单来实现视图:
SELECT
*
FROM
(SELECT TOP 2000000000 * FROm TransformationStep2 ORDER BY soemthing) V1
JOIN
(SELECT TOP... ) bar on foo.x = bar.x
观点没有什么神奇的:它只是文字,没有记忆或持久性...
不隶属于 StackOverflow