Пятница, 11.10.2024, 07:29
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Прошу помочь донести до разработчиков 1с как ускорить работу
SimolДата: Суббота, 15.11.2014, 21:40 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 237
Репутация: 27
Статус: Оффлайн
Последняя 8.3.5

Начал еще раз разбираться с медленным восстановлением последовательности. Все упирается в использовании виртуальной таблицы регистра накопления Остатки.
Выполняю запрос получение на нужную дату в середине месяца старого года по одному измерению и одному ресурсу. Запрос во вложении.
Смотрю во что превращается запрос в Sql. Во вложении.
Там соединяется таблица итогов и часть основной таблицы. Все логично. Но если посмотреть на запрос из основной таблицы, то там есть избыточное условие:
(_Period = @P6) AND (_Period < @P8)
где @P6 выбранная мною дата, а @P8 это начало следующего месяца. Из-за этой избыточности и происходит торможение.
Если убрать (_Period < @P8), то запрос существенно ускоряется.

Можешь это вынести на партнерский форум?

Добавлено (15.11.2014, 21:38)
---------------------------------------------
Речь про выполнение запроса в транзакции при восстановлении последовательностей, потому там возникает дополнительное условие на регистратор, чего нет в при выполнение этого же запроса вне транзакции.

Оригинальное условие:
WHERE (T4._Period > @P5 OR T4._Period = @P6 AND (T4._RecorderTRef > 0x00000141 OR T4._RecorderTRef = 0x00000141 AND T4._RecorderRRef >= @P7)) AND T4._Period < @P8 AND T4._Active = 0x01

Если раскрыть скобки, то получается:
WHERE     (_Period > @P5) AND (_Period < @P8) AND (_Active = 0x01) OR
(_Period = @P6) AND (_Period < @P8) AND (_Active = 0x01) AND (_RecorderTRef > 0x00000141) OR
(_Period = @P6) AND (_Period < @P8) AND (_Active = 0x01) AND (_RecorderTRef = 0x00000141) AND (_RecorderRRef >= @P7)

Причем @P6 заведомо меньше @P8

Профайлер дает следующие данные:
Оригинальное условие : Reads 45000 Duration 433
Раскрытые скобки :  Reads 45000 Duration 500
Оптимизированное условие: xм, а теперь в 2 раза дольше

Почему-то оптимизированное условие медленне условия с раскрытыми скобками.
WHERE     (_Period > @P5) AND (_Period < @P8) AND (_Active = 0x01) OR
(_Period = @P6) AND (_Active = 0x01) AND (_RecorderTRef > 0x00000141) OR
(_Period = @P6) AND (_Active = 0x01) AND (_RecorderTRef = 0x00000141) AND (_RecorderRRef >= @P7)

Добавлено (15.11.2014, 21:40)
---------------------------------------------
Тему можно закрыть, отбой вопроса, непонятно как-то
Прикрепления: SQL.txt (2.4 Kb) · 9988432.txt (0.2 Kb)


Сообщение отредактировал Simol - Суббота, 15.11.2014, 21:47
 
  • Страница 1 из 1
  • 1
Поиск: