SQL Server 2008: Присоединяйтесь к просмотре с другими видом: предварительно прибегая, не прибегая к TEMP Tables

StackOverflow https://stackoverflow.com/questions/3908823

Вопрос

Для выполнения преобразований в моей базе данных я часто использую присоединенный набор видов. В пределах представлений будут обычные таблицы выражения. Например, я бы сделал следующее:

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 представления станут медленнее, поскольку план запроса становится более сложным. Это ожидается и нормально.

Но когда я хочу присоединиться к себе часть преобразования.44, запрос чрезвычайно замедляется, когда оптимизатор пытается найти свой путь назад до исходных столов и искать индексы своего рода. Обычно это нормально, но иногда я просто хочу хранить свой временный результат и присоединиться к этому, потому что (будучи проектированием человека в истории) я за кого-то знаю, что таблица результатов будет довольно маленькой, и это будет намного быстрее присоединиться против «префектуры» этого.

Для меня есть способ написать подсказку запроса, что будет влиять на план запроса таким образом, чтобы подзапрос был предварительно приформирован, а затем присоединился к? В противном случае мне придется прибегать к Temp Tables в хранимой процедуре, но я хочу избежать его, если смогу.

Спасибо за любые предложения, и когда вы думаете, что мой дизайн отстой :-)

Это было полезно?

Решение

Вид представляет собой макрос, который расширяется: нет кэширования или предварительного вычисления предварительного расчета.

Если вы не проиндексировали мнения, где вы можете использовать NOEXPAND .. Но они не будут воока на обычных взглядах.

Тем не менее, вы можете использовать внутренний верх / заказ, чтобы материализовать представление:

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