1. user1119853 06.01.19 01:09 Сейчас в теме

Оптимизация запроса к виртуальной таблице остатков

есть запрос по остаткам.
ВЫБРАТЬ
						  |	ОстаткиОстатки.Товар КАК Товар,
						  |	ОстаткиОстатки.Склад,
						  |	ОстаткиОстатки.Сектор,
						  |	ОстаткиОстатки.Ячейка,
						  |	ОстаткиОстатки.МеркурийПартия,
						  |	ОстаткиОстатки.Сектор.Сортировка КАК Приоритет,
						  |	ОстаткиОстатки.ОстатокОстаток - ОстаткиОстатки.РезервОстаток КАК Остаток,
						  |	ОстаткиОстатки.БазСуммаОстаток КАК База,
						  |	ОстаткиОстатки.ВалСуммаОстаток КАК Вала,
						  |	ОстаткиОстатки.ОстатокОстаток КАК Всего
						
						  |ИЗ
						  |	РегистрНакопления.Остатки.Остатки(, Товар В (&Товары)) КАК ОстаткиОстатки
						  |ГДЕ
						  |	ОстаткиОстатки.ОстатокОстаток - ОстаткиОстатки.РезервОстаток > 0
Показать

В параметры виртуальной таблицы передается список товаров. Знаю, что при небольшом списке происходит поиск по индексу, если список большой, запрос преобразуется в товар1 или товар2 и т.д. (т.е. происходит сканирование)
Как оптимизировать данный запрос?
Ответы
Избранное Подписка Сортировка: Древо
3. Dream_kz 83 06.01.19 08:39 Сейчас в теме
(1)
если список большой, запрос преобразуется в товар1 или товар2 и т.д. (т.е. происходит сканирование)

Нормально там все будет, проблемы будут если в ИЛИ условия на разные поля
dhurricane; +1 Ответить
4. bashirov.rs 18 06.01.19 08:57 Сейчас в теме
(1) Согласен со сканированием таблицы. Здесь еще зависит от индексирования реквизита "Товар" в рег.накопления или если нет индексирования по этому реквизиту, то надо посмотреть на какой позиции в структуре рег.накопления находится реквизит
(пример:
1. Склад (по умолчанию индексируется)
2. Подразделение
3. Товар
1. Количество
2. Сумма).
Если на первом месте идут склады или еще что-то, а потом только товар, то желательно добавить отборы по складу или еще по какому-нибудь реквизиту.
6. user1119853 07.01.19 13:02 Сейчас в теме
(4)
(1) Согласен со сканированием таблицы. Здесь еще зависит от индексирования реквизита "Товар" в рег.накопления или если нет индексирования по этому реквизиту, то надо посмотреть на какой позиции в структуре рег.накопления находится реквизит

В регистре порядок следующий:
Товар, Склад, Сектор, Ячейка.
Вообще вроде по умолчанию создается кластерный индекс со всеми измерениями в порядке данном.
5. Sashares 1 06.01.19 14:22 Сейчас в теме
(1)
Как оптимизировать данный запрос?

А есть смысл оптимизировать?
Сколько времени выполняется запрос?
7. user1119853 07.01.19 13:12 Сейчас в теме
(5)
Выполняется запрос, если выставить условия только по товару от 0.1 до 1 секунды в зависимости от количества товара в условии. Если в условии небольшое количество, то идет поиск по индексу. Вообще в итоговом запросе кроме товара, есть ограничения по складу и сектору. Вот в данном случае запрос может до 8 секунд выполняться: (Товар В (&Товары), Склад В (&Склады), Сектор В &(Сектора)).
К примеру при проводке 19 накладных выполняется запрос - 60 секунд со всеми условиями.
Что пробовал сам:
1.В условие подавать декартово произведение (выполняется для 19 накладных около 25 секунд):
(Товар, Склад, Сектор) В (Выбрать ВТ_Товары.Товар, ВТ_Склады_Сектора.Склад, ВТ_Склады_Сектора.Сектор ИЗ ВТ_Товары, ВТ_Склады_Сектора)
2. Быстрее всего работает запрос с условием только по товару, помещение во временную таблицу и потом отбор по складу и сектору. (для 19 накладных 8 секунд). Но на мой взгляд я лишние строки из регистра блокирую.
8. TODD22 17 07.01.19 14:36 Сейчас в теме
(7)
Но на мой взгляд я лишние строки из регистра блокирую.

Блокируешь чем? Чтение ничего не блокирует, блокировка управляемая?
Какая конфигурация?
9. user1119853 07.01.19 16:09 Сейчас в теме
(8)
Блокируешь чем? Чтение ничего не блокирует, блокировка управляемая?

8.2
10. user1119853 11.01.19 17:26 Сейчас в теме
(5)смысл есть, так как применив описанное ниже, блокировки остались
11. Sashares 1 11.01.19 17:56 Сейчас в теме
(10)Могу предложить попробовать вынести за этот запрос строку:
ОстаткиОстатки.Сектор.Сортировка КАК Приоритет,


А в запросе выбрать только Сектор.
Сортировку получать отдельным запросом, после выполнения этого.
Возможно будет лучше.
12. user1119853 11.01.19 20:15 Сейчас в теме
(11)
(10)Могу предложить попробовать вынести за этот запрос строку:

Попробую, отпишусь!
13. user1119853 11.01.19 20:37 Сейчас в теме
(12)Попробовал, на времени вообще не сказалось(
14. TODD22 17 11.01.19 20:43 Сейчас в теме
(13)А если попробовать убрать секцию ГДЕ? изменится время?
15. user1119853 11.01.19 20:54 Сейчас в теме
(14)Попробовал, тоже нуль эффекта, а если я все таки остановлюсь на временных таблицах и отборе уже в ней по складу и сектору, как самом быстром варианте. Блокируются в транзакции у меня считанные строки с регистра будут(то есть все товары без отбора по складу и сектору) ?или уже отобранные во временной?
16. TODD22 17 11.01.19 21:10 Сейчас в теме
(15)https://infostart.ru/public/629017/
Попробуйте рекомендации из этой статьи, может чем то помогут... это для параллельности работы. Запрос не ускорится.

А если запрос делать по товару и складу, результат поместить в ВТ, а потом уже в ВТ по сектору?

Сектор это что за аналитика? Дополнительная аналитика внутри склада?
17. user1119853 11.01.19 21:50 Сейчас в теме
(16)
А если запрос делать по товару и складу, результат поместить в ВТ, а потом уже в ВТ по сектору?

Да, склад разбит по секторам. Спасибо за рекомендации!
20. user1119853 15.01.19 16:21 Сейчас в теме
(17)В общем потестил, быстрее всего работает поиск по товару и складу. Но! К примеру у меня 50 товаров и 20 складов. Работает ваще быстро около 0.4 секунды. Проблема другая -блокируется вся таблица и все( Почему блокируется вся таблица понять не могу. Вроде в профайлере глянул идет clustered index seek.
22. user1119853 15.01.19 16:55 Сейчас в теме
(20) Щас попробовал взять с 8 товарами. Та же фигня( С 5 товаров блокирует только записи( Печалька прям какая то !
23. user1119853 15.01.19 17:17 Сейчас в теме
(22)При 5 товарах тоже блочит таблицу(
24. user1119853 15.01.19 17:47 Сейчас в теме
(23)Может проблема вообще в sql server ? потому что глянул еще раз запрос в профайлере - план оптимален - сканирования нет.
2. DNN13 06.01.19 07:53 Сейчас в теме
программно формировать текст запроса, сделать объединение, где в каждом запросе &Товар = Товар
18. Onwardv 14.01.19 10:56 Сейчас в теме
Можно попробовать использовать реальные таблицы.
Если посмотрите план по запросу из виртуальных таблиц, то он будет иметь вид:
Sel ect * from (select *, MAX (период) fr om реальная_таблица).

По регистрам накопления не пробовал, а свой срез последних по Регистру сведений, как правило, всегда давал прибавку к быстродействию. Сначала получаете максимальный период, а затем по этому периоду опять соединяетесь с регистром.

Для понимания логики:
Выбрать 
  Товар.Товар, 
   Максимум(Остаток.Период)  КАК ПоследнийПероиодОстатков
Поместить ВТ_ПоследниеДвиженияПоТовару.
  ИЗ Товар Как Товар 
левое соединение РегистрНакопления.Остатки Как Остаток
ПО Товар.Товар = Остаток.Товар


Затем получаете сами остатки:
Выбрать ВТ_ПоследниеДвиженияПоТовару.Товар,
   Остатки.ОстатокОстаток - Остатки.РезервОстаток КАК Остаток
ИЗ ВТ_ПоследниеДвиженияПоТовару  КАК ВТ_ПоследниеДвиженияПоТовару
Левое соединение РегистрНакопления.Остатки Как Остатки
    ПО ВТ_ПоследниеДвиженияПоТовару.Товар = Остатки.Товар
         И ВТ_ПоследниеДвиженияПоТовару.ПоследнийПероиодОстатков= Остатки.Период
ГДЕ 
   Остатки.ОстатокОстаток - Остатки.РезервОстаток >0
25. user1119853 16.01.19 16:06 Сейчас в теме
(18)
Для понимания логики:

Довольно таки интересная идея. Завтра попробую! Спасибо!
19. meriferi 14.01.19 11:05 Сейчас в теме
"Товар В (&Товары)" вынеси в условие или используй временную таблицу и выноси только нужные поля
21. user1119853 15.01.19 16:50 Сейчас в теме
(19)
"Товар В (&Товары)" вынеси в условие или используй временную таблицу и выноси только нужные поля

Чем это поможет? поля все нужны, а вот вытащить параметры вирт таблицы в условие не поможет.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Москва
Полный день

Программист 1С
Видное
Полный день

Программист 1С
Москва
зарплата до 120 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день