|
Оптимизация запроса 1С | ☑ | ||
---|---|---|---|---|
0
10Evgeny1987
03.10.14
✎
14:16
|
В базе около 600 000 тыс. задач, запрос очень тормозит
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ЗадачаИсполнителя.БизнесПроцесс ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ГДЕ ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ И (ЗадачаИсполнителя.Предмет = &Предмет ИЛИ ЗадачаИсполнителя.Предмет1 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет2 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет3 = &Предмет) И ЗадачаИсполнителя.БизнесПроцесс.ПометкаУдаления = ЛОЖЬ Дайте идеи по оптимизации! |
|||
1
Maxus43
03.10.14
✎
14:18
|
ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ
два раза зачем? думаешь с одного не поймёт? |
|||
2
Maxus43
03.10.14
✎
14:19
|
а, это на бизнес процесс вторая
|
|||
3
Maxus43
03.10.14
✎
14:19
|
вобще не рекомендуется на разные реквизиты ИЛИ условие
|
|||
4
lodger
03.10.14
✎
14:20
|
1) избавится от неявных вложенных запросов
2) начинать отборы с вложенных запросов, чтобы они собирались уже ограниченные условиями. 3) ПометкаУдаления уже булево, зачем еще раз сравнивать с булевым? пиши просто НЕ ПометкаУдаления. |
|||
5
Milok
03.10.14
✎
14:20
|
(2) и с левым соединением
|
|||
6
Sammo
03.10.14
✎
14:20
|
Объединение 4 щапросов будет работать (обычно) быстрее, чем 1 запрос с или
+ есть неявное левое соединение с Бизнес процесс - обращение через 2 точки |
|||
7
Maxus43
03.10.14
✎
14:21
|
(4) про пометку пофиг, в скуле один хрен будет _DeletionMark = 0х00
|
|||
8
ChiginAV
03.10.14
✎
14:23
|
Реквизиты "ПредметN" проиндексировать
|
|||
9
djekting
03.10.14
✎
14:24
|
посмотри http://www.youtube.com/watch?v=sCDMemW3zyk
там 5 частей, нормально объяснено |
|||
10
10Evgeny1987
03.10.14
✎
14:29
|
Спасибо!!!
|
|||
11
GRAF_84
03.10.14
✎
14:39
|
Пробуй ограничить тип БизнесПроцесса, наверняка используется один тип.
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ВЫРАЗИТЬ(ЗадачаИсполнителя.БизнесПроцесс КАК БизнесПроцесс.ТвойТип) КАК БизнесПроцесс ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ГДЕ НЕ ЗадачаИсполнителя.ПометкаУдаления И (ЗадачаИсполнителя.Предмет = &Предмет ИЛИ ЗадачаИсполнителя.Предмет1 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет2 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет3 = &Предмет) И НЕ ВЫРАЗИТЬ(ЗадачаИсполнителя.БизнесПроцесс КАК БизнесПроцесс.ТвойТип).ПометкаУдаления |
|||
12
Крошка Ру
03.10.14
✎
14:45
|
(0)Замени в ГДЕ кучу ИЛИ одним В СПИСКЕ()
|
|||
13
lodger
03.10.14
✎
14:49
|
(12) цифры перечисления не справа, а слева.
|
|||
14
Drac0
03.10.14
✎
15:02
|
(0) Вместо ИЛИ сделай ОБЪЕДИНИТЬ ВСЕ из 4-х запросов.
|
|||
15
g00dtlt
03.10.14
✎
15:29
|
а я думаю дело в "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ", различные хорошо утяжеляет запрос, я бы делал запрос напрямую в бизнес процессы и сделал условие с подзапросом. Примерно так (не проверял)
---------------------- ВЫБРАТЬ РАЗРЕШЕННЫЕ ЗадачаИсполнителя.БизнесПроцесс ИЗ БизнесПроцессы.БизнесПроцесс КАК БизнесПроцесс ГДЕ БизнесПроцесс.ПометкаУдаления = ЛОЖЬ и ЗадачаИсполнителя.БизнесПроцесс в (ВЫБРАТЬ РАЗРЕШЕННЫЕ ЗадачаИсполнителя.БизнесПроцесс ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ГДЕ ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ И ЗадачаИсполнителя.Предмет в (&списокПредметов)) |
|||
16
g00dtlt
03.10.14
✎
15:30
|
чета криво ушло
ВЫБРАТЬ РАЗРЕШЕННЫЕ ЗадачаИсполнителя.БизнесПроцесс ИЗ БизнесПроцессы.БизнесПроцесс КАК БизнесПроцесс ГДЕ БизнесПроцесс.ПометкаУдаления = ЛОЖЬ и ЗадачаИсполнителя.БизнесПроцесс в (ВЫБРАТЬ РАЗРЕШЕННЫЕ ЗадачаИсполнителя.БизнесПроцесс ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ГДЕ ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ И ЗадачаИсполнителя.Предмет в (&списокПредметов) ) |
|||
17
g00dtlt
03.10.14
✎
15:31
|
опечатался
------------- ВЫБРАТЬ РАЗРЕШЕННЫЕ БизнесПроцессы.БизнесПроцесс ИЗ БизнесПроцессы.БизнесПроцесс КАК БизнесПроцесс ГДЕ БизнесПроцесс.ПометкаУдаления = ЛОЖЬ и БизнесПроцессы.БизнесПроцесс в (ВЫБРАТЬ РАЗРЕШЕННЫЕ ЗадачаИсполнителя.БизнесПроцесс ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ГДЕ ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ И ЗадачаИсполнителя.Предмет в (&списокПредметов) ) |
|||
18
Aceforg
03.10.14
✎
15:39
|
(17) В параметр &списокПредметов передается список реквизитов?
|
|||
19
Maxus43
03.10.14
✎
15:48
|
(18) нет, человек не так понял твою задачу, там список значений, а у тебя оно одно
|
|||
20
H A D G E H O G s
03.10.14
✎
15:51
|
Добавить в Задачу ТЧ "Предметы", переписать их туда.
Написать запрос с учетом этого и вернуться. |
|||
21
Bober
03.10.14
✎
15:52
|
(0) у тебя реквизиты: Предмет, Предмет1, Предмет2, Предмет3 индексируются?
|
|||
22
AlexITGround
03.10.14
✎
16:02
|
(0) По сути это ничто иное как внутреннее соединение - именно так рекомендовалось в одной статье по оптимизации, правда не сильно я заметил в своих задачах прироста скорости выполнения.
Самый производительный способ - это все же через ОБЪЕДИНИТЬ (без ВСЕ), как предложено выше, все-таки различные требуется выбрать. Обязательно сделай то, что предложено в (11). Про вот это "ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ" можно, изуально лучше читается, по производительности в запросе одно и тоже, если будево не сравнивать с булево. Если кратко: |
|||
23
AlexITGround
03.10.14
✎
16:03
|
1. Объединение
2. Внутреннее соединение |
|||
24
AlexITGround
03.10.14
✎
16:04
|
Правда, внутреннее соединение следует использовать, если у тебя ПредметN - это одна таблица.
|
|||
25
AlexITGround
03.10.14
✎
16:04
|
Ах, да --> &Предмет, все-таки одна :)
|
|||
26
Крошка Ру
03.10.14
✎
16:05
|
Всё-таки настоятельно рекомендую избавиться от ИЛИ в условии. И проиндексировать Предметы.
|
|||
27
H A D G E H O G s
03.10.14
✎
16:08
|
(26) Ребята, вы жгете.
|
|||
28
H A D G E H O G s
03.10.14
✎
16:09
|
Нууу, в целом, (27) относится ко всем высказавшимся.
|
|||
29
Гёдза
03.10.14
✎
16:16
|
(28) А что не так?
|
|||
30
AlexITGround
03.10.14
✎
16:16
|
(28) Дмитрий, объясни, что-то я не понял.
|
|||
31
AlexITGround
03.10.14
✎
16:26
|
нормально, всех заинтриговал, а сам ушел, видимо, пиво пить :)
|
|||
32
Drac0
03.10.14
✎
16:28
|
(31) Думаю, он уже того.
|
|||
33
H A D G E H O G s
03.10.14
✎
16:29
|
Эти 4 реквизита - предмета заменить на ТЧ "Предметы".
|
|||
34
H A D G E H O G s
03.10.14
✎
16:29
|
И уже потом смотреть, что не так.
|
|||
35
AlexITGround
03.10.14
✎
16:50
|
(33) с этим все согласятся, что 4 реквизита одного типа - это глупо, но решаем задачу, исходя из первоочередной посылки...аль мне надо сербануть, чтобы тебя понять? :) может, ты другое что имел в виду
|
|||
36
H A D G E H O G s
03.10.14
✎
17:02
|
(35) "аль мне надо сербануть, ". хмм, гммм, ну пусть будет непереводимой игрой слов белорусского диалекта.
Что касается решения задачи - так вот оно, в (33) решение. |
|||
37
Ник второй
03.10.14
✎
17:50
|
(15) ты пожалуйста больше не пиши такие глупости.
|
|||
38
Bober
03.10.14
✎
18:04
|
(36) хорошее решение приятное без состояния "а если подумать".
|
|||
39
Enders
03.10.14
✎
18:22
|
(38) а главное правильное ;) если есть уже 4ри реквизита, кто даст гарантию, что через месяц-два не появится 5ого, а тогда придётся переписывать запрос и скорее всего не один.
|
|||
40
Bober
03.10.14
✎
18:33
|
(39) а главное осталось понять зачем там 4 предмета
|
|||
41
SeiOkami
03.10.14
✎
18:33
|
Может уже говорили, но:
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ЗадачаИсполнителя.БизнесПроцесс ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ГДЕ &Предмет В (ЗадачаИсполнителя.Предмет, ЗадачаИсполнителя.Предмет1, ЗадачаИсполнителя.Предмет2, ЗадачаИсполнителя.Предмет3) И ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ И ЗадачаИсполнителя.БизнесПроцесс.ПометкаУдаления = ЛОЖЬ "Или" зачастую очень тормозит систему |
|||
42
SeiOkami
03.10.14
✎
18:33
|
(41) -> (0)
|
|||
43
MrStomak
03.10.14
✎
18:57
|
(41) К сожалению, скорее всего скана таблицы всё равно не избежать при подобном запросе.
|
|||
44
Aprobator
03.10.14
✎
20:32
|
В качестве метода научного тыка можно попробовать
Но, вряд ли это поможет. Этот код скорее интересен в части недокументированной возможности использования оператора ВЫБОР. |
|||
45
Sammo
04.10.14
✎
06:20
|
(41) Тогда уж запрос сделать по-другому, чтобы в скуле был не in, а exists
Решение в 33 хорошее, если это можно сделать. |
|||
46
GANR
04.10.14
✎
15:02
|
(0) См. рекомендации (20)(21). Плюс ИЛИ из запроса надо убирать (ОБЪЕДИНИТЬ, либо (16)) - конструкция ИЛИ несмотря на индексы будет сканировать всю таблицу (хотя, возможно, оптимизаторы СКЛ 2012 может и нормально составят план запроса с этим ИЛИ при наличии индексов).
|
|||
47
softilium
06.10.14
✎
00:03
|
Как минимум, для нормального выполнения "ИЛИ" нужно из запроса выкинуть.
Типичный способ - замена на ОБЪЕДИНИТЬ. |
|||
48
PePaRiTB
06.10.14
✎
03:23
|
(0) оптимально будет:
1) все реквизиты Предмет* вынести в ТЧ и добавить индексацию по реквизиту 2) Сделать пакетный запрос, примерный:
|
|||
49
stopa85
06.10.14
✎
06:10
|
(0) А почему в базе предмет не ТЧ? Если вынести в ТЧ Предметы, ИМХО, очень эффективно избавит от ИЛИ в запросе.
|
|||
50
cons74
06.10.14
✎
08:12
|
Типичные причины неоптимальной работы запросов и методы оптимизации
использование логического ИЛИ в условиях; http://myfolder.ru/files/41911355 |
|||
51
TormozIT
гуру
06.10.14
✎
11:27
|
1. Попробуй без РАЗРЕШЕННЫЕ. Если запрос значительно ускорится, то смотри в техножурнале конечный запрос к СУБД на предмет отягощения его запросами RLS.
2. Если поля ПредметX многотипные, попробуй наложить отбор по типу значения поля (ЗадачаИсполнителяПредметы.ПредметX ССЫЛКА <ТипМетаданных>.<ОбъектМетаданных>) 3. Думаю временные таблицы здесь врядли дадут заметный выигрыш. Пробуй их в последнюю очередь. |
|||
52
MrStomak
06.10.14
✎
17:51
|
(51) Тип поля "ПредметХ" тут не влияет. Влияло бы, если бы сравнение было не на эквивалентность, а на вхождение.
|
|||
53
H A D G E H O G s
06.10.14
✎
18:01
|
Мы идем в тишине по убитой весне,
По разбитым домам, по седым головам, По зелёной земле, почерневшей траве, По упавшим телам, по великим делам... Ворох писем.... Это я к чему? Автор забыл уж о своих ветках и проблемах. |
|||
54
rsv
06.10.14
✎
18:18
|
:)
|
|||
55
TormozIT
гуру
06.10.14
✎
19:15
|
(52) Согласен. Однако тут многие уже прописывали замену одним полем и соответственно условием "В". Кроме того возможно исходное условие
И (ЗадачаИсполнителя.Предмет = &Предмет ИЛИ ЗадачаИсполнителя.Предмет1 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет2 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет3 = &Предмет) допустимо заменить на И ЗадачаИсполнителяПредметы.ПредметX ССЫЛКА <ТипМетаданных>.<ОбъектМетаданных1> И ЗадачаИсполнителяПредметы.ПредметX ССЫЛКА <ТипМетаданных>.<ОбъектМетаданных2> И ЗадачаИсполнителяПредметы.ПредметX ССЫЛКА <ТипМетаданных>.<ОбъектМетаданных3> И (ЗадачаИсполнителя.Предмет = &Предмет ИЛИ ЗадачаИсполнителя.Предмет1 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет2 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет3 = &Предмет) |
|||
56
MrStomak
06.10.14
✎
21:41
|
(55) Не согласен с последним утверждением, что допустимо заменить - результат не идентичен запросу из (0) т.к. нам нужно, чтобы хотя бы один из ПредметХ был нужного типа и значения, у вас же накладываются ограничения по типу и на остальные поля ПредметХ, таким образом, могут быть пропущены данные, когда Предмет1 = &Предмет, а Предмет2, допустим, совсем левый (другая Tref, число, дата и т.д.).
Согласен, что заигрывания с приведением типов могут в таких сложных случаях как-то повлиять и субд будет использовать предикаты по составному индексу для поля (тип составного типа, тип метаданных, ссылка). Но в лучшем случае это будет 4 выполнения index seek, если для каждого из полей Предмет создан свой отдельный индекс и эти значения достаточно селективны. Скорее всего, тут вообще индексов даже нет по этим полям... |
|||
57
MrStomak
06.10.14
✎
21:45
|
(56) И 4 index seek по разным идексам, как я понимаю, возможны только при 4 объединениях, а из 1го запроса этого не достичь. Но могу ошибаться...
|
|||
58
User_Agronom
06.10.14
✎
21:51
|
() ...Про предложение "объединить все" вместо "ИЛИ"...
Думаете 4 полных цикла отработают быстрее чем один с четырмя проверками? Безумству храбрых пою я песню (с) (0) Скорее всего мучают различные. Сначала выбери все разрешенные, а потом мучай различные. //Например: ВЫБРАТЬ РАЗРЕШЕННЫЕ ЗадачаИсполнителя.БизнесПроцесс ПОМЕСТИТЬ УраОтобрали ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ГДЕ ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ И (ЗадачаИсполнителя.Предмет = &Предмет ИЛИ ЗадачаИсполнителя.Предмет1 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет2 = &Предмет ИЛИ ЗадачаИсполнителя.Предмет3 = &Предмет) И ЗадачаИсполнителя.БизнесПроцесс.ПометкаУдаления = ЛОЖЬ ; ВЫБРАТЬ РАЗЛИЧНЫЕ БизнесПроцесс ИЗ УраОтобрали. |
|||
59
sda553
06.10.14
✎
21:55
|
(0) Индексы по предметам нельщя создать как нибудь?
|
|||
60
MrStomak
06.10.14
✎
21:59
|
(58) Если есть 4 индекса, то будет не 4 полных цикла.
|
|||
61
TormozIT
гуру
07.10.14
✎
09:54
|
(56) Я написал _возможно_..._допустимо_заменить, т.е. предполагал, что существует вероятность наличия не озвученных автором условий. Это не было безусловным утверждением.
|
|||
62
User_Agronom
07.10.14
✎
10:30
|
(60) Четыре полных. Идти будут быстрее по индексированным полям.
|
|||
63
sf
07.10.14
✎
10:35
|
(60) (62) вот вы жгете, что есть "четыре полных неполных цикла" ?
(62) >>Идти будут быстрее по индексированным полям. имхо, заблуждение |
|||
64
MrStomak
08.10.14
✎
11:12
|
(62) Ты, очевидно, ни малейшего представления о физических операторах СУБД не имеешь. Зачем пишешь тогда всё это? Непонятно. Выглядишь глупо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |