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

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

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

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

В регистре порядок следующий:
Товар, Склад, Сектор, Ячейка.
Вообще вроде по умолчанию создается кластерный индекс со всеми измерениями в порядке данном.
+
5. Sashares 34 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 18 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 34 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 18 11.01.19 20:43 Сейчас в теме
(13)А если попробовать убрать секцию ГДЕ? изменится время?
+
15. user1119853 11.01.19 20:54 Сейчас в теме
(14)Попробовал, тоже нуль эффекта, а если я все таки остановлюсь на временных таблицах и отборе уже в ней по складу и сектору, как самом быстром варианте. Блокируются в транзакции у меня считанные строки с регистра будут(то есть все товары без отбора по складу и сектору) ?или уже отобранные во временной?
+
16. TODD22 18 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. Dmitrij-2 45 06.01.19 07:53 Сейчас в теме
программно формировать текст запроса, сделать объединение, где в каждом запросе &Товар = Товар
+
18. Onwardv 64 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)
"Товар В (&Товары)" вынеси в условие или используй временную таблицу и выноси только нужные поля

Чем это поможет? поля все нужны, а вот вытащить параметры вирт таблицы в условие не поможет.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот