2011-01-27 2 views
2

Я новичок в базе данных и борюсь с проблемой. Я использую SQL Server 2005.Должен ли я использовать индекс в этом сценарии?

У меня есть таблица (таблица аудита), которая получает свои данные из триггера на другой таблице (основная таблица). В таблице аудита не может быть PK, поскольку могут быть дубликаты. Он имеет около 15 миллионов строк. Я запускаю на нем запрос на обновление, что приводит к сканированию таблиц.

Я хочу знать, добавляю ли я кластерный индекс, как я могу проверить его влияние на вставки/удаления. Адтер добавляет индекс, будет ли сценарий, когда данные, поступающие с триггера, будут потеряны, потому что сервер слишком занят перестройкой таблицы/индекса?

Благодаря Викрам

+0

Прежде всего: есть ли основной/кластерный ключ в этой таблице аудита? Если нет: ** добавьте один! ** (Цитата: * если у него нет первичного ключа, это не таблица! *). Вы можете ** всегда ** добавлять первичный ключ - даже если вам нужно добавить «INT IDENTITY» для этой цели - лучше, чем не иметь этого! –

+0

Во-вторых: на сколько данных (сколько строк) влияет инструкция UPDATE? Всего несколько строк? Тогда некластеризованный индекс (после добавления ** первичного ключа **!) В предложении WHERE вашего оператора UPDATE может помочь ... –

+0

Обновление затрагивает около 500 000 строк из 15 миллионов. Вслед за обновлением из этой таблицы также удаляются данные, возраст которых составляет 10 дней. Как это влияет на некластеризованный индекс? – Vikram

ответ

3

Вы всегда можете добавить IDENTITY столбец в качестве первичного ключа и кластерного индекса. Поскольку он автоматически увеличивается, вам не должно быть много проблем с фрагментацией индекса.

Что касается потери данных от триггера, потому что сервер слишком занят, перестраивая индекс - нет, этого никогда не должно произойти.

Смежные вопросы