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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
варианты применения соединений
02. Мая 2009 :: 08:15
Печать  
вот два запроса. Второй работает значительно быстрее - раз в 8.

Код
Выбрать все
	select $РегОстатки.Номенклатура Номенклатура,$РегОстатки.Количество Количество
	from $РегистрИтоги.ОстаткиТМЦ РегОстатки
	inner join "+ИмяКурсораНоменклатура+" табНом on "+СтрПредМесяцНач+"+табНом.val=dtos(РегОстатки.period)+$РегОстатки.Номенклатура
	inner join $Справочник.Фирмы СпрФирмы on СпрФирмы.id=$РегОстатки.Фирма  
	and $СпрФирмы.ЮрЛицо=:ВыбЮрЛицо
 



Код
Выбрать все
	select $РегОстатки.Номенклатура Номенклатура,$РегОстатки.Количество Количество
	from $РегистрИтоги.ОстаткиТМЦ РегОстатки
	inner join "+ИмяКурсораНоменклатура+" табНом on "+СтрПредМесяцНач+"+табНом.val=dtos(РегОстатки.period)+$РегОстатки.Номенклатура
	left join $Справочник.Фирмы СпрФирмы on СпрФирмы.id=$РегОстатки.Фирма  
	where $СпрФирмы.ЮрЛицо=:ВыбЮрЛицо
 




И возникают вопросы:
- всегда ли быстрее left, нежели inner ?
- во втором запросе если поменять соединения местами

Код
Выбрать все
...
	left join $Справочник.Фирмы СпрФирмы on СпрФирмы.id=$РегОстатки.Фирма  
	inner join "+ИмяКурсораНоменклатура+" табНом on "+СтрПредМесяцНач+"+табНом.val=dtos(РегОстатки.period)+$РегОстатки.Номенклатура
...
 

   

- он также заметно замедляется (раз в 8). Каким образом выловить оптимальное быстродействие ?

- и главный: посоветуйте пож., как можно заглянуть в черный ящик - каким образом формируется алгоритм выполнения запроса для ole db, чтобы не тыкаться подобно слепому котенку  Улыбка
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: варианты применения соединений
Ответ #1 - 02. Мая 2009 :: 10:28
Печать  
Left всегда быстрее чем INNER - для left нужен один проход, для INNER два.
Но если на соединение тратится 10% общего времени, то выигрыш будет не более 5%.

В первом запросе неоднозначность.
Есть индекс
СпрФирмы.id
и dtos(РегОстатки.period)+$РегОстатки.Номенклатура
т.к. оптимизатор Fox не ведет статистики(по крайней мере в OLEDB) и не знает какой план предпочтительней

Лучше составлять запрос так, чтобы у оптимизатора не было выбора -
например обрамлять в подзапросы.

План выполнения можно посмотреть http://www.1cpp.ru/forum/YaBB.pl?num=1210677779
не как sql, но хоть что то

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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: варианты применения соединений
Ответ #2 - 02. Мая 2009 :: 11:26
Печать  
ага, кажется начинаю соображать, почему при изменении последовательности соединений такое замедление - когда left join впереди, то оптимизатор в первую очередь использует индекс id справочника, а потом индекс регистра - сразу в голову не пришло, спасибо, kiruha, немного прояснил

поэкспериментирую еще с подзапросами

  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать