|
оптимизировать запрос | ☑ | ||
---|---|---|---|---|
0
ic-kat
30.10.12
✎
10:45
|
добрый день всем присутствующим.
есть некий запрос, вот его фрагмент "ВЫБРАТЬ ПЕРВЫЕ 50 | ОстаткиГруза.Накладная КАК Накладная, | ОстаткиГруза.Накладная.Номер Как Номер |ИЗ | РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад | И(НЕ Накладная В (ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ))) КАК ОстаткиГруза в связи с тем, что РегистрСведений.Погрузка просто громадный, всякий толк от его использования в параметрах виртуальной таблицы пропадает наверное. как его оптимизировать? если делать соединение, то какое? |
|||
1
Нуф-Нуф
30.10.12
✎
10:46
|
ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ
вынести в пакетный запрос |
|||
2
rphosts
30.10.12
✎
10:48
|
если берётся актуальный остаток (остаток на актуальную дату) - пофиг какого размера регистр!!!
|
|||
3
ic-kat
30.10.12
✎
10:49
|
пробовала, он ну очень долго выполняется. хотела сделать левое соединение, но тогда будут попадать и те, у которых признак
|
|||
4
ic-kat
30.10.12
✎
10:49
|
это (1)
|
|||
5
ic-kat
30.10.12
✎
10:50
|
(2) нет там на дату завязки
|
|||
6
cw014
30.10.12
✎
10:52
|
(3) попробуй Внутреннее соединение
|
|||
7
GLazNik
30.10.12
✎
10:52
|
(3) если сделать правильное соединение, то нифига лишнего не будет
|
|||
8
rphosts
30.10.12
✎
10:52
|
(3) отбирай первые 50 в ВТ
эффективность работы запроса зависит от стурктуры регистра. Склад - это его первое измерение? |
|||
9
Hmster
30.10.12
✎
10:52
|
структура регистра сведений Погрузка какая?
|
|||
10
ic-kat
30.10.12
✎
10:53
|
и внутренее пробовала и полное, попадают лишние.
да, склад - первое измерение |
|||
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) да у них там некоторая нестыковочка.. люди которые там работают не особо знают особенности скуль. лучше сначала вставить данные, потом индекснуть, чем наоборот. =)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |