Производная таблица выполняется один или три раза? - PullRequest
0 голосов
/ 04 мая 2010

Каждый раз, когда вы используете производную таблицу, этот запрос будет выполняться. При использовании CTE этот набор результатов возвращается один и только один раз в пределах одного запроса.

Указывает ли в кавычке, что следующий запрос приведет к выполнению производной таблицы три раза (по одному разу для каждого вызова агрегатной функции):

  SELECT 
    AVG(OrdersPlaced),MAX(OrdersPlaced),MIN(OrdersPlaced)
  FROM (
    SELECT
        v.VendorID,
        v.[Name] AS VendorName,
        COUNT(*) AS OrdersPlaced
    FROM Purchasing.PurchaseOrderHeader AS poh
    INNER JOIN Purchasing.Vendor AS v ON poh.VendorID = v.VendorID
    GROUP BY v.VendorID, v.[Name]
  ) AS x

1008 * спасибо *

Ответы [ 3 ]

2 голосов
/ 04 мая 2010

CTE или вложенный (некоррелированный) подзапрос обычно не имеют другого плана выполнения. Использование CTE или подзапроса никогда не влияло на буферизацию промежуточных запросов.

Что касается ссылки Тони Роджерсона - явная временная таблица работает лучше, чем самосоединение с CTE, поскольку она лучше индексируется - много раз, когда вы выходите за пределы декларативного SQL и начинаете предвидеть рабочий процесс для движка, может получить лучшие результаты.

Иногда преимущество более простого и более обслуживаемого запроса со многими многоуровневыми CTE вместо сложного процесса с несколькими временными таблицами перевешивает преимущества производительности процесса с несколькими таблицами. Подход, основанный на CTE, - это отдельный оператор SQL, который не может быть так тихо нарушен случайно закомментированным шагом или изменением схемы.

2 голосов
/ 04 мая 2010

Нет, это должен быть один проход, взгляните на план выполнения

вот пример, где что-то будет выполняться для каждой строки в таблице table2

    select *,(select COUNT(*) from table1 t1 where t1.id <= t2.id) as Bla
     from table2 t2

Такие вещи с текущими счетчиками будут срабатывать для каждой строки в таблице table2

1 голос
/ 04 мая 2010

Вероятно, нет, но он может испортить полученные результаты, так что ему нужен только один раз.

В этом случае не должно быть никакой разницы между CTE и производной таблицей.

Откуда цитата?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...