|
Помогите оптимизировать запрос | ☑ | ||
---|---|---|---|---|
0
DexterMorgan
08.10.13
✎
13:42
|
Есть запрос, выбирается 700к строк, выполняется полчаса. Натолкните на мысль как можно ускорить?
////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СвободныеОстаткиОстатки.Склад КАК Склад, СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура, СвободныеОстаткиОстатки.Характеристика КАК Характеристика, ДопРеквизитОрНомер.Значение КАК ОрНомер, ВЫБОР КОГДА СвободныеОстаткиОстатки.ВНаличииОстаток <= 10 ТОГДА СвободныеОстаткиОстатки.ВНаличииОстаток ИНАЧЕ ">10" КОНЕЦ КАК Наличие, ДопРеквизитПартии.Значение КАК Партии ПОМЕСТИТЬ ОстаткиПоСкладам ИЗ РегистрНакопления.СвободныеОстатки.Остатки( &Период, Склад В (ВЫБРАТЬ РАЗЛИЧНЫЕ СоглашенияСКлиентамиНастройкиОтправкиПрайсов.Склад КАК Склад ИЗ Справочник.СоглашенияСКлиентами.НастройкиОтправкиПрайсов КАК СоглашенияСКлиентамиНастройкиОтправкиПрайсов ГДЕ СоглашенияСКлиентамиНастройкиОтправкиПрайсов.Ссылка.ОтправлятьПрайс) И Номенклатура.ЦеноваяГруппа = &ЦеноваяГруппа) КАК СвободныеОстаткиОстатки ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизитПартии ПО СвободныеОстаткиОстатки.Номенклатура = ДопРеквизитПартии.Ссылка И (ДопРеквизитПартии.Свойство = &Партии) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизитОрНомер ПО СвободныеОстаткиОстатки.Номенклатура = ДопРеквизитОрНомер.Ссылка И (ДопРеквизитОрНомер.Свойство = &ОрНомер) ИНДЕКСИРОВАТЬ ПО Номенклатура, Характеристика ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОстаткиПоСкладам.Склад КАК Склад, ЦеныНоменклатурыСрезПоследних.ВидЦены, ОстаткиПоСкладам.Номенклатура, ОстаткиПоСкладам.ОрНомер, ОстаткиПоСкладам.Наличие, ОстаткиПоСкладам.Партии, ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаКлиенту, ОстаткиПоСкладам.Номенклатура.Наименование КАК Наименование, ОстаткиПоСкладам.Номенклатура.Артикул КАК Артикул, ОстаткиПоСкладам.Номенклатура.Изготовитель.Наименование КАК Изготовитель, ОстаткиПоСкладам.Номенклатура.Применяемость КАК Применяемость, ОстаткиПоСкладам.Склад.Наименование ИЗ ОстаткиПоСкладам КАК ОстаткиПоСкладам ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( &Период, ВидЦены В (ВЫБРАТЬ РАЗЛИЧНЫЕ СоглашенияСКлиентами.ВидЦен ИЗ Справочник.СоглашенияСКлиентами КАК СоглашенияСКлиентами ГДЕ СоглашенияСКлиентами.ОтправлятьПрайс) И Номенклатура.ЦеноваяГруппа = &ЦеноваяГруппа) КАК ЦеныНоменклатурыСрезПоследних ПО ОстаткиПоСкладам.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура И ОстаткиПоСкладам.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика |
|||
1
Fragster
модератор
08.10.13
✎
13:43
|
первый тоже разбить
|
|||
2
Fragster
модератор
08.10.13
✎
13:46
|
вынести вложенные запросы из параметров виртуальных таблиц - во временные, не соединять виртуальные таблицы с реальными... ну, в общем, классика...
|
|||
3
DexterMorgan
08.10.13
✎
13:49
|
(2) вложенный запрос совсем простой и возвращает 15-20 строк.
Запутал, чем плохо соединение вирт и реальной таблицы? (1) Имеется ввиду получать доп реквизиты в отдельном пакете? |
|||
4
Maxus43
08.10.13
✎
13:49
|
(2) забыл написать
(ВидЦены, Истина) В (ВЫБРАТЬ РАЗЛИЧНЫЕ СоглашенияСКлиентами.ВидЦен, Истина ИЗ Справочник.СоглашенияСКлиентами КАК СоглашенияСКлиентами ГДЕ СоглашенияСКлиентами.ОтправлятьПрайс) |
|||
5
Fragster
модератор
08.10.13
✎
13:50
|
(3) понятно, что он простой. просто вынеси его в отдельный :)
|
|||
6
Fragster
модератор
08.10.13
✎
13:50
|
(4) а будет ли для 15 элементов ускорение?
|
|||
7
Maxus43
08.10.13
✎
13:51
|
(6) хз)
|
|||
8
Chin
08.10.13
✎
13:52
|
(4) Вот тут тоже нежелательно использовать вложенный запрос...
|
|||
9
DexterMorgan
08.10.13
✎
13:53
|
(5) Ну ок, я знаю что лучше временные таблицы, но это больше для предсказуемости построения плана запроса, чем для увеличения производительности.
РАспиши лучше плз: "первый тоже разбить" и "не соединять виртуальные таблицы с реальными"? |
|||
10
Fragster
модератор
08.10.13
✎
13:54
|
(9) ну, если заглянуть в профайлер, на то, во что превращаются виртуальные таблицы... ну, в общем, еще пары соединений там все равно лучше избежать
|
|||
11
Maxus43
08.10.13
✎
13:54
|
ВЫБОР
КОГДА СвободныеОстаткиОстатки.ВНаличииОстаток <= 10 ТОГДА СвободныеОстаткиОстатки.ВНаличииОстаток ИНАЧЕ ">10" КОНЕЦ КАК Наличие, это условным оформлением сделать проще, чем в запросе "считать", тип составной ещё будет |
|||
12
Chin
08.10.13
✎
13:54
|
(9) План запроса, как бы, очень сильно влияет на производительность...
|
|||
13
Fragster
модератор
08.10.13
✎
13:55
|
почему ОстаткиПоСкладам.Номенклатура.Изготовитель.Наименование КАК Изготовитель
идет во втором запросе? |
|||
14
Fragster
модератор
08.10.13
✎
13:58
|
кстати, если посмотреть план - то там будет написано, какая часть сколько занимает. может там в постобработке 700000 раз получение представления из ссылки торможит
|
|||
15
Maxus43
08.10.13
✎
14:00
|
(14) получение представления это ж отдельными запросами при выводе на экран уже, не в рамках этого запроса
|
|||
16
DexterMorgan
08.10.13
✎
14:01
|
(10) Не понял( количество соединений у меня не уменьшится, врем тз проиндексировал..ты имеешь ввиду, что лучше выбрать все в одном пакете?
(11) Это не отчет, прайсы в excel рассылаются. (13) Согласен, спасибо) |
|||
17
Fragster
модератор
08.10.13
✎
14:02
|
(15) вот видишь (16), автор не сказал, делал ли он замер и это именно выполнение запроса наибольшую часть времени занимает, каким образом он в эксель выводит и т.п.
|
|||
18
Fragster
модератор
08.10.13
✎
14:04
|
(17)+ автор не смотрел план выполнения текущего варианта
|
|||
19
DexterMorgan
08.10.13
✎
14:04
|
(17) Прошу прощения, именно выполнение запроса..
|
|||
20
Fragster
модератор
08.10.13
✎
14:06
|
а &Период - обязателен? без него будет легче, если галка "использовать текущие итоги" стоит
|
|||
21
DexterMorgan
08.10.13
✎
14:10
|
(20) Необязателен, в него неопределено передается.
ответь на (16) плз( |
|||
22
alexhtn
08.10.13
✎
14:18
|
(0) Иногда лучше не делать отборы с оператором "В" в параметрах виртуальных таблиц, а поместить результат выполения запроса по виртуальной таблице во временную таблицу и уже к ней применять отборы.
Приблизительно так ВЫБРАТЬ Номенклатура, КоличествоОстаток ПОМЕСТИТЬ ВТ_Остатки ИЗ РегистрНакополения.СвободныеОстатки.Остатки(&Период); ВЫБРАТЬ Номенклатура, КоличествоОстаток ГДЕ Номенклатура В ... Может быть стоит проиндексировать виртуальную таблицу. |
|||
23
alexhtn
08.10.13
✎
14:19
|
(22) Небольшое уточнение
ВЫБРАТЬ Номенклатура, КоличествоОстаток ПОМЕСТИТЬ ВТ_Остатки ИЗ РегистрНакополения.СвободныеОстатки.Остатки(&Период); ВЫБРАТЬ Номенклатура, КоличествоОстаток ИЗ ВТ_Остатки ГДЕ Номенклатура В ... |
|||
24
MKZM
08.10.13
✎
14:23
|
(2) не соединять виртуальные таблицы с реальными... ну, в общем, классика...
А что такое вирртуальные таблицы? и почему нельзя соединять? Только факты, а не астральные знания. |
|||
25
DexterMorgan
08.10.13
✎
14:26
|
(24) Срач не начинайте только =) Вирт таблица - это вложенный запрос кароче)
|
|||
26
anaed
08.10.13
✎
14:31
|
(24) (25) всегда думал что виртуальные таблицы это Остатки, ОстаткииОбороты и т.д.
(0) Меня смущает два соединения в первом запросе, не лучше ли отдельным запросов выбрать все в вт проиндексировать и потом уже соединять с вт остатков. То же самое и цен касается. |
|||
27
DexterMorgan
08.10.13
✎
14:43
|
(26) на скуле то этих таблиц нет и они интерпретируются как вложенные запросы к реальным таблицам. Два соединения, потому что доп. реквизиты в отдельной таблице находятся
|
|||
28
xypc
08.10.13
✎
14:49
|
ребят, у меня схожий вопрос, чтобы не множить темы: есть у меня запрос для отчета, 350 с лишним строк, так там у меня частенько в условиях для регистра что нибудь типа:
ХозрасчетныйДвиженияССубконто.СубконтоКт3.Ссылка В
это тоже существенно тормозит запрос? Просто у меня локально, в файловой системе - выполняется очень быстро, но на другом стенде - ощутимое время. Минут 10 может иногда. |
|||
29
Maxus43
08.10.13
✎
14:51
|
СубконтоДт3.Ссылка
.Ссылка лишняя, конечно тормозит |
|||
30
xypc
08.10.13
✎
14:53
|
(29) окей, спасибо:)
|
|||
31
Maxus43
08.10.13
✎
14:58
|
(30) сколько в ВТ ВТ_ПоступленияНаРасчетныйСчет записей?
|
|||
32
DexterMorgan
08.10.13
✎
15:06
|
(31) Сначала мне помоги)
|
|||
33
Fragster
модератор
08.10.13
✎
15:10
|
(32) план запроса получи своего
|
|||
34
Maxus43
08.10.13
✎
15:16
|
(32) сначала выполни рекомендации например, которые были в начале, там поглядим дальше
|
|||
35
xypc
08.10.13
✎
16:13
|
(31) ну в среднем 3-10, но применяется у меня такое частенько, думаю, может вообще избавиться от подобных условий, а сделать через связи?
|
|||
36
Maxus43
08.10.13
✎
16:18
|
(35) не факт что будет лучше, без .Ссылка (2 щтуки их было) лучше стало?
|
|||
37
xypc
08.10.13
✎
16:34
|
(36) ну пока не особо, в принципе я ещё грешу на возможную захламлённость базы, слабость предрелизного стенда и т.д.:)
|
|||
38
Maxus43
08.10.13
✎
16:41
|
ВТ_ПоступленияНаРасчетныйСчет.СубконтоДт3 индексировано?
и запрос только кусок, может там ещё бяка есть какая |
|||
39
Gammi
08.10.13
✎
16:49
|
Получай доп. реквизиты одним запросом. Будет одно левое соединение вместо двух. Предварительно наложи отбор на номенклатуру только из остатков. таблица уменьшится еще до соединения. Может суть полегчает
|
|||
40
DexterMorgan
08.10.13
✎
16:59
|
Разобрался, всем спасибо.
Первый пакет не менял вообще, поместил запрос к ценам в отдельный пакет и проиндексировал по номенклатуре,в третьем последнем пакете соединил - запрос стал выполняться 1,5 минуты |
|||
41
MKZM
09.10.13
✎
06:19
|
(25) Почему срач? 1сники говорят, что нельзя соединять с виртуальными таблицами, суть которых тот же запрос с параметрами. Так почему? Как бывший программист баз данных (если так можно сказать) спрашиваю.
|
|||
42
tushich
09.10.13
✎
07:58
|
(41) нельзя соединять с вложенными и виртуальными(вирутальная таблица тоже состоит из вложенных запросов и 2-3 соединений в этом запросе) т.к. оптимизатор(или кто там план выбирает) субд может выбрать неправильный план запроса из-за отсутствующей информации о результате запроса(количество записей и т.п.), для временных таблиц мы это избегаем тем что можем проиндексировать. Временные таблицы в большом количестве тоже могут стать узким местом т.к. при выполнении они хранятся в темпДб и могут просто выжрать все место свободное)
|
|||
43
viktor_vv
09.10.13
✎
08:05
|
(42) А чего вдруг нельзя, если оптимизатор только "может" выбрать неправильный план запроса, это ж не значит, что он всегда выберет неправильный план запроса.
В общем и целом, в принципе, согласен с рекомендацией. Но именно как с рекомендацией, а не с категорическим утверждением. У ТС в первом запросе тоже соединения ВТ и реальной таблицы, и ничего, живет как-то. |
|||
44
Fragster
модератор
09.10.13
✎
08:13
|
(43) если остатки РН - это просто юнион + груп бай, то срез последних это адЪ
|
|||
45
viktor_vv
09.10.13
✎
08:18
|
(44) Тоже так подумал.
Соединение реальной таблицы с ВТ остатков особых проблем не вызывало. |
|||
46
viktor_vv
09.10.13
✎
08:19
|
(45)+ Насчет муторного разворота среза последних.
|
|||
47
Fragster
модератор
09.10.13
✎
08:22
|
(45) на самом деле еще влияет (немного) то, что в первом - все цепляется к вируальной таблице (т.е. ее "скан" всегда происходит) а во втором - виртуальная цепляется к реальной и скуль начинает думать над тем, как же пробросить условия соединений внурь виртуально и тд. и т.п. в общем, если сначала посмотреть на план запроса и веса его веток - сразу становится понятно, где можно подправить, чтобы оптимизатор не плющило
|
|||
48
Fragster
модератор
09.10.13
✎
15:22
|
(4) сейчас пришлось кое-что покрутить. по крайней мере на файловой в параметрах виртуальной таблицы реально помогло
|
|||
49
Конфигуратор1с
09.10.13
✎
16:57
|
(22) " Иногда лучше не делать отборы с оператором "В" в параметрах виртуальных таблиц" так радченко наоборот так учил
|
|||
50
Конфигуратор1с
09.10.13
✎
16:59
|
(49) +419 страница практ пособия листинг 14.25
|
|||
51
Fragster
модератор
09.10.13
✎
17:13
|
(49) сравни:
ВЫБРАТЬ Номенклатура.Ссылка ПОМЕСТИТЬ Ном ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка В ИЕРАРХИИ(&Ссылка) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ * ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В (ВЫБРАТЬ Ном.Ссылка ИЗ Ном)) КАК ЦеныНоменклатурыСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ * ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , (Номенклатура, Истина) В (ВЫБРАТЬ Ном.Ссылка, Истина ИЗ Ном)) КАК ЦеныНоменклатурыСрезПоследних |
|||
52
Fragster
модератор
09.10.13
✎
17:13
|
"В (Выбрать ...)" реально больная тема
|
|||
53
Конфигуратор1с
09.10.13
✎
17:32
|
(52) а почему нельзя выборку делать в параметрах сразу? зачем временная таблица?
|
|||
54
DexterMorgan
11.10.13
✎
09:22
|
(53) Насколько я понимаю, вложенный запрос будет выполнятся для каждой строки таблицы, соответственно если он имеет большое количество записей имеет смысл первоначально поместить его во временную таблицу и проиндексировать
|
|||
55
alexhtn
11.10.13
✎
09:48
|
(50) учат одному, но на больших объемах данных работает по-другому
Если указывать ограничение по периоду, то запрос к виртуальной таблице преобразуется в sql запрос к таблице остатков и таблице движений регистра, т.к. таблицы движений как правило намного больше таблиц остатков, то sql сервер дольше обрабатывает отбор по таблице движений, поэтому sql серверу легче поместить данные виртуальной таблицы во временную и отбирать из меньшего количества записей Не знаю на сколько я прав в теории, определял экспериментальным методом. Какой метод использовать также зависит от количества элементов которые будут находится в В (ВЫБРАТЬ). Если их мало, то быстрее будет как учит Радченко, если много, то как предлагаю я. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |