Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Оптимизация запроса (число прочтений - 2774 )
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Оптимизация запроса
27. Апреля 2013 :: 13:47
Печать  
Есть к примеру такой простой запрос:
SELECT
|ДокСтроки.ТМЦ [ТМЦ $Справочник.Номенклатура]
|,SUM(ДокСтроки.СуммаСНДС) [Выручка $Число.18.2]
|, СпрТМЦ.ВидДеятельности [Вид $Справочник.ВидыДеятельности]
|FROM [ДокументСтроки.НакладнаяТоварыОпт] as ДокСтроки
|LEFT  JOIN [Справочник.Номенклатура]  AS СпрТМЦ ON ДокСтроки.ТМЦ =  СпрТМЦ.ID
|GROUP BY ДокСтроки.ТМЦ,СпрТМЦ.ВидДеятельности;
Т.е. из табличной части документа достаем ТМЦ и реквизит ТМЦ Вид Деятельности, в таб. части может быть несколько одних и тех же элементов ТМЦ!
Внимание вопрос: Этот запрос с начало группирует (сворачивает) данные, а потом Присоединяет  данные из таблицы виды деятельности или нет? В случаи "нет" получается что запрос не оптимальный так как если 1000 одного и того элемента будет столько раз присоединение к таблице Виды деятельности!

P.S. Я начинаю только разбираться с SQL запросами, если этот вопрос  кому-то глупым покажется
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Оптимизация запроса
Ответ #1 - 27. Апреля 2013 :: 14:05
Печать  
И еще вопросик по оптимизации, есть запрос вида (упрощенный, суть думаю понятно):
SELECT
|Док,
|ТМЦ,
|SUM(Выручка),
|SUM (Проводки.Сумма)
|FROM ДокументСтроки
|LEFT  JOIN (SELECT <здесь выбираются данные из табл. проводки и группируются>) As Проводки
|ON Проводки.ДокИД = Док AND  |Проводки.Субконто  = ТМЦ
|GROUP BY Док, ТМЦ

Если выполнять эти запросы по отдельности, то вместе займет максимум одна секунда! Если так как показано выше то минуты 2! Не ужели процедура соединения занимаю время 2 минуты (99,9% времени)????? Может лучше загонять в  временные таблицы и потом соеденять? Или соединять через объект ИндексированнаяТаблица? Кто как считает?

  
Наверх
 
IP записан
 
Phoenix
Senior Member
****
Отсутствует


itpath.ru

Сообщений: 398
Местоположение: Москва
Зарегистрирован: 15. Июня 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #2 - 27. Апреля 2013 :: 15:57
Печать  
Используй временные таблицы
  

Лень двигатель прогресса.&&http://www.itpath.ru&&;
Наверх
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Оптимизация запроса
Ответ #3 - 27. Апреля 2013 :: 16:01
Печать  
По второму своему вопросу! По тестил через ИндексированнуюТаблицу (по отдельности выполнил запросы в ИндекТаблицу и соединил их) получилось 12 сек времени всего, если запросом то 168 сек! По пробую через временные таблицы еще чуть поже!
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Оптимизация запроса
Ответ #4 - 27. Апреля 2013 :: 16:14
Печать  
Просто хочу понять в чем разница если заменить (SELECT <здесь выбираются данные из табл. проводки и группируются>)  на временную таблицу! Почему должно через временную таблицу работать быстрей? Когда выборка в теле запроса, запрос может несколько раз выбирает эти данные, а когда временная таблица нет……..???Так по логике какая разница загнать в временную таблицу или создавать таблицу во время запроса? Мне казалось что с временной наоборот должно дольше как никак теряется время на укладку объекта
  
Наверх
 
IP записан
 
Phoenix
Senior Member
****
Отсутствует


itpath.ru

Сообщений: 398
Местоположение: Москва
Зарегистрирован: 15. Июня 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #5 - 27. Апреля 2013 :: 21:11
Печать  
когда 2 физ таблицы, в которых определено количество записей - лучше работает оптимизатор.
как-то так.
  

Лень двигатель прогресса.&&http://www.itpath.ru&&;
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать