Повторное использование выбора подзапроса / результата - PullRequest
2 голосов
/ 30 ноября 2010

Я пытаюсь оптимизировать скорость запроса, который использует избыточный блок запроса.Я пытаюсь выполнить построчное объединение в SQL Server 2008, используя запрос, приведенный ниже.

Select * from 
(<complex subquery>) cq
join table1 t1 on (cq.id=t1.id)
union
Select * from  
<complex subquery> cq
join table2 t2 on (cq.id=t2.id)

<complex subquery> абсолютно одинаково для обеих частей подзапроса union, за исключением того, что нам нужно присоединиться к нему с помощьюнесколько разных таблиц для получения одинаковых столбчатых данных.

Можно ли как-нибудь переписать запрос, чтобы ускорить его, не используя временную таблицу для кэширования результатов?

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

Почему бы не использовать временную таблицу и посмотреть, не улучшает ли это статистику выполнения?

В некоторых случаях Оптимизатор запросов автоматически добавляет катушку в план, который кэширует подзапросы, хотя в основном это временная таблица..

Вы проверили текущий план, чтобы убедиться, что запрос на самом деле оценивается более одного раза?

1 голос
/ 30 ноября 2010

Без конкретного примера сложно помочь, но попробуйте оператор WITH, например:

WITH csq(x,y,z) AS (
  <complex subquery>
)
Select * from 
 csq
join table1 t1 on (cq.id=t1.id)
union
Select * from  
 csq
join table2 t2 on (cq.id=t2.id)

это иногда ускоряет вещи без конца

0 голосов
/ 30 ноября 2010

Позволяет ли природа вашего запроса инвертировать его?Вместо "(присоединиться, присоединиться) объединение", сделать "(объединение) присоединиться"?Например:

Select * from
(<complex subquery>) cq
join (
    Select * from table1 t1
    union 
    Select * from table2 t2
) ts
on cq.id=ts.id

Я не совсем уверен, что двойная оценка вашего сложного запроса на самом деле не так.Но, согласно вашему вопросу, это была бы форма запроса, которая поощряла бы SQL оценивать <complex query> только один раз.

...