Все версии сервера SQL перестраивают индексы автоматически или имеют критерии перестройки по умолчанию? - PullRequest
12 голосов
/ 24 февраля 2009

Все ли версии SQL-сервера перестраивают индексы автоматически или имеют критерии перестройки по умолчанию? Я понимаю, что статистика перестраивается автоматически, но я не уверен, что индексы тоже это делают.

Ответы [ 5 ]

9 голосов
/ 24 февраля 2009

Перестройка индексов не поддерживается автоматически ни в одной версии Microsoft SQL Server. Причина в том, что перестройка индексов может быть очень дорогостоящей операцией, и поэтому требует тщательного планирования и планирования.

Во многих средах будут написаны специальные сценарии для этого, например:

http://weblogs.sqlteam.com/tarad/archive/2008/09/03/Defragmenting-Indexes-in-SQL-Server-2005.aspx

Обратите внимание, что, хотя SQL может автоматически обновлять статистику для вас, во многих случаях выигрыш в производительности достигается при более тщательном управлении этими данными.

7 голосов
/ 24 февраля 2009

Как уже упоминалось, ваши индексы не перестраиваются автоматически. Это довольно большая проблема в SQL Server, поскольку ваши индексы со временем фрагментируются. Вы можете обнаружить, что ваши индексы на 95% плюс фрагментированные, что плохо влияет на производительность запросов.

Вот простой запрос для проверки фрагментации существующих индексов:

DECLARE @DBNAME VARCHAR(130);
SET @DBNAME = 'MYDBNAME';

DECLARE @DBID INT;
SET @DBID = DB_ID(@DBNAME);

SELECT
OBJECT_ID AS objectID
, index_id AS indexID
, avg_fragmentation_in_percent AS fragmentation
, page_count 
INTO #indexDefragList
FROM
sys.dm_db_index_physical_stats 
(@DBID, NULL, NULL , NULL, N'Limited')
WHERE
index_id > 0
OPTION (MaxDop 1);

SELECT
i.[name] as indexname,
d.fragmentation,
d.page_count
FROM
#indexDefragList d
INNER JOIN sys.indexes i
ON d.objectid = i.object_id
ORDER BY 
d.fragmentation DESC

DROP TABLE #indexDefragList

Это вернет список всех индексов в вашей текущей БД с их фрагментацией в%.

Вы можете легко создать скрипт для автоматической перестройки или реорганизации их. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

1 голос
/ 24 февраля 2009

Чтобы расширить то, что сказал Крис:

Что касается статистики, то для столбцов, не охваченных индексом, статистика не будет обновляться путем перестроения всех индексов. Они могут периодически обновляться SQL Server, однако вам может потребоваться сделать это самостоятельно с помощью инструкции UPDATE STATISTICS.

SQL Server 2005 определяет, обновлять ли статистику автоматически на основе изменений счетчиков изменений столбцов (colmodctrs).

Объект статистики считается устаревшим в следующих случаях:

1. Размер таблицы изменился с 0 до> 0 строк.

2. Количество строк в таблице, когда собиралась статистика, составляло 500 или менее, и с тех пор colmodctr ведущего столбца объекта статистики изменилось более чем на 500.

3. В таблице было более 500 строк, когда собиралась статистика, а colmodctr в первом столбце объекта статистики изменилось более чем на 500 + 20% от числа строк в таблице, когда статистика была собрались

Вы можете найти следующую ссылку относительно статистики использования:

http://blogs.technet.com/rob/archive/2008/05/16/sql-server-statistics.aspx

Надеюсь, это поможет, но не стесняйтесь задавать дополнительные вопросы.

Ура, Джон

0 голосов
/ 24 февраля 2009

Как отметил @Chris, индексы не перестраиваются автоматически ни в одной версии SQL Server. Правильное обслуживание индексов часто отсутствует на сайтах без выделенной роли администратора баз данных, и часто, когда базы данных просто переводятся из разработки в производство (вместе с обслуживанием журнала транзакций).

SQL Server 2005+ имеет возможность выполнять реорганизацию индексов в режиме онлайн и полную перестройку в автономном режиме.

0 голосов
/ 24 февраля 2009

Это должно быть запланировано и организовано самостоятельно.

При сортировке это зависит от размера ваших таблиц и периода обслуживания.

Кроме того, статистика перестраивается автоматически при перестроении индексов, но может планироваться отдельно.

Для быстрого исправления, предполагая хорошее длительное окно обслуживания и не слишком большое (до нескольких 100 ГБ), просто запланируйте это:

EXEC sp_msforeachtable 'SET QUOTED_IDENTIFIER ON ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)'

Редактировать: только для> SQL 2005 этот SQL

...