Я сталкиваюсь со странной проблемой, возникающей при доступе к историческим записям во временной таблице. Запросы, которые обращаются к более старым записям во временной таблице через подпункт AS OF, занимают больше времени, чем запросы к последним историческим записям.
Хронологическая таблица была сгенерирована SQL Server (включает кластерный индекс для столбцов даты и использует сжатие страниц), я добавил 50 млн строк в хронологическую таблицу, и мои запросы получили около 25 000 строк.
Я попытался определить причину проблемы, но не смог ее идентифицировать. Пока что я проверил:
- Создание тестовой таблицы с 50 миллионами строк с кластеризованным индексом, чтобы увидеть, было ли замедление вызвано просто объемом. Мне удалось получить 25K строк в постоянное время (~ 400 мс).
- Удаление сжатия страницы из исторической таблицы. Это не повлияло на время поиска, но значительно увеличило размер таблицы.
- Я попытался получить доступ к строкам таблицы истории напрямую, используя столбец идентификатора и столбцы даты. Здесь все было немного интереснее. Я мог получить доступ к более старым строкам в таблице на ~ 400 мс, где, как и в случае с подпунктом AS OF, это заняло бы ~ 1200 мс. Я попытался выполнить фильтрацию в своей тестовой таблице в столбце даты и заметил аналогичное замедление по сравнению с фильтрацией в столбце идентификатора. Это приводит меня к мысли, что сравнение дат стоит за некоторым замедлением.
Я хочу посмотреть на это больше, но я также хочу убедиться, что я не лаю не на то дерево. Во-первых, сталкивался ли кто-нибудь с таким же поведением при доступе к более старым историческим данным во временной таблице (мы только заметили, что замедления прошли 10 миллионов строк)? Во-вторых, какие стратегии я могу использовать, чтобы дополнительно изолировать основную причину проблемы с производительностью (я только начал изучать планы выполнения, но она все еще немного загадочна для меня)?
Планы выполнения
Это простые поисковые запросы: первый обращается к более старым строкам, второй обращается к новым строкам.
Старые ряды ~ 1200мс время выполнения
Последние строки ~ 350мс время выполнения
Детали таблицы
Это столбцы во временной таблице. Таблица истории имеет те же столбцы, но не имеет первичного ключа (согласно требованиям таблицы истории):