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) --------------------------------------------- Тему можно закрыть, отбой вопроса, непонятно как-то
Сообщение отредактировал Simol - Суббота, 15.11.2014, 21:47 |
|
| |