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