Мы испытали тайм-ауты SQL и обнаружили, что узким местом является таблица аудита - все таблицы в нашей системе содержат триггеры вставки, обновления и удаления, которые вызывают новую запись аудита.
Это означает, что таблица аудита является самой большой и загруженной таблицей в системе. Тем не менее, данные только входят и никогда не выходят (в этой системе), поэтому производительность select
не требуется.
Выполнение select top 10
возвращает недавно вставленные записи, а не «первые» записи. order by
работает, конечно, но я ожидаю, что вершина select должна возвращать строки в зависимости от их порядка на диске - что, я ожидаю, вернет самые низкие значения PK.
Было предложено удалить кластеризованный индекс, а также первичный ключ (ограничение уникальности). Как я упоминал ранее, нет необходимости select
из этой таблицы в этой системе.
Какое влияние на производительность создает кластерный индекс для таблицы? Каковы (не выбранные) последствия наличия неиндексированной, некластеризованной таблицы без ключей? Любые другие предложения?
редактировать
наш аудит включает в себя функции CLR, и теперь я проверяю с использованием и без использования PK, индексов, FK и т. Д. Для определения относительной стоимости функций CLR и ограничений.
После расследования плохая производительность была связана не с заявлениями insert
, а с функцией CLR, которая организовывала аудит. После удаления CLR и использования прямого процесса TSQL производительность повысилась в 20 раз.
В ходе тестирования я также определил, что столбцы кластеризованного индекса и идентификатора практически не влияют на время вставки, по крайней мере, по сравнению с любой другой выполняемой обработкой.
// updating 10k rows in a table with trigger
// using CLR function
PK (identity, clustered)- ~78000ms
No PK, no index - ~81000ms
// using straight TSQL
PK (identity, clustered) - 2174ms
No PK, no index - 2102ms