1

为了在我的数据库中执行转换,我经常使用一组链式视图。在视图中将是公用表表达式。例如,我将有以下内容:

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

1 回答 1

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

视图没有什么神奇之处:它只是文本,没有记忆或持久性......

于 2010-10-11T18:14:58.003 回答