Имя: Пароль:
1C
1С v8
оптимизировать запрос
,
0 ic-kat
 
30.10.12
10:45
добрый день всем присутствующим.
есть некий запрос, вот его фрагмент
   "ВЫБРАТЬ ПЕРВЫЕ 50
|    ОстаткиГруза.Накладная            КАК Накладная,
|    ОстаткиГруза.Накладная.Номер        Как Номер
|ИЗ
|    РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад
|    И(НЕ Накладная В (ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ))) КАК ОстаткиГруза

в связи с тем, что РегистрСведений.Погрузка просто громадный, всякий толк от его использования в параметрах виртуальной таблицы пропадает наверное.
как его оптимизировать?
если делать соединение, то какое?
11 Hmster
 
30.10.12
10:53
структуру регистра сведений покажи
12 ic-kat
 
30.10.12
10:54
измерения склад и накладная, ресурс остаток
13 rphosts
 
30.10.12
10:55
(10) а точно что именно этот кусок запроса всё тормозит?
14 ic-kat
 
30.10.12
10:56
да, я его пробовала вынести в вт, вообще на 40 минут все зависло, убила процесс
15 GLazNik
 
30.10.12
10:56
(8) тогда в результате не факт что в результате будет именно 50 записей :) может вообще получится что из 50 строк, что есть в остатках условию по регистру не удовлетворяющий регистру сведений.
(10) без (НЕ Накладная В (ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ)) запрос быстро выполняется?
16 le_
 
30.10.12
10:56
(12) Остаток в регистре сведений?..
17 Hmster
 
30.10.12
10:56
(12) а признакК заначит реквизит? регистр периодический? подчиненный?
18 cw014
 
30.10.12
10:57
(10) Значит неправильно пробовала:
ВЫБРАТЬ ПЕРВЫЕ 50
   ОстаткиГруза.Накладная             КАК Накладная,
   ОстаткиГруза.Накладная.Номер         Как Номер
ИЗ
   РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад) КАК ОстаткиГруза
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
РегистрСведений.Погрузка КАК Погрузка
ПО ОстаткиГруза.Накладная = Погрузка.Накладная
И Погрузка.ПризнакК
19 rphosts
 
30.10.12
10:57
(16) вот такая вот самописка....
20 GLazNik
 
30.10.12
10:57
+(15) с соединением получится что-то типа:
   "ВЫБРАТЬ ПЕРВЫЕ 50
|    ОстаткиГруза.Накладная             КАК Накладная,
|    ОстаткиГруза.Накладная.Номер         Как Номер
|ИЗ
|    РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад) КАК ОстаткиГруза
|    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Погрузка КАК Погрузка ПО ОстаткиГруза.Накладная = Погрузка.Накладная И Погрузка.ПризнакК = ЛОЖЬ
21 rphosts
 
30.10.12
10:58
+(19) возможно досталась в наследство
22 ic-kat
 
30.10.12
10:58
ой, нет, не того регистра структуру описала.
23 cw014
 
30.10.12
10:58
Ведь на сколько я понимаю "ПризнакК" имеет тип "Булево"?
24 cw014
 
30.10.12
10:58
(20) Нужно те, которые с признаком, см внимательнее запрос
25 ic-kat
 
30.10.12
10:59
у погрузки вот так:
измерения накладная, ячейка, ресурсы направлени и погружено мест, признакК - реквизит
26 ic-kat
 
30.10.12
11:00
(20) если так, то не попадут те, что в остатках, но их нет в погрузке
27 ic-kat
 
30.10.12
11:00
(23) призакК - булево
28 rphosts
 
30.10.12
11:00
а у погрузки какая структура?
29 GLazNik
 
30.10.12
11:01
(24) копипаст :) "НЕ" пропустил... но идея то собственно понятна
30 Hmster
 
30.10.12
11:01
(25) подчиненные регистр? есть периодичность?
31 ic-kat
 
30.10.12
11:01
(28) в 25 описала
32 Hmster
 
30.10.12
11:02
реквизит проиндексирован? что дает запрос из (18) ?
33 cw014
 
30.10.12
11:02
(31) попробуй (18) - оно?
34 dmpl
 
30.10.12
11:04
(0)

ВЫБРАТЬ РАЗЛИЧНЫЕ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ


может быть лучше.
35 GLazNik
 
30.10.12
11:04
(26) нет в регистре Погрузка?
Тогда так
   "ВЫБРАТЬ ПЕРВЫЕ 50
