Имя: Пароль:
1C
1С v8
Интересное про поиск в дин списке по "вхождению" (странная конструкция ESCAPE на MSSQL)
,
0 vs84
 
05.06.18
17:21
Здравствуйте.

Заметил странную штуку.
В динсписке документа выполняем контекстный поиск по реквизиту Клиент, например. На скл уходит запрос такого вида:
exec sp_executesql N'
SELECT TOP 45
T1._IDRRef,
T1._Version,
T1._Fld7731RRef
FROM dbo._Document309 T1
LEFT OUTER JOIN dbo._Reference162 T2
ON T1._Fld7731RRef = T2._IDRRef
WHERE (T2._Description LIKE P1 ESCAPE ''/'')
ORDER BY (T1._Date_Time)',N'P1 nvarchar(4000)',N'%кукуку%'

Такой же запрос будет если мы укажет отбор через настройку списка - добавим отбор с видом сравнения "содержит".

Этот запрос выполняется примерно 3 сек на моем примере.
Если убрать ESCAPE ''/'' и оставить условие WHERE (T3._Description LIKE @P9), то на скл запрос выполняется 0,16 сек. Разное время, т.к. используются разные планы.
Если убрать ORDER BY (T1._Date_Time) то всегда выполняется быстро - планы так же разные, но в обоих случаях к избыточным выборкам не приводят.
Штука стабильно воспроизводится.

Если выполнять запросы из консоли запросов с условием вида ЗаказКлиента.Партнер.Наименование ПОДОБНО &Наименование, то LIKE на скл не добавляется, если добавлять СПЕЦСИМВОЛ "/", то добавляется. Платформа значит всегда значит запросы по поиску в динспике шлет с такой конструкцией (что объяснимо, пользователь может указать всякие символы, которые могут оказаться с т.з скл спецсимволами).

Собственно, я готов бы пожертвовать "корректностью" платформенного поиска (то, что он обрабатывает возможные спецсимволы) и научить ее выполнять запросы без него (раз он быстрее).
Допускаю, что все это воспроизводится именно на моем состоянии данных, но может и нет.

Если кто ходил по таким граблям - делитесь информацией.
1 vs84
 
05.06.18
17:33
Собственно, мне кажется что штатно управлять тем, что платформа шлет на скл не получится. Поэтому, может на скл есть возможность модифицировать запросы перед из выполнением? Что-то типа события "Перед выполнением запроса". Тогда в запросы нужных динсписков добавить поля-маркеры, что этот запросы нужно почистить (например, поле со значение "Почистить лайки"), и в этом обработчике, если в тексте запроса есть этот маркер, то удалить все ESCAPE.
2 PiotrLoginov
 
05.06.18
17:38
Продолжайте наблюдение. Выхлоп, имхо, небольшой, но вообще - тема заслуживает внимания. Нарыть в документации наличие/отсутствие подходящих событий наверное не составит труда.
3 vs84
 
05.06.18
17:41
(2) спасибо за моральную поддержку
4 МихаилМ
 
05.06.18
17:41
укажите версии ПО. в том числе клиента ole db.
5 Franchiser
 
гуру
05.06.18
17:44
никак ты не заставишь дин. список слать другой запрос, ну только если не пропатчишь какой-нить DLL
6 vs84
 
05.06.18
17:45
1С:Предприятие 8.3 (8.3.10.2561)
MS SQL 2008 R2

> в том числе клиента ole db
Если подскажете где это можно посмотреть - буду благодарен.
7 Вафель
 
05.06.18
17:54
в чем отличие в планах?
8 vs84
 
05.06.18
18:05
9 vs84
 
05.06.18
19:42
(2) "Нарыть в документации наличие/отсутствие подходящих событий наверное не составит труда."

Вот порывшись в документации на mssql я не нашел ничего про то, что можно перехватить текст запроса и что-то с ним сделать до его исполнения.
10 vs84
 
25.06.18
19:42
"Поэтому, может на скл есть возможность модифицировать запросы перед из выполнением? "

на sql.ru ответили, что нельзя.
http://www.sql.ru/forum/1296916-a/uslovie-like-s-escape-dolgo-bez-escape-bystro