0. igordynets 02.07.19 15:30 Сейчас в теме

Анти-оптимизация: как мы ускорили запрос в 4 раза, сделав его неоптимальным

В этой статье приведен пример неочевидной "оптимизации" запроса, которая противоречит всем правилам, описанным в книгах для подготовки к сертификации "1С:Эксперт по технологическим вопросам", а также преподаваемым на курсах подготовки экспертов.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
119. ildarovich 6467 12.07.19 14:29 Сейчас в теме
(118) Спасибо за ссылки, но там я не увидел ответа на наш вопрос ускорения при использовании второго плана. У них и в том и другом случае был индекс, просто в первом варианте план показывал скан, а во втором поиск, что и озадачило авторов вопросов. Говорится о том, что поиск ведется по трем предикатам. Двум оптимизированным: "от", "до" и одному неоптимизированному "включает подстроку". Но в случае, когда шаблон начинается с %, первые предикаты вместе возвращают все строки! К которым затем применяются третий предикат. А в случае опции RECOMPILE второй план превращается в первый, так как вид строки поиска при формировании плана уже определен.

(117)
Мне кажется, просто этот оператор для like работает несколько иначе, чем просто перебор строк и разбор каждой на предмет соответствия условию. А вот как именно он это делает - это я уже не знаю
- моя догадка была в том, что поиск подстроки в относительно небольшом блоке памяти всех выбранных строк или в закэшированном файле индекса быстрее, чем работа со строками "по одной"
67. Dach 271 03.07.19 13:29 Сейчас в теме
(64)

все же написано в документации

https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/like-transact-sql?view=sql-server-2017

а про шаблоны - многие компании такое используют

Лично видел! В Москве есть весьма такая неплохая сеть магазинов автозапчастей: АвтоРусь (не сочтите за рекламу).
Там сотрудник для поиска конкретной запчасти по наименованию в поле поиска вбивает не просто абы как, а по шаблону, что-то типа: "патруб*Д10*Bosh*и т.д."

Каждый раз, кстати, как захожу к ним - всегда подглядываю, как у них 1С меняется - очень нравится, как все внедрено, формы красивые-удобные, кнопки там, прям пожать руку хочется разрабам
75. AlX0id 03.07.19 14:44 Сейчас в теме
(67)
"патруб*Д10*Bosh*и т.д."

Как раз таки подобная строка очень хорошо укладывается в поиск по индексу.. А вот кабы было "*патруб*Д10*Bosh*и т.д." - было бы интереснее.
Хотя конкретно для номенклатуры поиск правильнее организовать по свойствам, значения фильтров которых выбирать на форме. Ну или брать из строки "патруб*Д10*Bosh*и т.д.", разбив ее по звездочкам, например.
65. CyberCerber 287 03.07.19 13:21 Сейчас в теме
(61) Я тоже сразу об этом подумал, но не написал, т.к. постеснялся. :-) Подумал, да, решение очевидное, но я в оптимизации и планах запроса не очень силен, наверное, не подходит, раз о нем никто не пишет.
83. capitan 1205 03.07.19 16:32 Сейчас в теме
(61)В (15) предложили более приятное решение чем составной реквизит
100% оно за 1 сек отработает
84. Dach 271 03.07.19 16:45 Сейчас в теме
(83) не такое уж оно и приятное. Сколько времени будет такое РЗ выполняться? Если номенклатуры много, надо каждую разбить на блоки, перезаполнить по ней РС и т.д... Плюс есть временной лаг "неактуальности" данных, новая номенклатура в базу попала, а блоки поиска в РС по ней еще не заполнены - значит надо городить подписки на события, обработчики вешать на проверку изменения наименования и т.д. и т.п.

У нас есть похожее решение, хранит статичные связанные аналитики в отдельной таблице (тоже РС), куда потом в запросах приклеиваются динамически меняющиеся доп. данные. Перезаполнение этих аналитик нормально так нагружает весь сервер, хорошо, что нам хватает 1 раз в сутки их перезаполнять (по бизнес-логике)

Нет у этой задачи однозначно хороших решений, придется чем-то жертвовать
85. capitan 1205 03.07.19 17:03 Сейчас в теме
(84)Новая и измененная номенклатура легко вычисляется - при записи пишете ее в этот же регистр
И вуаля - небольшое получится РЗ
Можете ваш составной реквизит сделать измерением регистра и проиндексировать
88. Diversus 1952 03.07.19 17:16 Сейчас в теме
(84) Не обязательно перезаполнять все (это можно делать только при первом запуске).

А в общем алгоритм с оптимизациями примерно такой:
1) Создаем план обмена, который регистрирует изменения в номенклатуре.
2) Обработка регламентным заданием только той номенклатуры, которая была изменена.
3) После обработки убираем регистрацию с обработанной номенклатуры.
4) Регламентное, которое отрабатывает раз в минуту прекрасно будет справляться и не нагружать сервер.

В регистр пишем только начала слов начиная с 3-букв
"Туфли женские" трансформируются в регистре в:
туф
туфл
туфли
жен
женс
женск
женски
женские

Предположим, в строке поиска введено: "туф жен"
Разбиваем строку на слова по пробелам и загоняем результат в массив.

Ну а дальше запрос к регистру, без использования оператора ПОДОБНО.

Состав регистра с измерениями:
1. Подстрока (Индексирование включено);
2. Номенклатура;

Поиск должно работать быстро, места занимать не так уж и много будет, кстати, и все очень даже актуально (в минуту будет не много измененной номенклатуры... наверное...).

В очередной раз скажу:
1) Это алгоритм, который может потребовать дополнительных оптимизаций.
2) Велосипед придумал не я и я его не пробовал как оно работает в боевых условиях.
3) Да, я открыл для себя ПДД/ElasticSearch и т.п. и это осознаю :)
90. Dach 271 03.07.19 17:44 Сейчас в теме
(88)

убедили

Возьмем на заметку
91. Diversus 1952 03.07.19 17:59 Сейчас в теме
(90) А вообще, было бы интересно сравнить, что из всех этих методов (правильных и не очень) на реально большой базе будет быстрее.
92. acanta 56 03.07.19 20:17 Сейчас в теме
(88) в вашем случае условие будет и?
62. AlX0id 03.07.19 13:03 Сейчас в теме
Любой человек, который когда-нибудь занимался оптимизацией запросов скажет вам - "скан - это плохо", и будет прав.

Ни на одном из курсов, кстати, такое и не утверждается. Насчет книги не помню.
74. vbirin 18 03.07.19 14:44 Сейчас в теме
Добрый день.
А можно ли увидеть"Текст запроса в терминах SQL (платформа 8.2)", получившийся после добавления в запрос 1С 'ПОДОБНО'?
76. shard 253 03.07.19 14:55 Сейчас в теме
для любопытствующих, на постгре 9.6 план выполнения в обоих случаях
"seq scan on Справочник.Номенклатура t1  (cost=0.00..2206.72 rows=235 width=29) (actual time=2.254..82.594 rows=98 loops=1)
  filter: ((not ПометкаУдаления) and ЭтоГруппа and (ОбластьДанныхОсновныеДанные = '0'::numeric) and ((Наименование ~~ '%абыр%'::mvarchar) or (Артикул ~~ '%абыр%'::mvarchar)))
  rows removed by filter: 26896
planning time: 0.154 ms
execution time: 82.610 ms
",rowsaffected=98

справочник порядка 25 тыс товаров
82. Slava_prog 03.07.19 15:51 Сейчас в теме
Очень интересно бы получить ответы на следующие вопросы:

1) Зачем клиенту понадобилось повышать уровень совместимости (что это дало пользователям/бизнесу) ?
2) Какие проблемы были решены этим переводом ?
107. acanta 56 04.07.19 14:02 Сейчас в теме
Как минимум может быть
Обувь туфли женские
Или запчасти шарикоподшипник
Поскольку и так понятно, но в общем списке неудобно.
Справочник с ценами поставщиков в подборе по прайсу это хорошо.
С покупателями сложнее, но все это не относится к теме.
109. triviumfan 10 04.07.19 18:02 Сейчас в теме
Не верится. Что-то тут не так. Какой-то подвох! :)
Пробовали выполнять прямо из ssms?
110. gubanoff 47 09.07.19 13:09 Сейчас в теме
(0) в защиту авторов курсов по подготовке экспертов - уважаемый господин Бургомистров так и говорит на своих курсах, что всегда надо проверять результат оптимизации на практике в конкретных условиях и да, рекомендуемые методы не всегда дают требуемый результат.
Это в общем-то и есть адекватная точка зрения на этот вопрос. Не стоит переоценивать методические рекомендации, но и отказываться от них тоже не стоит. Рекомендации будут работать в 80% случаев, поэтому они и стали рекомендациями.
114. fedorovd81 10.07.19 23:39 Сейчас в теме
igordynets, а можно показать текстовый план запроса? Нет ли там seek...where?
115. igordynets 63 11.07.19 11:53 Сейчас в теме
(114) К сожалению, текстовый план запроса не сохранился, и возможности его получить уже нет.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Москва
Полный день

Консультант-аналитик 1С
Москва
Полный день

Консультант ERP-систем
Москва
Временный (на проект)

Бизнес-аналитик 1С
Москва
зарплата от 90 000 руб. до 150 000 руб.
Полный день