|    ОстаткиГруза.Накладная             КАК Накладная,
|    ОстаткиГруза.Накладная.Номер         Как Номер
|ИЗ
|    РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад) КАК ОстаткиГруза
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Погрузка КАК Погрузка ПО ОстаткиГруза.Накладная = Погрузка.Накладная
|ГДЕ ЕСТЬNULL(Погрузка.ПризнакК,Истина)
36 cw014
 
30.10.12
11:06
(35) ++
37 ic-kat
 
30.10.12
11:06
(33) 18 не то, так не попадают записи, которые есть в остатках, но нет в погрузке.

(35) а так попробую, но наверно едолго работать будет, раз условие позже накладывается
38 МихаилМ
 
30.10.12
11:07
для мс скл использование выбратьпервые
без сортировать по всем  всем полям индекса - очень ресурсоёмкая операция.
39 GLazNik
 
30.10.12
11:08
(37) не факт... скульный оптимизатор вещь хитрая... :)
40 dmpl
 
30.10.12
11:08
(38) Безотносительно SQL - это вообще бессмысленно без сортировки. Типа, выберите мне что-нибудь в количестве 50 штук...
41 ic-kat
 
30.10.12
11:10
(35) только наверное ГДЕ ЕСТЬNULL(Погрузка.ПризнакК,ЛОЖЬ) ?
42 GLazNik
 
30.10.12
11:10
(38) на счет ресурсоёмкости не уверен, но без сортировки смысл теряется... ну если только для проверки...
43 GLazNik
 
30.10.12
11:11
(41) неа... именно истина... вам же нужны документы которых нет Погрузке
44 Fragster
 
гуру
30.10.12
11:11
Что дает:


Выбрать Сумма(1) Из (Выбрать * Из РегистрНакопления.ГрузВЯчейках.Остатки) КАК Вложенный
45 cw014
 
30.10.12
11:12
(37)
"И(НЕ Накладная В (ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ)))" - у тебя так то тоже :)
46 GLazNik
 
30.10.12
11:16
(44) это к чему тут?
47 ic-kat
 
30.10.12
11:16
(41) да, действительно

(44) то же, что и вт

(45) не так
48 dmpl
 
30.10.12
11:16
Вопрос всем кто тут левые и прочие соединения предлагает. С чего вы взяли, что 1 накладная идет только в одну ячейку?
49 Fragster
 
гуру
30.10.12
11:17
проиндексировано ли поле ПризнакК в регистре РегистрСведений.Погрузка? есть ли индекс по полю "накладная" или является оно первым измерением в РегистрНакопления.ГрузВЯчейках?
50 acsent
 
30.10.12
11:17
ПризнакК индексированное поле?
51 ic-kat
 
30.10.12
11:17
(35) результат выборки верный, но работает так же медленно :(
в связь корректно условие никак не запихать?
52 cw014
 
30.10.12
11:18
(47) тогда оставляй как есть
53 ic-kat
 
30.10.12
11:20
накладная индексируется по регистру накоплений, но не первое измерение
54 cw014
 
30.10.12
11:20
(47) хотя если по скорости, посмотри, сколько длится такой запрос:

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

ВЫБРАТЬ
Погрузка.Накладная ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ Погрузка.ПризнакК И Погрузка.Накладная В (ВЫБРАТЬ РАЗЛИЧНЫЕ НакладныеОстатков.Накладная
ИЗ НакладныеОстатков)
55 ic-kat
 
30.10.12
11:21
признакК не идексируется
56 Fragster
 
гуру
30.10.12
11:21
а первая часть (49), а главное, (44)?
57 cw014
 
30.10.12
11:21
(47) Если по скорости быстро, тогда можно тебе помочь
58 Fragster
 
гуру
30.10.12
11:22
(55) а сколько выполняется отдельно ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ ? может имеет смысл проиндексировать? да и список накладных лучше во временную таблицу запихать, а потом её уже в отбор регистра накопления.
59 ic-kat
 
30.10.12
11:22
(57) это про что сейчас?
60 cw014
 
30.10.12
11:23
(59) про (54)
61 Fragster
 
гуру
30.10.12
11:23
(46) а если годы не закрывался регистр?
62 Fragster
 
гуру
30.10.12
11:24
(47).2 что "то же"? число какое?
63 Нуф-Нуф
 
30.10.12
11:29
нихера тут оптимизаторов. до разбора движка скуля еще не добрались?
64 Hmster
 
30.10.12
11:32
(54) ошибся в условии.
надо условие Погрузка.ПризнакК = ложь
65 Hmster
 
30.10.12
11:32
Сколько по времени выполняется запрос?
"ВЫБРАТЬ
ОстаткиГруза.Накладная
ПОМЕСТИТЬ
НакладныеОстатков
ИЗ
   РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад
) КАК ОстаткиГруза
;

ВЫБРАТЬ
Погрузка.Накладная ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ Погрузка.ПризнакК = ЛОЖЬ И Погрузка.Накладная В (ВЫБРАТЬ РАЗЛИЧНЫЕ НакладныеОстатков.Накладная
ИЗ НакладныеОстатков)
66 ic-kat
 
30.10.12
11:33
попробую сейчас
67 cw014
 
30.10.12
11:33
(54) Почему это? Разве он не имеет тип "Булево"?
68 cw014
 
30.10.12
11:34
(64) Почему это? Разве он не имеет тип "Булево"?
69 dmpl
 
30.10.12
11:34
(65) А в чем смысл выбирать различные уже из временной таблицы?
70 Hmster
 
30.10.12
11:35
(68) тебе нужны все которые не входят в список признакК=ложь, а не те кто входят в список признакК=Истина
71 cw014
 
30.10.12
11:36
Понял, нам же потом этот список нужен для отбора. Тогда
"НЕ Погрузка.ПризнакК"
72 cw014
 
30.10.12
11:36
(69) Да нивчем, конечно можно было еще в первом запросе такое указать :)
73 cw014
 
30.10.12
11:37
(66) Вот как должно быть:

ВЫБРАТЬ РАЗЛИЧНЫЕ
ОстаткиГруза.Накладная
ПОМЕСТИТЬ
НакладныеОстатков
ИЗ
   РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад
) КАК ОстаткиГруза
;

ВЫБРАТЬ
Погрузка.Накладная ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ НЕ Погрузка.ПризнакК И Погрузка.Накладная В (ВЫБРАТЬ НакладныеОстатков.Накладная
ИЗ НакладныеОстатков)
74 Нуф-Нуф
 
30.10.12
11:37
ВЫБРАТЬ Различные
Накладная Как Накладная
ПОМЕСТИТЬ ТаблицаНакладных
ИЗ РегистрСведений.Погрузка
ГДЕ ПризнакК = ЛОЖЬ
ИНДЕКСИРОВАТЬ Накладная
;
ВЫБРАТЬ ПЕРВЫЕ 50
ОстаткиГруза.Накладная             КАК Накладная,
ОстаткиГруза.Накладная.Номер         Как Номер
ИЗ
РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад
И (НЕ Накладная В (ВЫБРАТЬ Накладная.ТаблицаНакладных ИЗ ТаблицаНакладных)) КАК ОстаткиГруза
75 cw014
 
30.10.12
11:38
(74) Аналогично (0) получится. Запрос виснет именно на выборке из регистра сведений. Поэтому его то и нужно обрезать
76 Нуф-Нуф
 
30.10.12
11:38
горе оптимизаторы
77 cw014
 
30.10.12
11:38
(76) Ты просто условие поместил в новую временную таблицу, да и еще в ней заставил индексацию провести
78 Нуф-Нуф
 
30.10.12
11:38
(75) инфа достоверна?
79 Hmster
 
30.10.12
11:39
(66) как тестируется?
80 dmpl
 
30.10.12
11:39
А вообще вопрос. Вот показанный тут запрос - это полный запрос, или кусочек более крупного запроса?
81 cw014
 
30.10.12
11:40
(78) Мы то и пытаемся определить, будет ли выборка обрезанная на уровне ресурсов/реквизитов быстрее
82 ic-kat
 
30.10.12
11:41
(79) пока засекала, время выполнения моего и 35, до секунды одинаково по времени
83 ic-kat
 
30.10.12
11:42
это только кусочек, но виснет именно на нем.
84 Hmster
 
30.10.12
11:43
запрос из (73) выполняла?
85 Bober
 
30.10.12
11:43
(0) нужна структура таблиц
86 dmpl
 
30.10.12
11:45
(83) У меня такое было, и причина оказалась в одном из предыдущих запросов. Т.е., исправил предыдущий запрос - и проблемный залетал. Сложилось такое впечатление, что оптимизатор после определенного предела косяков просто не может оптимизировать запрос, и начинается тупая выборка.

Если показанный запрос выполнять отдельно - он также медленно выполняется, или быстрее?
87 МишКа
 
30.10.12
11:54
Абстрактная оптимизация не имеет смысла.
Сколько всего остатков в РН?
Сколько записей в РС?
Почему выбираются первые 50?
88 ic-kat
 
30.10.12
11:56
(84) переделываю пока, он большой. и отвлекают по работе

(86) в смысле сам кусочек запустить? он настолько долго, что терпения ни разу не хватила дождаться
89 Hmster
 
30.10.12
12:02
ты пробовала куски сравнивать по скорости?
90 dmpl
 
30.10.12
12:03
(88) Вот те 5-10 строк, что тут приводят, если запустить отдельно - сколько идет? Если долго - то никакие оптимизации не помогут, надо менять структуру данных.
91 ic-kat
 
30.10.12
12:06
(73) мне из вт не только накладная нужна, но и еще поля.
и при этом в выборку попадут только те, что есть в регистре погрузка. значит недобор. потому что есть такие, которые есть в остатках, но в погрузке нет
92 МишКа
 
30.10.12
12:06
(90) Если в РН не очень много записей - оптимизировать можно.
93 МишКа
 
30.10.12
12:07
+(92) В остатках РН, я имел ввиду.
94 hhhh
 
30.10.12
12:14
(91) может к вас там галка "индексировать" не стоит в поле Накладная в регистре ОстаткиГруза?
95 dmpl
 
30.10.12
12:15
(91) Когда ты в ВТ берешь другие поля - ты неявно цепляешь к ВТ левым соединением всю таблицу накладных без отбора. Лучше эти поля добавлять уже после всех отборов - чтобы цеплялось с отбором.
96 Axel2009
 
30.10.12
12:17
(0)
1. индекс на реквизит Накладная в Регистре  ГрузВЯчейках есть?
2. индекс на реквизит ПризнакК в регистре Погрузка есть?
97 ic-kat
 
30.10.12
12:28
(96) 1. есть
2.нет
98 Axel2009
 
30.10.12
12:32
(97) что вернет запрос
ВЫБРАТЬ ПризнакК, КОЛИЧЕСТВО(*) ИЗ РегистрСведений.Погрузка СГРУППИРОВАТЬ ПО ПризнакК
?
99 Hmster
 
30.10.12
12:35
(91) выполняется долго или нет? тут не весь кусок запроса что тебе нужен. весь писать пока не стали...
100 ic-kat
 
30.10.12
12:37
(99) он обрезать результаты будет
101 Hmster
 
30.10.12
12:39
ВЫБРАТЬ
ОстаткиГруза.Накладная
ПОМЕСТИТЬ
НакладныеОстатков
ИЗ
   РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад
) КАК ОстаткиГруза
;

ВЫБРАТЬ
Погрузка.Накладная
ПОМЕСТИТЬ ПогрузкаПризнакК_Не
ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ НЕ Погрузка.ПризнакК И Погрузка.Накладная В (ВЫБРАТЬ НакладныеОстатков.Накладная
ИЗ НакладныеОстатков)
;

ВЫБРАТЬ
НакладныеОстатков.Накладная
ИЗ НакладныеОстатков КАК НакладныеОстатков
ГДЕ (НЕ НакладныеОстатков.Накладная В (ВЫБРАТЬ ПогрузкаПризнакК_Не.Накладная ИЗ ПогрузкаПризнакК_Не КАК ПогрузкаПризнакК_Не))
102 cw014
 
30.10.12
12:39
(91) Нужно просто пока обкатать по скорости, запусти да проверь, как быстро выбираются
103 Hmster
 
30.10.12
12:40
сколько выполняется запрос из (101) ?
104 hhhh
 
30.10.12
12:57
(103) проиндексировать еще НакладныеОстатков
105 dmpl
 
30.10.12
13:48
(104) Не обязательно, платформа чаще всего сама строит нужный индекс. А неправильно проиндексировав можно запросто уронить производительность.
106 Hmster
 
30.10.12
14:05
похоже автор не вернулся с обеда или еще запрос не выполнился?
(105) это еще очень сильно от субд зависит. МС СКЛ сам неплохо индексирует а вот в постгре думать надо, да и в файловой тоже.
107 dmpl
 
30.10.12
15:14
(106) Насчет PostgreSQL не знаю, а вот что в файловом варианте, что на MS SQL явное индексирование временных таблиц в более чем 95% случаев не приносит сколько-нибудь заметного ускорения. А вот к заметному замедлению иногда приводит.
108 ic-kat
 
30.10.12
18:52
всем спасибо, сделала примерно как и в 101, только не в вт, а во вложенный ее, в итоге выполняется за несколько секунд
109 Axel2009
 
30.10.12
20:58
(106) нука нука поподробнее =) что он там "неплохо" делает "сам"? =)
110 Axel2009
 
30.10.12
20:59
(107) да у них там некоторая нестыковочка.. люди которые там работают не особо знают особенности скуль. лучше сначала вставить данные, потом индекснуть, чем наоборот. =)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.