为了在我的数据库中执行转换,我经常使用一组链式视图。在视图中将是公用表表达式。例如,我将有以下内容:
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 的一部分连接到自身时,查询将大大减慢,因为优化器会尝试一直返回到源表并查找某种索引。通常这是可以的,但有时我只想存储我的临时结果并加入,因为(作为故事中的设计人员)我知道结果表会很小,加入会快得多反对它的“预取”。
有没有办法让我编写一个查询提示,它会影响查询计划,从而预取子查询然后加入反对?否则我将不得不求助于存储过程中的临时表,但如果可以的话,我想避免它。
感谢您的任何建议,以及当您认为我的设计很糟糕时:-)