Все ли версии SQL-сервера перестраивают индексы автоматически или имеют критерии перестроения по умолчанию?

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

Ответов (5)

Решение

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

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

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

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

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

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

Как уже упоминалось здесь, ваши индексы не перестраиваются автоматически. Это довольно большая проблема для 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

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

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

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

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

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

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

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

Изменить: только для> SQL 2005 этот SQL

Чтобы расширить сказанное Крисом:

Что касается статистики, статистика столбцов, не охваченных индексом, не обновляется путем перестроения всех индексов. Они могут периодически обновляться 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

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

Привет, Джон