Имя: Пароль:
1C
1С v8
Влияет ли Индексация на скорость выполнения запроса
0 Max1986
 
25.11.11
12:21
сабж.
Есть типовая УПП 1.3.11. В Общем модуле есть большой и ветвистый запрос.
Выполняется долго, идут на нем блокировки. Обращение идет к РH.ПартииТоваровНаСкладах и PC.СписанныеТовары.

Если я поставлю у этих регистров у РH.ПартииТоваровНаСкладах у измерения Номенклатура в свойствах Индексировать и тоже самое у PC.СписанныеТовары у ресурса Склад - увеличит ли скорость выполнения запроса?
1 Max1986
 
25.11.11
12:22
+(0) по этим данным идет отбор в предложении ГДЕ <...>
2 ado
 
25.11.11
12:23
Да.
3 Defender aka LINN
 
25.11.11
12:24
(1) "по этим данным идет отбор в предложении ГДЕ" - тебе ничего не поможет.
4 Max1986
 
25.11.11
12:25
(3)не понял
5 Aloex
 
25.11.11
12:27
Через ПВТ делай.
6 Max1986
 
25.11.11
12:27
вопрос еще.
Даже 2
1. Влияет ли Индексировать только на Измерение или также и на Ресурс.
Так как в первом случае это измерение, а во втором - ресурс.
7 Max1986
 
25.11.11
12:28
(5)Рад бы. Хотел пакет сделать. Но
1. эта процедура Общего модуля и вызывается отовсюду, при списании партий управленческого учета.
2. Придется ОЧЕНЬ МНОГО переделыть
2. Сказали не курочить сильно программу.
Ищу малую кровь
8 Maxus43
 
25.11.11
12:28
даже порядок измерений влияет на индексы
9 Max1986
 
25.11.11
12:32
(8)можно поподробнее? т.е. если первые 2 - часто используемые - то быстро?
Или порядок вызова в запросе после ВЫБРАТЬ <...> ?
10 Aloex
 
25.11.11
12:34
(9) Порядок в конфигурации.
11 Джинн
 
25.11.11
12:35
Индексирование повышает скорость выполнения запросов. Особенно при отборах по индексированному полю. Но уменьшает скорость записи за счет накладных затрат на поддержание индексов. Ну и увеличивает объем базы.
12 Max1986
 
25.11.11
12:35
(11)понятно.
13 hhhh
 
25.11.11
12:35
(9) попробуй не к самим регистрам обращаться, а к виртуальным таблицам - остатки, обороты.
14 Max1986
 
25.11.11
12:36
(13)так и есть
15 МихаилМ
 
25.11.11
12:37
(0)
почитайте что-то, администрирование и проектирование  ms-sql
там куча примеров удачных и не удачных применений индексов

в некоторых случаях доп индексы по 1 столбцу может даже существено
замедлить выполнение запроса.

напрмер на моей практике  отбор по условию двух колонок, отдельно проиндескированных
c одинаковой селективностью.
приводил к table scan (ms sql 2000) вместо использования любого из них.

но в запросах к бд можно указать подсказку , какой индекс использовать
а у 1с в v8 c работой с индексами - беда.

так что чисто экспериментально и причем на нагруженной системе, тк на ненагруженной отимизатор может выбрать другой план выполнения запроса.
16 ado
 
25.11.11
12:38
(9) В профразработке подробно описано, какие индексы по дефолту создаются. В конце книжки где-то.
17 Axel2009
 
25.11.11
12:38
(0) установка индексации у двух измерений не поможет, потому как будет использоваться только один индекс
18 hhhh
 
25.11.11
12:39
(14) ну тогда отбор по номенклатуре ставь не в ГДЕ, а в параметрах виртуальной таблицы - раз в 15 быстрее будет без всякого индексирования.
19 Fragster
 
гуру
25.11.11
12:40
в типовой УПП запрос распределения по партиям ускоряется в 5 раз, если его переделать на временные таблицы
20 GROOVY
 
модератор
25.11.11
12:40
(14) Тогда индексация тебе не поможет. Так как значения измерений в виртуальных таблицах и так проиндексированы. Индексация о которой ты говоришь - это индексация реальной таблицы движения. Только скорость записи в регистр упадет.
21 Axel2009
 
25.11.11
12:43
(20)+ только проиндексированы они в порядке измерений в регистре. и если там первая стоит Организация, то индексы не помогут.
22 Max1986
 
25.11.11
12:43
(19)ВОТ! Этого и хочу!
23 Max1986
 
25.11.11
12:44
(19)в этом беда! люди вводят перемещения и списания и проч - все висит
24 H A D G E H O G s
 
25.11.11
12:44
(21) Там первая - Номенклатура стоит
25 Max1986
 
25.11.11
12:44
(20)>> Так как значения измерений в виртуальных таблицах и так проиндексированы.
Почему? Там нет индекса в Запросе
26 Max1986
 
25.11.11
12:45
ВОТ БЕДА

Процедура ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ)
   ПараметрыЗапроса_ДатаОприходования = ПолучитьДанныеДляЗапроса_ДокументОприходованияДата(СпособОценкиМПЗ,"ПартииТоваровНаСкладах");

   Запрос.Текст =
   "ВЫБРАТЬ
   |    СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
   |    ПартииТоваровНаСкладах.Номенклатура,
   |    ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
   |    "+ПараметрыЗапроса_ДатаОприходования.ДокОприходованияДата_Выбор+"
   |    ПартииТоваровНаСкладах.Склад,
   |    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
   |    ПартииТоваровНаСкладах.СерияНоменклатуры,
   |    ПартииТоваровНаСкладах.Качество,
   |    ПартииТоваровНаСкладах.Заказ,
   |    ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
   |    ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
   |    ПартииТоваровНаСкладах.СтатусПартии,
   |    ВЫБОР
   |        КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
   |            ТОГДА 0
   |        ИНАЧЕ 1
   |    КОНЕЦ КАК ЧислоСерияНоменклатуры,
   |    ВЫБОР
   |        КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
   |            ТОГДА 0
   |        ИНАЧЕ ВЫБОР
   |                КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
   |                    ТОГДА 0
   |                ИНАЧЕ 1
   |            КОНЕЦ
   |    КОНЕЦ КАК ЧислоДокументОприходования,
   |    ВЫБОР
   |        КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
   |            ТОГДА 0
   |        ИНАЧЕ ВЫБОР
   |                КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
   |                    ТОГДА 1
   |                ИНАЧЕ 0
   |            КОНЕЦ
   |    КОНЕЦ КАК ЧислоЗаказ,
   |    ВЫБОР
   |        КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
   |            ТОГДА 1
   |        ИНАЧЕ 0
   |    КОНЕЦ КАК ЧислоСтатусПартии
   |ИЗ
   |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
   |        &Дат, Организация = &Организация И
   |        Номенклатура В
   |            (ВЫБРАТЬ
   |                РегистрСведений.СписанныеТовары.Номенклатура
   |            ИЗ
   |                РегистрСведений.СписанныеТовары
   |            ГДЕ
   |                РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)" + ?(ВестиПартионныйУчетПоСкладам, "
   |        И (Склад В
   |            (ВЫБРАТЬ
   |                РегистрСведений.СписанныеТовары.Склад
   |            ИЗ
   |                РегистрСведений.СписанныеТовары
   |            ГДЕ
   |                РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)", "") + ") КАК ПартииТоваровНаСкладах
   |        ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
   |            И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
   |            И (ВЫБОР
   |                КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
   |                    ТОГДА ИСТИНА
   |                ИНАЧЕ ВЫБОР
   |                        КОГДА СписанныеТовары.Качество = &ПустоеКачество
   |                            ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
   |                        ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
   |                    КОНЕЦ
   |            КОНЕЦ)
   |            " + ?(ВестиПартионныйУчетПоСкладам, "И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)", "") + "
   |            И (ВЫБОР
   |                КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
   |                        ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
   |                        ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
   |                        ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
   |                    ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
   |                ИНАЧЕ ИСТИНА
   |            КОНЕЦ)
   |    
   |        И (ВЫБОР
   |            КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
   |                ТОГДА ВЫБОР
   |                        КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
   |                            ТОГДА ВЫБОР
   |                                    КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
   |                                        ТОГДА ЛОЖЬ
   |                                    ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
   |                                КОНЕЦ
   |                        ИНАЧЕ ИСТИНА
   |                    КОНЕЦ
   |            ИНАЧЕ ВЫБОР
   |                    КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
   |                        ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
   |                    ИНАЧЕ ИСТИНА
   |                КОНЕЦ
   |        КОНЕЦ)
   |        И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
   |            ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры)
   |ГДЕ
   |    СписанныеТовары.Регистратор = &ОсновнойДокумент
   |
   |УПОРЯДОЧИТЬ ПО
   |    ЧислоСерияНоменклатуры,
   |    ЧислоДокументОприходования,
   |    ЧислоЗаказ,
   |    ЧислоСтатусПартии" + ?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобственные, " Убыв", "") + ",
   |    "+ПараметрыЗапроса_ДатаОприходования.ДокОприходованияДата_Сортировка+"
   |    ДокументОприходования" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ",
   |    ПартииТоваровНаСкладах.Склад
   |ИТОГИ ПО
   |    НомерСтрокиДокумента";
   

КонецПроцедуры // ЗаполнитьЗапросПартийНаСкладахУпр()
27 ado
 
25.11.11
12:45
(20) Ну, я б не стал так категорично. Скорость построения виртуальных таблиц опять таки может зависеть от индексации таблиц реальных.
28 Max1986
 
25.11.11
12:46
+(26)видите сколько внутренних запросов. Именно на нем и висяк.
Мучаюсь
29 Axel2009
 
25.11.11
12:46
(26) беда вот тут
И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
   |            ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры)
30 Axel2009
 
25.11.11
12:46
(29)+хотя там беда вообще беда. никаких индексов не будет использоваться
31 H A D G E H O G s
 
25.11.11
12:46
И вот тут

Номенклатура В
   |            (ВЫБРАТЬ
   |                РегистрСведений.СписанныеТовары.Номенклатура
   |            ИЗ
   |                РегистрСведений.СписанныеТовары
   |            ГДЕ
   |                РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)" + ?(ВестиПартионныйУчетПоСкладам, "
   |        И (Склад В
   |            (ВЫБРАТЬ
   |                РегистрСведений.СписанныеТовары.Склад
   |            ИЗ
   |                РегистрСведений.СписанныеТовары
   |            ГДЕ
   |                РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
32 Max1986
 
25.11.11
12:47
(31)Это я уже нашел
33 Max1986
 
25.11.11
12:47
+(32)думаю как обойти
34 Max1986
 
25.11.11
12:47
(29)почему - поясни плиз!
35 H A D G E H O G s
 
25.11.11
12:47
Вообще over 9000 перетиралась проблема - идем в поиск, и смотрим Fragster-овские решения по временным таблицам.
36 ado
 
25.11.11
12:48
(31) Ага, мне тоже эти "В" сразу не понравились.
37 acsent
 
25.11.11
12:48
(29) Почему беда? Думаешь сиквел не умеет такое разворачивать в Серия В (...)?
38 Axel2009
 
25.11.11
12:49
(31) это не такая фигня, как после Склад идет  ИЛИ Склад = &ПустойСклад)
39 Axel2009
 
25.11.11
12:49
(37) потому что ИЛИ - скан индекса по-любому.
40 Лефмихалыч
 
25.11.11
12:54
(0) не, ее придумали для солидности - чем больше галочек в конфигурацторе, тем солиднее выглядит
41 Fragster
 
гуру
25.11.11
13:08
(39) нет
42 Axel2009
 
25.11.11
13:09
(41) давай пример где да!
43 Max1986
 
25.11.11
13:11
(29)т.е. плохо потому что идет  "ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры" ?
44 Fragster
 
гуру
25.11.11
13:12
(43) плохо - потому что весь запрос фиговый
45 Max1986
 
25.11.11
13:14
(44)Знаю! Писала фирма 1с!
Хуже всего, что он исользуется постоянно массой документов
46 Fragster
 
гуру
25.11.11
13:15
ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад

кстати, можно заменить на

ПартииТоваровНаСкладах.Склад В (СписанныеТовары.Склад, &ПустойСклад)

немного иногда помогает. но это капля в море по сравнению с тем, что идет сначала соединение, а потом отбор через ГДЕ
47 Fragster
 
гуру
25.11.11
13:15
(45) нет, просто эти запросы писались на 8.0, где временных таблиц не было, а переписывать никто не берется, поскольку "работает - не трожь!"
48 Max1986
 
25.11.11
13:17
(46) >> но это капля в море по сравнению с тем, что идет сначала соединение, а потом отбор через ГДЕ
n/t EGG тормозит а написано так как сами же говорят нельзя
49 Max1986
 
25.11.11
13:17
n/t EGG  = т.е. УПП
50 Fragster
 
гуру
25.11.11
13:18
(42) перепутал со сканом таблицы. индекс скан да, идет всегда, если критичное место - заменяю на объединение
51 Max1986
 
28.11.11
13:29
А как можно переделать запрос в (26) - точнее кусок (31) в пакет?