Для выполнения преобразований в моей базе данных я часто использую набор из нескольких цепочек. Внутри представлений будут отображаться общие табличные выражения. Например, я бы следующее: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 для себя, запрос будет сильно замедляться, поскольку оптимизатор пытается найти путь назад к исходным таблицам и искать какие-то индексы. Обычно это нормально, но иногда я просто хочу сохранить свой временный результат и присоединиться к этому, потому что (будучи проектирующим человека в истории), я знаю, что таблица результатов будет довольно маленькой, и будет намного быстрее присоединиться против «предварительной выборки».
Есть ли способ написать подсказку запроса, которая повлияет на план запроса таким образом, что подзапрос будет предварительно выбран, а затем соединен с? В противном случае мне придется прибегать к временным таблицам в хранимой процедуре, но я хочу избежать этого, если смогу.
Спасибо за любые предложения, также, когда вы думаете, мой дизайн отстой :-)
TOP работает! Отлично, теперь я могу использовать его для материализации моих общих табличных выражений. (Я не думал, что представление было волшебным, я просто хочу иметь возможность манипулировать оптимизатором запросов, чтобы не возвращаться в мой CTE ..) – thomaspaulb