Как повысить производительность аудиторских таблиц?
ПРОБЛЕМА
Триггеры аудита снижают производительность моего запроса на массовые обновления, вставляя старую строку и новую строку в каждое обновление.
В этом триггере вставка старых строк по какой-то причине занимает гораздо больше времени, чем вставка новых строк.
ТАБЛИЦА
Таблица аудита имеет кластерный индекс, 3 некластерных индекса и получила примерно 35 миллионов записей.
Cluster Index
GROUPID , USERID, IDENDITYCOLUMN
ФАКТ
Старые строки могут быть вставлены в любое место в кластеризованном индексе
Новые строки будут вставлены внизу кластерного индекса
РАССЛЕДОВАНИЕ
Я протестировал, что Cache может значительно повысить производительность в этой операции, но я не понял, что именно нужно кэшировать.
Предположения
Я предполагаю, что кластерный индекс является наиболее релевантным индексом в операции вставки.
Я предполагаю, что, выполняя запрос к нужным страницам кластерного индекса, производительность аудита может быть значительно улучшена
ДЕЙСТВИЯ
Я создал запрос для загрузки всех строк аудита, связанных со строками, которые я собираюсь вставить в операционную таблицу. Благодаря этому производительность улучшилась чуть более чем в 2 раза, но была недостаточно хороша.
ПОЧЕМУ ХОРОШО ХОРОШО?
Я сделал еще один тест, который показал гораздо большую производительность, но я не понял, что именно мне нужно для кеширования.
КАК ЭТО ТЕСТ?
T01 - ОБРАТНО И ЧЕТВЕРТЫЙ ТЕСТ
Я взял 1000 строк из оперативной таблицы и обновил их взад и вперед, чтобы увидеть, получаю ли я удивительную производительность кеша из таблицы аудита.
A) I have updated GROUPID of 1000 rows to value X (it took a while)
B) I have updated GROUPID of the same 1000 rows to value Y (it took a while)
C) I have updated GROUPID of the same 1000 rows to value X (astonishing cache performance)
D) I have updated GROUPID of the same 1000 rows to value Y (astonishing cache performance)
T02 - ПРОВЕРЬТЕ ОБЪЕКТЫ, КОХИРУЕМЫЕ НА ТАБЛИЦЕ АУДИТА, КОГДА ОБНОВЛЯЕТСЯ ОПЕРАЦИОННАЯ ТАБЛИЦА
Затем я очистил кэш аудита, кэш индексов и кэш данных и снова выполнил T01 - A).
Я получаю, что и страницы индекса кластера, и страницы данных были загружены, причем примерно в одинаковом количестве, а остальное количество страниц было загружено в другие индексы.
T03 - ПРОВЕРЬТЕ ОБЪЕКТЫ, КЭШЕННЫЕ НА СТОЛБЕ АУДИТОРА, КОГДА ВЫПОЛНЯЕТЕ МОЙ ИСКУССТВЕННЫЙ КЭШ ЗАГРУЗИТЬ ЗАПРОС
Затем я очистил кэш аудита и выполнил свой запрос. Он только загрузил примерно половину страниц по сравнению с тестом T02.
КАКУЮ ЛОГИКУ Я ПРИМЕНИЛ К МОЕМУ ИСКУССТВЕННОМУ КЭШУ ЗАГРУЗКИ?
Я предположил, что если я сделаю запрос на все строки в таблице аудита, где GROUPID И USERID существует в 1000 строк для обновления (в операционной таблице), я бы загрузил для кэширования все кластеризованные индексы и страницы данных, необходимые для обеспечения высокой производительности от триггера аудита.
Cluster Index
GROUPID , USERID, IDENDITYCOLUMN
Однако это оказалось не так, поскольку у меня было загружено половину страниц по сравнению с тестом T02.
ВОПРОС Что я могу сделать, чтобы получить результаты теста T01 - C) или D) в первый раз? Я могу думать только в предварительном кэшировании страниц данных / индекса, но я не могу выяснить, чего именно не хватает.
Если у вас есть другие предложения по улучшению триггеров таблицы аудита, это также полезно.
БАЗА ДАННЫХ
SYBASE 15.7
ПРИМЕЧАНИЕ. Это таблица, относящаяся к конкретному продукту, что означает, что я не могу изменить ее по своему желанию. У меня есть некоторые ограничения.