Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Интересное про поиск в дин списке по "вхождению" (странная конструкция ESCAPE на MSSQL)

Интересное про поиск в дин списке по "вхождению" (странная конструкция ESCAPE на MSSQL)
Я
   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 на скл не добавляется, если добавлять СПЕЦСИМВОЛ "/", то добавляется. Платформа значит всегда значит запросы по поиску в динспике шлет с такой конструкцией (что объяснимо, пользователь может указать всякие символы, которые могут оказаться с т.з скл спецсимволами).

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

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

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует