Как повысить производительность аудиторских таблиц?

ПРОБЛЕМА

Триггеры аудита снижают производительность моего запроса на массовые обновления, вставляя старую строку и новую строку в каждое обновление.

В этом триггере вставка старых строк по какой-то причине занимает гораздо больше времени, чем вставка новых строк.

ТАБЛИЦА

Таблица аудита имеет кластерный индекс, 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

ПРИМЕЧАНИЕ. Это таблица, относящаяся к конкретному продукту, что означает, что я не могу изменить ее по своему желанию. У меня есть некоторые ограничения.

0 ответов

Другие вопросы по тегам