Переключение на Главную Страницу Страницы: [1] 2 3 ... 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) Оптимизация запроса для ТП (число прочтений - 11376 )
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Оптимизация запроса для ТП
05. Марта 2008 :: 07:49
Печать  
Прошу ногами непинать, а помочь разобраться.
Пишу для ТП текст запроса.
в ТП мне надо видить следующее:
1.Код
2.Ссылку
3.Единицу измерения(периодическая у цены товара)
4.Валюту измерения (периодическая у цены товара)
5.Остаток
6.Резерв

Делаю такой запрос:
Код
Выбрать все
select
s.code,
s.id as [Аналог $Справочник.ТМЦ],
$ПоследнееЗначение.Цены.Единица(price.id,:ВыбДата) as [Ед $Справочник.Единицы],
$ПоследнееЗначение.Цены.Валюта(price.id,:ВыбДата) as [Вал $Справочник.Валюты],
$ПоследнееЗначение.Цены.Цена(price.id,:ВыбДата) as Цена,
Остатки.ОстатокТовараОстаток as Ост,
Резервы.РезервТовараОстаток as Рез
from $Справочник.Аналоги as a
inner join $Справочник.ТМЦ s on s.id=$a.Аналог
inner join $Справочник.Цены price on price.parentext=s.id
left join $РегистрОстатки.РезервыТоваров(,,Товар=?ВыбТовар(14,9),Товар,РезервТовара) Резервы on Резервы.Товар=$a.Аналог
left join $РегистрОстатки.ОстаткиТоваров(,,Товар=?ВыбТовар(14,9) and Фирма=$ПустойИД,Товар,ОстатокТовара) Остатки on
Остатки.Товар=$a.Аналог
where a.parentext=?ВыбТовар(14,9)
and $price.КатегорияЦены=?ВыбЦена(14,9)
 



Может кто меня поправить?
в более оптмальном направлении.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #1 - 05. Марта 2008 :: 10:17
Печать  
В запросе для ТП фишки типа  $ПоследнееЗначение. - это смертельно.  Надо чего-то другое придумывать... Возможно самым лучшим вариантом будет получение этих значений при выводе строки.

И $РегистрОстатки я бы тоже не стал использовать. Лучше полностью всё ручками сделать.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #2 - 05. Марта 2008 :: 10:39
Печать  
ADirks писал(а) 05. Марта 2008 :: 10:17:
В запросе для ТП фишки типа  $ПоследнееЗначение. - это смертельно.
почему?
  

1&&2&&3
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #3 - 05. Марта 2008 :: 10:46
Печать  
trad писал(а) 05. Марта 2008 :: 10:39:
ADirks писал(а) 05. Марта 2008 :: 10:17:
В запросе для ТП фишки типа  $ПоследнееЗначение. - это смертельно.
почему?

Дык это же подзапрос в селект-листе. Врядли это хорошо сочетается с Top N. Да и вообще ничего хорошего, даже и в нормальном SELECT'е.
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Оптимизация запроса для ТП
Ответ #4 - 05. Марта 2008 :: 11:00
Печать  
ADirks писал(а) 05. Марта 2008 :: 10:46:
trad писал(а) 05. Марта 2008 :: 10:39:
ADirks писал(а) 05. Марта 2008 :: 10:17:
В запросе для ТП фишки типа  $ПоследнееЗначение. - это смертельно.
почему?

Дык это же подзапрос в селект-листе. Врядли это хорошо сочетается с Top N. Да и вообще ничего хорошего, даже и в нормальном SELECT'е.


ВЫход?
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Оптимизация запроса для ТП
Ответ #5 - 05. Марта 2008 :: 11:01
Печать  
Ну я так думаю что это всетаки будет быстрее чем заполенние ТЗ при выводе строки штатными средствами?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #6 - 05. Марта 2008 :: 11:20
Печать  
Цитата:
ВЫход?

