Имя: Пароль:
1C
1С v8
Оптимизация запроса
0 Hipocrisy2013
 
09.02.14
18:24
В регистре сведений СвязанныеДокументы два индексированных реквизита – Документ1 и Документ2. Нижеприведенный запрос выдает верные результаты. Как его можно оптимизировать по скорости?

ВЫБРАТЬ
Регистр.Документ1,
Регистр.Документ2
ИЗ
РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ
(Регистр.Документ1 В (&СписокДокументов)
ИЛИ Регистр.Документ2 В (&СписокДокументов))
1 zulu_mix
 
09.02.14
18:29
выбрать
регистр.документ1,
регистр.документ2
из &СписокДокументов как списокдокументов
левое соединение РегистрСведений.СвязанныеДокументы КАК Регистр
по списокдокументов.ссылка = регистр.документ1
или списокдокументов.ссылка = регистр.документ2
2 PR
 
09.02.14
18:29
ВЫБРАТЬ
Регистр.Документ1,
Регистр.Документ2
ИЗ
РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ
(Регистр.Документ1 В (&СписокДокументов)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
Регистр.Документ1,
Регистр.Документ2
ИЗ
РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ
Регистр.Документ2 В (&СписокДокументов))
3 Tateossian
 
09.02.14
18:35
(1) А тут "ПОМЕСТИТЬ" не надо?
4 zulu_mix
 
09.02.14
18:38
(3) а да, точно.
сначала во времянку конечно же.
с другой стороны если этот список получен программно, то его можно запросом собрать
5 DirecTwiX
 
09.02.14
18:42
(2) Из одного запроса, требующего оптимизации, сделал два) Либо я дурак)
Но, как минимум, ОБЪЕДИНИТЬ надо заменить на ОБЪЕДИНИТЬ ВСЕ + РАЗЛИЧНЫЕ.

(1) Выборка из массива всегда быстрее выборки из базы? Как вообще скорости выборки соотносятся?) Никто не проверял/не знает?
6 DirecTwiX
 
09.02.14
18:43
(4) Запросом не всегда можно собрать) Точнее тем, который будет работать быстрее)
7 Hipocrisy2013
 
09.02.14
18:43
(2) ты избавился от конструкции "или", которая вроде как тормозит запрос, а конструкция "Индексировать по" тут не уместна? "индексировать по" уместна если мы будем соединять временные таблицы, а на объединение она не катит?
8 PR
 
09.02.14
18:46
(5) Вообще-то я убрал ИЛИ, что есть большое дело, 1С так рекомендует делать.
"ОБЪЕДИНИТЬ" вместо "ОБЪЕДИНИТЬ ВСЕ + РАЗЛИЧНЫЕ" правильнее, если педантично подходить к вопросу, потому что в общем виде мой результат будет идентичен результату исходного запроса, а твой нет.
9 PR
 
09.02.14
18:47
(7) Про какую индексацию ты говоришь, если нет временных таблиц?
10 PR
 
09.02.14
18:48
(5) >>Выборка из массива всегда быстрее выборки из базы? Как вообще скорости выборки соотносятся?) Никто не проверял/не знает?
Главное не в том, что он выбирает из массива, а в том, что он делает ЛС к РС, а не выбирает из РС с отбором. Не уверен, впрочем, что это даст эффект, но может и даст.
11 Hipocrisy2013
 
09.02.14
18:52
(9) вот так не быстрее будет я имел ввиду:

ВЫБРАТЬ
Регистр.Документ1,
Регистр.Документ2
Поместить Первый
ИЗ
РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ
Регистр.Документ1 В (&СписокДокументов)
индексировать по
Регистр.Документ1,
Регистр.Документ2
;
ВЫБРАТЬ
Регистр.Документ1,
Регистр.Документ2
Поместить Второй
ИЗ
РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ
Регистр.Документ2 В (&СписокДокументов)
индексировать по
Регистр.Документ1,
Регистр.Документ2
;

ВЫБРАТЬ
Первый.Документ1,
Первый.Документ2
ИЗ
Первый КАК Первый
ОБЪЕДИНИТЬ
ВЫБРАТЬ
Второй.Документ1,
Второй.Документ2
ИЗ
Второй КАК Второй
12 zulu_mix
 
09.02.14
18:57
(11) вот так точно не будет
13 PR
 
09.02.14
19:25
(11) Это вопрос или самобичевание?
Если вопрос, то где знак вопроса?
14 Hipocrisy2013
 
09.02.14
19:46
(13) вопрос был в ответе (7)
15 PR
 
09.02.14
19:50
(14) В (11) совершенно не то, нежели в (2).
Где ты у меня увидел временные таблицы?
16 echo77
 
09.02.14
19:53
Мне кажется тут нечего оптимизировать
17 PR
 
09.02.14
19:56
(16) Зря
18 Sorm
 
09.02.14
20:06
(0) Через UNION - два запроса, отработают индексы на документ1 и документ2.
19 GANR
 
09.02.14
20:36
(16) Кажется? В профайлер глянь, план запроса проанализируй.
20 viktor_vv
 
09.02.14
22:46
(18) Че-то мне имхается нифига они не отработают, потому как измерения сотавного типа. Тут если в массиве заведомо документы одного типа разве что условие на тип ссылки сильно поможет.
21 H A D G E H O G s
 
09.02.14
22:51
(20) Че это?

Условие на RRef и хватит с вас.

1C не будет TRef проверять, имхо.
22 viktor_vv
 
09.02.14
22:55
(21) Но если измерение составного типа (это я телепатирую) , то в индексе буде _T+TRef+RRef
23 H A D G E H O G s
 
09.02.14
22:56
(22) Да ладно.

Ну в таблице документов должен быть индекс, чтобы выбрать документ по ссылке.
24 H A D G E H O G s
 
09.02.14
22:57
Аа, блин, пардон. Туплю
25 H A D G E H O G s
 
09.02.14
22:57
Перепутал.
26 H A D G E H O G s
 
09.02.14
23:04
Все норм.
Будет использоваться индекс.
27 zulu_mix
 
09.02.14
23:09
(26) ну таки что, о великий Гуру, чей пирожок то?
28 viktor_vv
 
09.02.14
23:11
(26) Странно, может при массиве там как-то по другому план троится, так как при условие на одно значение без условия на тип ссылки не используется индекс.
29 viktor_vv
 
09.02.14
23:12
(28)* строится. Под скулем базы нету, посмотреть не могу.