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

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

观点没有什么神奇的:它只是文字,没有记忆或持久性...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top