Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Условие LIKE: с ESCAPE - долго, без ESCAPE - быстро.  [new]
vs84
Member

Откуда:
Сообщений: 2
Здравствуйте.
Дано:
- MS SQL 2008 R2

Таблицы:
Имя SQL Количество строк
_Reference128 52 046
_Document309 597 719
_Reference162 68 340

Фрагментации индексов нет (не более 5%), статистика свежая.
Это база конфигурации 1С:Предприятия, следовательно возможности влиять на sql-запрос ограничены.

Есть запрос:

SELECT TOP 40
T1._IDRRef,
T2._Fld20671RRef,
T3._Fld3170,
T4._Fld3964RRef
FROM dbo._Document309 T1
LEFT OUTER JOIN dbo._InfoRg20669 T2
ON (0x08 = T2._Fld20670_TYPE AND 0x00000135 = T2._Fld20670_RTRef AND T1._IDRRef = T2._Fld20670_RRRef)
LEFT OUTER JOIN dbo._Reference128 T3
ON T1._Fld7737RRef = T3._IDRRef
LEFT OUTER JOIN dbo._Reference162 T4
ON T1._Fld7731RRef = T4._IDRRef
WHERE (T3._Fld3170 LIKE '%9701074127%' ESCAPE '/')
-ORDER BY (T1._Date_Time), (T1._IDRRef)

Выполняется 3 сек (план во вложении).

Если в условии убрать ESCAPE '/', то время выполнения становится 0,3 сек (план во вложении).
Конструкцию ESCAPE добавляет сама платформа.

Разница в результатах с использованием ESCAPE и без мне понятна, но я готов пренебречь ей ради ускорения.

Собственно, вопросы:
- Это вообще нормально? Такая разница.
- Можно ли добиться ускорения, без изменения текста запроса.
- Как крайняя мера (сразу оговорюсь, я к mssql достаточно посторонний) есть идея: для нужных мне запросов чистить ESCAPE из запросов - это если в mssql есть событие, в котором мы можем перехватить текст запроса до его исполнения и изменить его (далее выполнится измененный). Такое возможно?

К сообщению приложен файл (Планы.zip - 6Kb) cкачать
25 июн 18, 13:10    [21518421]     Ответить | Цитировать Сообщить модератору
 Re: Условие LIKE: с ESCAPE - долго, без ESCAPE - быстро.  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
vs84
- Это вообще нормально? Такая разница.
Да. Разница из-за отличия в оценке количества строк для предиката like с и без escape.
vs84
Можно ли добиться ускорения, без изменения текста запроса.
Вряд ли.
Есть методы, но они затронут весь сервер (или БД), а не конкретныый запрос.
Хотя, можете попробовать вот это - https://docs.microsoft.com/ru-ru/sql/relational-databases/performance/specify-query-parameterization-behavior-by-using-plan-guides?view=sql-server-2017
vs84
для нужных мне запросов чистить ESCAPE из запросов - это если в mssql есть событие, в котором мы можем перехватить текст запроса до его исполнения и изменить его (далее выполнится измененный). Такое возможно?
Нет.
25 июн 18, 13:58    [21518592]     Ответить | Цитировать Сообщить модератору
 Re: Условие LIKE: с ESCAPE - долго, без ESCAPE - быстро.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Удивляет условие, накладываемое на правую таблицу LEFT JOINа в WHERE.
Это какая-то неправильная "платформа".
Хотя, наверно, им было лень формировать ещё и отдельные тексты для INNER JOIN и LEFT OUTER JOIN...
25 июн 18, 14:13    [21518664]     Ответить | Цитировать Сообщить модератору
 Re: Условие LIKE: с ESCAPE - долго, без ESCAPE - быстро.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
Удивляет условие, накладываемое на правую таблицу LEFT JOINа в WHERE.
Это какая-то неправильная "платформа".
Хотя, наверно, им было лень формировать ещё и отдельные тексты для INNER JOIN и LEFT OUTER JOIN...

так судя по тексту 1С :)
25 июн 18, 14:27    [21518706]     Ответить | Цитировать Сообщить модератору
 Re: Условие LIKE: с ESCAPE - долго, без ESCAPE - быстро.  [new]
vs84
Member

Откуда:
Сообщений: 2
invm, спасибо.
25 июн 18, 14:33    [21518724]     Ответить | Цитировать Сообщить модератору
 Re: Условие LIKE: с ESCAPE - долго, без ESCAPE - быстро.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
vs84,

никогда не пользовался, с ESCAPE действительно намного дольше работает запрос. Кроме как подпилить 1С нет вариантов.
25 июн 18, 17:30    [21519320]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить