2016-09-17 6 views
3

У меня есть SQL заявление, как этотИзбавление от дорогого автообъединение

SELECT 
    pa.col1, 
    SUM(ps.col2) col2, 
    SUM(psl.col2) col2_previous_month 
FROM 
    pa 
LEFT JOIN 
    ps ON pa.Id = ps.Id AND ps.date = @currDate 
LEFT JOIN 
    ps as psl ON psl.Id = ps.Id AND psl.date = dateadd(month, - 1, @currDate) 
GROUP BY 
    pa.col1; 

Этот SQL называется часто и поскольку таблица ps имеет 100M строк левый присоединиться больно. Есть ли способ переписать это с помощью левой Join?

С уважением Ник

+1

Что должен делать этот запрос? Можете ли вы предоставить некоторые примеры данных и требуемый результат? – Mureinik

+1

индексирует столбец даты в 'ps' опцию? – dlatikay

+0

В столбце даты есть индекс, но сервер sql использует хеш-соединение и не использует индекс –

ответ

2

Возможно, это поможет

Select pa.col1 
      ,col2  =isnull(sum(case when [email protected]     then ps.col2 else null end),0) 
      ,col2_prior=isnull(sum(case when ps.date=dateadd(month,-1,@currDate) then ps.col2 else null end),0) 
    From pa 
    JOIN ps as ps ON pa.Id = ps.Id 
     and ps.date in (@currDate,dateadd(month,-1,@currDate)) 
    Group By pa.col1 
+0

Я тоже подумал об этом. Но вы забыли GROUP BY –

+0

@ThomasG Хороший улов! Спасибо. обновленный –

1

Если запрос Джона не поможет вы также можете попробовать это:

SELECT 
    pa.col1 
    ,SUM(ps1.col2) col2 
    ,SUM(ps2.col2) col2_previous_month 

FROM pa 

    LEFT JOIN 
     (
      SELECT col2 
      FROM ps 
      WHERE date = @currDate 
     ) ps1 ON ON pa.Id = ps1.Id   

    LEFT JOIN 
     (
      SELECT col2 
      FROM ps 
      WHERE date = dateadd(month, - 1, @currDate) 
     ) ps2 ON ON pa.Id = ps2.Id 

GROUP BY pa.col1; 

Я думал к нему после того, как прочитав ваши комментарии.

Это точно так же, как и ваш первоначальный запрос, за исключением того, что я переместил поиск по датам внутри вложенного запроса, что может помочь оптимизатору правильно использовать индекс.

0

Запрос выглядит хорошо. Для того, чтобы иметь это выполнить быстро, вы должны иметь следующие показатели:

  • ра (идентификатор)
  • пс (идентификатор, дата)

Если вы хотите, это еще быстрее, использование индексов покрытия :

  • ра (идентификатор, col1)
  • пс (ID, дата, col2)
Смежные вопросы