1

要在我的数据库中执行转换,我经常使用链接的一组视图。在视图内将是通用表格表达式。例如,我会具备以下条件:SQL Server 2008:与其他VIEW一起加入VIEW:预计算而不诉诸临时表

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 
    ), .... 

某处TransformationStep4附近的查询计划变得更加复杂的看法会越来越慢。这是预料之中,并确定。

但是,当我想将TransformationStep4的一部分加入到它本身时,查询将会非常缓慢,因为优化器会尝试一路找回源表并查找某种类型的索引。通常情况下,这是可以的,但有时候我只是想存储我的临时结果并加入,因为(作为故事中的设计人员)我知道结果表格会很小,加入会更快反对它的“预取”。

有没有办法让我写一个查询提示,这将影响查询计划的方式,使得子查询将被预取,然后加入?否则,我将不得不在存储过程中使用临时表,但如果可以的话,我想避免它。

感谢您的任何建议,也当你觉得我的设计很烂:-)

回答

4

视图是一个可扩展的宏:没有缓存或预取预先计算。

除非你有索引视图,你可以使用NOEXPAND ..但这些不会在普通的意见。

但是,您可以使用内TOP/ORDER BY物化视图太:

SELECT 
    * 
FROM 
    (SELECT TOP 2000000000 * FROm TransformationStep2 ORDER BY soemthing) V1 
    JOIN 
    (SELECT TOP...) bar on foo.x = bar.x 

没有什么神奇的一个观点:这只是文字,也没有记忆或持续...

+1

TOP作品!太棒了,现在我可以用它来实现我的通用表格表达式。 (我没有认为视图是神奇的,我只是希望能够操纵查询优化器不会递归到我的CTE中。) – thomaspaulb 2010-10-11 18:30:20