Ну так я же говорю, в событии ПриВыводеСтроки() получать эти данные и показывать. Типа:
Код
Выбрать все
	Если оТП.Колонки.ВПродаже.Видимость = 1 Тогда
		Ячейка = ОформлениеСтроки.Ячейки.Получить("ВПродаже");
		Ячейка.ОтображатьТекст	= 1;
		Ячейка.ГоризонтальноеВыравнивание = 2;

		Если фВыбранСклад = 1 Тогда
			стрКоличество = Формат(ОбъектП.ЗапросSQL("Select dbo.ОстаткиТоваровОстатокТоварСклад('"+ДатаТА+"', '"+ИдТовар+"', '"+ИдСклад+"')",,1), "Ч0");
		Иначе
			стрКоличество = Формат(ОбъектП.ЗапросSQL("Select dbo.ОстаткиТоваровОстатокТовар('"+ДатаТА+"', '"+ИдТовар+"')",,1), "Ч0");
		КонецЕсли;

		Ячейка.Текст	= стрКоличество;
	КонецЕсли;
 

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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Оптимизация запроса для ТП
Ответ #7 - 05. Марта 2008 :: 11:23
Печать  
А можно по подробнее про
dbo.ОстаткиТоваровОстатокТоварСклад
это что еще такое?
Пардон.
Это случаем на хранимая процедура или что-то типа того?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #8 - 05. Марта 2008 :: 11:47
Печать  
ADirks писал(а) 05. Марта 2008 :: 10:46:
Дык это же подзапрос в селект-листе. Врядли это хорошо сочетается с Top N.
непонятно, какова (плохая) связь между подзапросом и топN
ADirks писал(а) 05. Марта 2008 :: 10:46:
Да и вообще ничего хорошего, даже и в нормальном SELECT'е.
не пугай людей - нормально все.
легкие, работающие строго по индексам, корр.подзапросы вполне имеют право на жизнь в т.ч. и в поставщике ODBC для ТП
  

1&&2&&3
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Оптимизация запроса для ТП
Ответ #9 - 05. Марта 2008 :: 12:25
Печать  
trad писал(а) 05. Марта 2008 :: 11:47:
не пугай людей - нормально все.
легкие, работающие строго по индексам, корр.подзапросы вполне имеют право на жизнь в т.ч. и в поставщике ODBC для ТП


Соглашусь с Алексеем - никогда не надо делать подзапросы в селектлисте...
Даже если они и легкие. Ибо (кроме тормозов):
1. совсем дурной стиль
2. Рано или поздно это аукнется. Ведь функционал имеет тенденцию разрастаться.

ИМХО. В единственном случае можно сделать подзапросы в селектлисте, это когда возвращаем 1 строку с данными, полученными как раз теми самвми подзапросами.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #10 - 05. Марта 2008 :: 12:35
Печать  
у меня нет слов  Смех
  

1&&2&&3
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Оптимизация запроса для ТП
Ответ #11 - 05. Марта 2008 :: 12:36
Печать  
trad писал(а) 05. Марта 2008 :: 12:35:
у меня нет слов  Смех


А как-то поразвернутее? Для особо одаренных...
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #12 - 05. Марта 2008 :: 12:38
Печать  
Согласен с trad-ом, корелляционный подзапрос (в селект листе), это эффективнее чем отдельные запросы при выводе строки.
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #13 - 05. Марта 2008 :: 12:39
Печать  
trad писал(а) 05. Марта 2008 :: 11:47:
ADirks писал(а) 05. Марта 2008 :: 10:46:
Дык это же подзапрос в селект-листе. Врядли это хорошо сочетается с Top N.
непонятно, какова (плохая) связь между подзапросом и топN
ADirks писал(а) 05. Марта 2008 :: 10:46:
Да и вообще ничего хорошего, даже и в нормальном SELECT'е.
не пугай людей - нормально все.
легкие, работающие строго по индексам, корр.подзапросы вполне имеют право на жизнь в т.ч. и в поставщике ODBC для ТП

С топN таки да, связи нет конечно, это я неправильно выразился. Но ведь, насколько я понимаю, SQL сначала полностью формирует выборку, сортирует, и только потом выбирает N первых записей. Т.е. затраты те же, что и на запрос без топа. Если мы чуть-чуть утяжеляем получение значения в селект-листе, то затраты умножаются на размер полной выборки, а вовсе не на N как хотелось бы.

А насчёт подзапросов проверяли (именно на ТП) на предмет получения остатков из регистра, на ТА - полнейшее попадание в индекс. И то же самое делали джойном.  Как ни странно, получилось что добывать эти остатки быстрее при выводе строки.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса для ТП
Ответ #14 - 05. Марта 2008 :: 12:45
Печать  
ADirks писал(а) 05. Марта 2008 :: 12:39:
Но ведь, насколько я понимаю, SQL сначала полностью формирует выборку, сортирует, и только потом выбирает N первых записей.

Это если нет попадания в индекс (используется итератор Sort). При попадании в индекс (index seek ordered forward) обрабатывается именно N записей.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 6
ОтправитьПечать