Имя: Пароль:
1C
1С v8
Производительность запросов.
0 Novus_Dess
 
05.05.15
14:27
Вопрос на засыпку. Какой из запросов выполнится быстрее при наличии 1000 документов между датой1 и датой2.
СписокДоков состоит зи 1000 документов и это единственные документы между датой1 и датой2.

Выбрать * из Регистр где Регистр.Регистратор в (&СписокДоков)    Выбрать * из регистр где Регистр.Период между &Дата1 и &Дата2

Пошел запускать на базе замер производительности, а пока может кто ответит :)
1 SeraFim
 
05.05.15
14:29
Думаю, что второй =)
2 МаксимМП23
 
05.05.15
14:31
Тоже склоняюсь ко второму. Ибо первая конструкция на уровне СУБД будет выглядеть интересно.
3 qeos
 
05.05.15
14:34
все завизит от архитектуры, в большинстве случаев будет второй быстрее..
4 dk
 
05.05.15
14:36
чо тут думать
1000 сравнений 2-х дат
и
1000 поисков 1 из 1000
5 hhhh
 
05.05.15
14:39
(4) всё-таки не поиски там, а прямое обращение по ссылкам.
6 Necessitudo
 
05.05.15
14:40
А виртуальной таблицы у регистра нету?
7 MadHead
 
05.05.15
14:41
(5) а "прямое обращение по ссылка" это что такое? Не поиск ли по инддексированному полю гуид?
8 Ёпрст
 
05.05.15
14:44
(0) первый
9 hhhh
 
05.05.15
14:52
(7) но это быстрее, чем сравнение с двумя датами.
10 AlexTim03
 
05.05.15
14:53
Посмотри 2 плана запросов, узнаешь ответ
11 AlexTim03
 
05.05.15
14:53
И нам расскажи
12 Fragster
 
гуру
05.05.15
14:54
по периоду кластерный индекс. при запросе по датам будет использваотсья всегда.
по ссылкам - некластерный. В зависимости от количества данных - либо будет использоваться кластерный, либо по ссылке. В любом случае это будет медленнее
13 leonidkorolev
 
05.05.15
14:55
В первом запросе план получается на много сложнее и медленнее. Поиск по некластреризованному индексу типов документов и затем вложенный цикл со списком документов

Вот втором случае очень компактный план и поиск по кластерному индексу.

Второй быстрее не порядок.
14 SUA
 
05.05.15
14:57
2й поидее быстрее
потому что условие проще
и оба поля индексированы
одинаковые они в случае когда Регистр.Дата В(&СписокДат)
это не считая составных типов что уже заметили
15 Bober
 
05.05.15
14:57
(0)
I. если в параметре &СписокДоков будет только один тип документов, то будет работать быстро, если там несколько типов документов, то нужно разбивать это запрос несколько, например:
ВЫБРАТЬ * ИЗ Регистр где Регистратор в (&СписокДоковТип1)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ * ИЗ Регистр где Регистратор в (&СписокДоковТип2)

II если там более 1к документов, то лучше это через временную таблицу реализовать, 1с не рекомендует передавать в параметрах большие объемы значений.

III Так, что если 1к документов укладываются в отбор через период, то лучше использовать его (при условии что это частый запрос к базе, а не какае-то разовая акция).
16 Fragster
 
гуру
05.05.15
14:58
(15) куита
17 Novus_Dess
 
05.05.15
15:00
По результатам 5 замеров. примерно одинаково
https://yadi.sk/i/U2qkA-WSgSCoM
18 Novus_Dess
 
05.05.15
15:00
База файловая.
19 Bober
 
05.05.15
15:01
(16) кому как.
20 Fragster
 
гуру
05.05.15
15:01
(17) эээ. более, чем в полтора раза - это одинаково?
21 Fragster
 
гуру
05.05.15
15:01
ну и да - измерять на одном выполнении запроса - несколько странно
22 Novus_Dess
 
05.05.15
15:03
одинаково - всмысле примерно одинаковые результаты всех 5 замеров.
23 Novus_Dess
 
05.05.15
15:03
да, в полтора раза медленнее работает запрос с регистратором
24 leonidkorolev
 
05.05.15
15:04
(17) Заголовок порадовал
(22) А какой вариант быстрее получился?
25 leonidkorolev
 
05.05.15
15:04
(23) ок, понял
26 Bober
 
05.05.15
15:06
(20) ну а где ты прочитал про одинаково?
27 kosts
 
05.05.15
15:11
Замер не корректный. Может после первого запроса данные в памяти и второй запрос из-за этого быстрее работает.
28 Novus_Dess
 
05.05.15
15:13
(27) Ваше предложение? Две отдельных обработки?
29 kortun
 
05.05.15
15:14
ага, а давайте теперь еще к куску кода добавим сравнение на проведенность, сравнение на контрагента и вид операции

добавим еще условие по складу

и вот тут то уже сравнение со списком документов быстрее будет отрабатывать
30 Novus_Dess
 
05.05.15
15:15
(29) Это запрос при обмене. Выгрузка зарегистрированных изменений. дополнительные условия не нужны.
31 kortun
 
05.05.15
15:16
(30) ну это пока, потом захотят по организациям делить
32 rphosts
 
05.05.15
15:17
(0) второй без вариантов
33 dk
 
05.05.15
15:20
(29) а если на "боевых данных" где миллионы документов?
34 Fragster
 
гуру
05.05.15
15:21
(26) не заглядывая в картинку (17) как еще воспринимать "По результатам 5 замеров. примерно одинаково"
35 Novus_Dess
 
05.05.15
15:32
(33) экспериментируйте :)
&НаСервере
Процедура ЗамерНаСервере()
    НачалоПериода = Дата(2014,1,1,0,0,0);
    КонецПериода  = Дата(2014,12,31,0,0,0);
    
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ВзаиморасчетыССотрудниками.Регистратор
                          |ИЗ
                          |    РегистрНакопления.ВзаиморасчетыССотрудниками КАК ВзаиморасчетыССотрудниками
                          |ГДЕ
                          |    ВзаиморасчетыССотрудниками.Период МЕЖДУ &НачалоПериода И &КонецПериода");
    Запрос.УстановитьПараметр("НачалоПериода",НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода",КонецПериода);
    Регистраторы = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Регистратор");
    
    
    
    ЗапросПоРегистратору = Новый Запрос("ВЫБРАТЬ
                                        |    ВзаиморасчетыССотрудниками.Период,
                                        |    ВзаиморасчетыССотрудниками.Регистратор,
                                        |    ВзаиморасчетыССотрудниками.НомерСтроки,
                                        |    ВзаиморасчетыССотрудниками.Активность,
                                        |    ВзаиморасчетыССотрудниками.ВидДвижения,
                                        |    ВзаиморасчетыССотрудниками.Организация,
                                        |    ВзаиморасчетыССотрудниками.ФизическоеЛицо,
                                        |    ВзаиморасчетыССотрудниками.СтатьяФинансирования,
                                        |    ВзаиморасчетыССотрудниками.СтатьяРасходов,
                                        |    ВзаиморасчетыССотрудниками.Сотрудник,
                                        |    ВзаиморасчетыССотрудниками.Подразделение,
                                        |    ВзаиморасчетыССотрудниками.СуммаВзаиморасчетов,
                                        |    ВзаиморасчетыССотрудниками.ВидВзаиморасчетов,
                                        |    ВзаиморасчетыССотрудниками.ГруппаНачисленияУдержанияВыплаты
                                        |ИЗ
                                        |    РегистрНакопления.ВзаиморасчетыССотрудниками КАК ВзаиморасчетыССотрудниками
                                        |ГДЕ
                                        |    ВзаиморасчетыССотрудниками.Регистратор В(&Регистратор)")   ;
    ЗапросПоРегистратору.УстановитьПараметр("Регистратор",Регистраторы);
    
    
    ЗапросПоДатам = Новый Запрос( "ВЫБРАТЬ
                                  |    ВзаиморасчетыССотрудниками.Период,
                                  |    ВзаиморасчетыССотрудниками.Регистратор,
                                  |    ВзаиморасчетыССотрудниками.НомерСтроки,
                                  |    ВзаиморасчетыССотрудниками.Активность,
                                  |    ВзаиморасчетыССотрудниками.ВидДвижения,
                                  |    ВзаиморасчетыССотрудниками.Организация,
                                  |    ВзаиморасчетыССотрудниками.ФизическоеЛицо,
                                  |    ВзаиморасчетыССотрудниками.СтатьяФинансирования,
                                  |    ВзаиморасчетыССотрудниками.СтатьяРасходов,
                                  |    ВзаиморасчетыССотрудниками.Сотрудник,
                                  |    ВзаиморасчетыССотрудниками.Подразделение,
                                  |    ВзаиморасчетыССотрудниками.СуммаВзаиморасчетов,
                                  |    ВзаиморасчетыССотрудниками.ВидВзаиморасчетов,
                                  |    ВзаиморасчетыССотрудниками.ГруппаНачисленияУдержанияВыплаты
                                  |ИЗ
                                  |    РегистрНакопления.ВзаиморасчетыССотрудниками КАК ВзаиморасчетыССотрудниками
                                  |ГДЕ
                                  |    ВзаиморасчетыССотрудниками.Период МЕЖДУ &НачалоПериода И &КонецПериода")   ;
    ЗапросПоДатам.УстановитьПараметр("НачалоПериода",НачалоПериода);
    ЗапросПоДатам.УстановитьПараметр("КонецПериода",КонецПериода);
                              

    РезультатЗапросаПорегистратору = ЗапросПоРегистратору.Выполнить();
    РезультатЗапросаПоДатам        = ЗапросПоДатам.Выполнить();
                                        
    
    
КонецПроцедуры

&НаКлиенте
Процедура Замер(Команда)
    ЗамерНаСервере();
КонецПроцедуры
36 hhhh
 
05.05.15
16:13
(0) а это что?

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

второй запрос тоже.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.