|
Симуляция условия ИЛИ в запросе через подобно | ☑ | ||
---|---|---|---|---|
0
ИС-2
naïve
13.04.23
✎
09:49
|
Согласно стандартам 1C не рекомендуется использовать конструкцию ИЛИ в запросах.
Задумался как можно обойти подобное ограничение так, чтобы не потерять в производительности такой вариант не работает Док.Комментарий ПОДОБНО ("%*.jpg%","%*.mp4") остается или конструкция с "выбор когда" или писать условие "ИЛИ" ? Какие еще есть варианты ? Понятно, что конструкция подобно является еще более тормозной, но пока надо с ней поработать . |
|||
1
Волшебник
13.04.23
✎
09:49
|
пишите ИЛИ, не слушайте 1С
делайте, как Вам надо |
|||
2
Волшебник
13.04.23
✎
09:50
|
Они обычно рекомендуют заменять ИЛИ на ОБЪЕДИНИТЬ.
|
|||
3
Конструктор1С
13.04.23
✎
10:01
|
ИЛИ может быть безвредным, если оно является аналогом В()
Контрагент = &Контрагент1 ИЛИ Контрагент = &Контрагент2 аналогично Контрагент В(&Контрагент1, &Контрагент2) в таком случае индекс по контрагенту может быть использован |
|||
4
BDA80
13.04.23
✎
10:15
|
А что комментарий у вас проиндексирован? Обычно это строка неограниченной длины
|
|||
5
Волшебник
13.04.23
✎
10:24
|
(4) Если знак процента впереди, то индекс не поможет
|
|||
6
Прапорщик
13.04.23
✎
10:26
|
(3) Автор ветки ищет по полю "Комментарий". Во всех (или почти во всех) типовых это реквизит с типом "строка неограниченной длины". Вряд ли тут вообще стоит вопрос об использовании индексов.
|
|||
7
lodger
13.04.23
✎
11:14
|
такие запросы к таким полям точно надо строить так:
выбрать где Комментарий ПОДОБНО "%*.jpg%" ОБЪЕДИНИТЬ выбрать где Комментарий ПОДОБНО "%*.mp4%" али так: выбрать поместить вт1 где другие нормальные условия сужающие диапазон ; // выбрать вт1 где вт1.Комментарий ПОДОБНО "%*.jpg%" ОБЪЕДИНИТЬ выбрать вт1 где вт1.Комментарий ПОДОБНО "%*.mp4%" |
|||
8
BDA80
13.04.23
✎
11:32
|
(7) Какой в этом смысл если поле не индексировано? Будет скан таблицы, а в вашем случае с объединить еще и дважды
|
|||
9
Волшебник
13.04.23
✎
11:39
|
(8) Ещё разок повторю. Если впереди процент, то индексация поля не поможет.
поле LIKE "mp4%" // индекс поможет поле LIKE "%mp4%" // индекс не поможет |
|||
10
BDA80
13.04.23
✎
12:00
|
(9)
И вопрос вообще не в %, а в том что человек слышал про стандарты разработки, но не понимает почему так рекомендуется Если у него это поле не индексировано, то и задаваться вопросом оптимизации смысла нет, тем более выполнять рекомендации из (7) |
|||
11
H A D G E H O G s
13.04.23
✎
11:58
|
(10) https://habr.com/ru/articles/655555/
Однако, поиск по индексу не будет задействован если использовать вот такие предикаты: ABS(a) = 1 a + 1 = 9 a like '%abc' |
|||
12
lodger
13.04.23
✎
12:04
|
нету там индексов.
остаётся понять, насколько криво будет работать конструкт вида комментарий подобно &шаблон1 или комментарий подобно &шаблон2 |
|||
13
lodger
13.04.23
✎
12:06
|
при наличии условий, которые попадают в индекс, но рядом такая штука (12) что будет делать скуль? воспользуется индексом и потом посчитает LIKE или в лоб запустить фулскан?
|
|||
14
BDA80
13.04.23
✎
12:06
|
(11) А если попробовать?
SELECT T1.Ссылка, T1.ИдентификаторПлатежа FROM Документ.РеализацияТоваровУслуг T1 WHERE ((T1.ОбластьДанныхОсновныеДанные = ?)) AND ((T1.ИдентификаторПлатежа LIKE ?)) p_0: 0N p_1: '%1904НР000000270000%' Index Seek(OBJECT:([ERP].[dbo].Документ.РеализацияТоваровУслуг.[Индекс по ОбластьДанныхОсновныеДанные, ИдентификаторПлатежа, Ссылка] AS [T1]), SEEK:([T1].[ОбластьДанныхОсновныеДанные]=[@P1] AND [T1].[ИдентификаторПлатежа] > [Expr1004] AND [T1].[ИдентификаторПлатежа] < [Expr1005]), WHERE:([ERP_AtolDrive_copy].[dbo].Документ.РеализацияТоваровУслуг.[ИдентификаторПлатежа] as [T1].[ИдентификаторПлатежа] like [@P2]) ORDERED FORWARD) Частичный SEEK по ИдентификаторПлатежа присутствует SELECT T1.Ссылка, T1.ИдентификаторПлатежа FROM Документ.РеализацияТоваровУслуг T1 WHERE ((T1.ОбластьДанныхОсновныеДанные = ?)) AND ((T1.ИдентификаторПлатежа LIKE ?) OR (T1.Ссылка = ?)) p_0: 0N p_1: '%1904НР000000270000%' p_2: 0x97FF00155D018B2D11E961ACBDF87DFD А вот это уже фактически скан Index Seek(OBJECT:([ERP].[dbo].Документ.РеализацияТоваровУслуг.[Индекс по ОбластьДанныхОсновныеДанные, ИдентификаторПлатежа, Ссылка] AS [T1]), SEEK:([T1].[ОбластьДанныхОсновныеДанные]=[@P1]), WHERE:([ERP_AtolDrive_copy].[dbo].Документ.РеализацияТоваровУслуг.[ИдентификаторПлатежа] as [T1].[ИдентификаторПлатежа] like [@P2] OR [ERP_AtolDrive_copy].[dbo].Документ.РеализацияТоваровУслуг.[Ссылка] as [T1].[Ссылка]=[@P3]) ORDERED FORWARD) |
|||
15
Волшебник
13.04.23
✎
13:24
|
(14) Что Вы нам планы показываете? Мы пробовали на таблице в 10 млн записей. Процент впереди тормозит запрос, несмотря на индексы
|
|||
16
H A D G E H O G s
13.04.23
✎
13:29
|
(14) Этот предикат остаточного поиска сломался, несите следующий
https://disk.yandex.ru/i/eeqalHa1MLOpBA https://disk.yandex.ru/i/XjxebgjYMniyNA |
|||
17
systemstopper
13.04.23
✎
15:41
|
(14) это не настоящий seek, а Index Seek - range scan https://stackoverflow.com/questions/18065994/how-can-like-seek-on-an-index
|
|||
18
BDA80
13.04.23
✎
15:47
|
(15)(16)(17) Согласен, если % вначале строки поиска, то фактически читает всю таблицу
|
|||
19
vde69
13.04.23
✎
16:20
|
(0) используй вместо запроса полнотекстовый поиск...
|
|||
20
mistеr
13.04.23
✎
18:35
|
(19) По крайней мере попробуй..
|
|||
21
Garykom
гуру
13.04.23
✎
20:01
|
(7) ОБЪЕДИНИТЬ ВСЕ если не требуется группировка
|
|||
22
Garykom
гуру
13.04.23
✎
20:02
|
(0) чем не устраивает обычный
(Док.Комментарий ПОДОБНО ("%*.jpg%") ИЛИ Док.Комментарий ПОДОБНО ("%*.mp4")) ? |
|||
23
OldCondom
13.04.23
✎
23:29
|
От условий задачи надо исходить. Может и вовсе придётся в РС перекируть этот комментарий, предварительно его заполнив частями по 500-1000 в несколько потоков транзакциями, или вынести все это добро в доп реквизит "расширение файла"
|
|||
24
OldCondom
13.04.23
✎
23:48
|
Кстати пару дней назад с "подобно" стояла задача. Начинается не с %, а со строковой литералы, индекс по идее должен работать. Поле проиндексировано, все ок. Запрос выполняется 6 секунд, хоть убейся, объединения, реиндексация, ребилд. Если ставит равенство вместо подобно - милисекунды. Перенесли в РС, левое соединениена равенство и готово, сократили закрытие на часы.
|
|||
25
mistеr
14.04.23
✎
07:45
|
(24) По одному символу индекс работает плохо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |