Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли оптимизировать запрос  [new]
Latyshev.MV
Member

Откуда:
Сообщений: 6
смысл запроса: выбираются бухгалтерские остатки на определенную дату
меня смущает четыре одинаковых left join (это аналитики счета)

SELECT
    a.ID as id
  , a.code as acc_code
  , anal1.anal1_code as anal1_code ,anal1.anal1_name as anal1_name
  , cast(anal2.anal2_id as varchar) + '@@@' + dbo.TRIM(mes.code) as tmc_id
  , anal2.anal2_code as anal2_code ,anal2.anal2_name as anal2_name
  , anal3.anal3_code as anal3_code ,anal3.anal3_name as anal3_name
  , anal4.anal4_code as anal4_code ,anal4.anal4_name as anal4_name
  , sum(BH.basesum) as sum
  , sum(BH.msrvalue) as quantity
  , mes.code as mes_code
FROM ac_Account A
   inner join ac_XBaseHeels BH on BH.BaseReg_ID = A.id
   inner join cd_grandobject mes on mes.id = BH.measure_id
   left join (SELECT SA1.Serie_ID, g1.code as anal1_code, g1.name as anal1_name
              FROM ac_XSelAnalytics SA1 inner join cd_grandobject g1 on g1.id = SA1.elementanalytic
              WHERE SA1.Analytics_ID = 7711441506 ) anal1 on anal1.Serie_ID = BH.Serie_ID
   left join (SELECT SA2.Serie_ID, g2.id as anal2_id, g2.code as anal2_code, g2.name as anal2_name
              FROM ac_XSelAnalytics SA2 inner join cd_grandobject g2 on g2.id = SA2.elementanalytic
              WHERE SA2.Analytics_ID = 7711441512 ) anal2 on anal2.Serie_ID = BH.Serie_ID
   left join (SELECT SA3.Serie_ID, g3.code as anal3_code, g3.name as anal3_name
              FROM ac_XSelAnalytics SA3 inner join cd_grandobject g3 on g3.id = SA3.elementanalytic
              WHERE SA3.Analytics_ID = 7711441507 ) anal3 on anal3.Serie_ID = BH.Serie_ID
   left join (SELECT SA4.Serie_ID, g4.code as anal4_code, g4.name as anal4_name
              FROM ac_XSelAnalytics SA4 inner join cd_grandobject g4 on g4.id = SA4.elementanalytic
              WHERE SA4.Analytics_ID = 1008303167703 ) anal4 on anal4.Serie_ID = BH.Serie_ID
WHERE
  A.code like '20%'
  AND ( '2013-01-01' BETWEEN BH.DateFrom AND BH.DateTo )
GROUP BY
  A.ID, a.code
  , anal1_code, anal1_name
  , anal2_id, anal2_code, anal2_name
  , anal3_code, anal3_name
  , anal4_code, anal4_name
  , mes.code
HAVING (sum(BH.basesum)  <> 0 or SUM(BH.msrvalue) <> 0)
ORDER BY
  a.code


Заранее спасибо!

Сообщение было отредактировано: 22 авг 13, 11:00
22 авг 13, 10:59    [14740088]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
сделайте 1 джойн и case по SA1.Analytics_ID в выводе
22 авг 13, 11:14    [14740160]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
вот тут было
тынц
22 авг 13, 11:17    [14740175]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Мистер Хенки
сделайте 1 джойн и case по SA1.Analytics_ID в выводе
не получится без PIVOT


Latyshev.MV
меня смущает четыре одинаковых left join (это аналитики счета)
Ничего страшного.

Непонятно только, почему они в вижде подзопросов, а не обычных left join?

А вообще анализируйте план запроса, ну и посмотрите, что там с индексами на A.code, BH.DateFrom, BH.DateTo, BH.BaseReg_ID, ac_XSelAnalytics.Serie_ID, ac_XSelAnalytics.elementanalytic
22 авг 13, 11:23    [14740218]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Latyshev.MV
Member

Откуда:
Сообщений: 6
alexeyvg
Latyshev.MV
меня смущает четыре одинаковых left join (это аналитики счета)
Ничего страшного.


Мне кажется, что можно сделать более красиво. Запрос выполняется около 6 сек, а в отчете будет 4 аналогичных запросов.

alexeyvg
Непонятно только, почему они в вижде подзопросов, а не обычных left join?


Мы перешли с Информикса на MSSQL, и я начинаю разбираться почти с нуля, переписал запрос как смог.

alexeyvg
А вообще анализируйте план запроса, ну и посмотрите, что там с индексами на A.code, BH.DateFrom, BH.DateTo, BH.BaseReg_ID, ac_XSelAnalytics.Serie_ID, ac_XSelAnalytics.elementanalytic


База не наша, внутрь лазить нельзя, соответственно индексы менять или добавлять нельзя.
Львиная доля уходит на Clustered Index Seek, но повторюсь, индексы трогать не могу.

Если бы это была моя задача, то я сделал бы вьюшку или функцию вместо подзапросов, думаю было бы быстрее.
22 авг 13, 12:23    [14740801]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Latyshev.MV
Мне кажется, что можно сделать более красиво. Запрос выполняется около 6 сек, а в отчете будет 4 аналогичных запросов.

Ну так предложили же 1 left join с case-ми
22 авг 13, 12:26    [14740832]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Latyshev.MV
Если бы это была моя задача, то я сделал бы вьюшку или функцию вместо подзапросов, думаю было бы быстрее.
С функциями было бы медленее, с вьюшкой так же.
Glory
Ну так предложили же 1 left join с case-ми
Тогда ведь придётся в клиенте форматировать, если без PIVOT?
22 авг 13, 13:53    [14741576]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
alexeyvg
Тогда ведь придётся в клиенте форматировать, если без PIVOT?

У автора 4 одинакавых подзапроса, различающихся только константой
Причем тут PIVOT ?
22 авг 13, 13:56    [14741602]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Latyshev.MV
Member

Откуда:
Сообщений: 6
Всем спасибо, сделал чараз обычные left join

inner join ac_XBaseHeels BH on BH.BaseReg_ID = A.id
inner join cd_grandobject mes on mes.id = BH.measure_id
left join ac_XSelAnalytics SA1 on BH.Serie_ID = SA1.Serie_ID AND SA1.Analytics_ID = 7711441506
left join ac_XSelAnalytics SA2 on BH.Serie_ID = SA1.Serie_ID AND SA2.Analytics_ID = 7711441512
left join ac_XSelAnalytics SA3 on BH.Serie_ID = SA1.Serie_ID AND SA3.Analytics_ID = 7711441507
left join ac_XSelAnalytics SA4 on BH.Serie_ID = SA1.Serie_ID AND SA4.Analytics_ID = 1008303167703
left join cd_grandobject g1 on SA1.elementanalytic = g1.id-- AND ( g1.id = :m_sklad or 1 = :chek6)
left join cd_grandobject g2 on SA2.elementanalytic = g2.id
left join cd_grandobject g3 on SA3.elementanalytic = g3.id
left join cd_grandobject g4 on SA4.elementanalytic = g4.id


Glory
Latyshev.MV
Мне кажется, что можно сделать более красиво. Запрос выполняется около 6 сек, а в отчете будет 4 аналогичных запросов.

Ну так предложили же 1 left join с case-ми


вроде как без PIVOT нельзя, а я не знаю что это, сейчас буду просвящаться

alexeyvg
Glory
сделайте 1 джойн и case по SA1.Analytics_ID в выводе

не получится без PIVOT
22 авг 13, 13:59    [14741629]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Latyshev.MV
вроде как без PIVOT нельзя, а я не знаю что это, сейчас буду просвящаться

Это в мемориз - Я не знаю, что такое PIVOT, но без него нельзя
22 авг 13, 14:02    [14741647]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Latyshev.MV,

без PIVOTа не то что "нельзя", а надо.
Это абсолютно лишняя конструкция SQL! IMHO, конечно.
22 авг 13, 14:26    [14741852]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
iap
Latyshev.MV,

без PIVOTа не то что "нельзя", а надо.
Это абсолютно лишняя конструкция SQL! IMHO, конечно.

не лишняя, просто сильно не оптимизированная на текущий момент
22 авг 13, 14:30    [14741890]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Glory
alexeyvg
Тогда ведь придётся в клиенте форматировать, если без PIVOT?

У автора 4 одинакавых подзапроса, различающихся только константой
Причем тут PIVOT ?
В смысле?
4 запроса возвращают 4 записи для одной BH.Serie_ID
Ему нужно для одной BH.Serie_ID вывести в одной строке 4 поля из этих 4-х записей (по одному полю из каждой записи).
Понятно, что нужно сделать 4 джойна, либо сделать один и PIVOT для разворачивания результата.
iap
Это абсолютно лишняя конструкция SQL! IMHO, конечно.
Ну что так категорично...
Ничего страшного, если результат развернёт не клиент, а сервер, это же принципиально неважно.
Даже на сервере лучше, меньше будет загружаться сеть, проще передавать результат.
Другое дело, что PIVOT несколько недоделан функционально и:
Ivan Durak
сильно не оптимизированная на текущий момент
22 авг 13, 14:59    [14742133]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
alexeyvg
В смысле?
4 запроса возвращают 4 записи для одной BH.Serie_ID
Ему нужно для одной BH.Serie_ID вывести в одной строке 4 поля из этих 4-х записей (по одному полю из каждой записи).
Понятно, что нужно сделать 4 джойна, либо сделать один и PIVOT для разворачивания результата.

Запрос уже выводит то, что нужно.
Из каждого подзапроса берутся только какие-то кода/наименования
22 авг 13, 15:03    [14742166]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
alexeyvg
iap
Это абсолютно лишняя конструкция SQL! IMHO, конечно.
Ну что так категорично...
Это я нарочно

Но действительно не понимаю, зачем эта конструкция
вместо ясной и понятной агрегатной функции с CASE внутри?
22 авг 13, 15:09    [14742222]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить