0

Я выполнил обновление заявление по следующим направлениям вчера:Улучшается ли производительность при размещении некластеризованного индекса в поле, которое уже имеет кластеризованный индекс?

UPDATE MainTable 
Set SomeField = SubsetTable.SomeField 
where MainTable.MainTableKey = SubsetTable.MainTableKey 

где SubsetTable является подмножеством MainTable и имеет такое же поле первичного ключа. MainTable имеет примерно 200 м записей, SubsetTable имеет 5 м записей. MainTableKey - это GUID.

Обе эти таблицы имеют кластерный индекс на MainTableKey.

Когда я выполнил этот запрос, первый раз потребовалось 14 часов.

Затем я добавил некластеризованный индекс в MainTableKey на обе таблицы. Теперь это занимает 30 минут.

Есть ли у кого-нибудь идеи о том, почему прирост производительности будет настолько драматичным?

+2

Сравните планы выполнения! –

+0

Какую базу данных вы используете? Вопросы о производительности сильно зависят от базы данных. –

+0

SQL Server 2008 R2. Извините, просто обновил теги – Karl

ответ

1

Держу пари, если посмотреть на планы выполнения:

Первый запрос является слиянием, которая участвует полностью чтение обеих таблиц.

200M rows + 5M rows = 205M rows. 
205M rows/14 hours = 4067 rows per second. 

Второй запрос является вложенным циклом, который считывает всю небольшую таблицу и ищет в большой таблице для каждой небольшой строки таблицы.

5M + 5M rows = 10M rows. 
10M rows/40 minutes = 4166rows per second. 

То, что эти ставки примерно равны, поддерживает мою теорию о том, какие строки читаются.

Вам не обязательно гадать: запустите запросы с помощью SET STATISTICS IO ON и/или посмотрите планы выполнения.

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