Перестройка индекса на сервере SQL - PullRequest
6 голосов
/ 07 марта 2011

Я делаю перестройку индекса для базы данных.Мне нужно проверить, сделано это или нет.Может кто-нибудь, пожалуйста, направьте меня.Я использую SQL Server 2008 R2

Ответы [ 4 ]

7 голосов
/ 07 марта 2011

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

SELECT OBJECT_NAME(object_id),* 
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'SAMPLED')

Мне только что пришло в голову, что вы также можете спросить, как узнать, как происходит переиндексация.Для этого вы можете использовать

SELECT percent_complete 
from sys.dm_exec_requests 
where session_id= <spid of interest>
1 голос
/ 22 июня 2011

Ключевым моментом будет запуск отчета «Физическая статистика индекса» и «Использование диска по верхним таблицам» до и после перестроения индексов.

В отчете «Физическая статистика индекса» выможно увидеть, насколько фрагментирован каждый индекс.

Чтобы просмотреть эти отчеты ... * Щелкните правой кнопкой мыши базу данных в Sql Server Management Studio * Наведите курсор мыши на «Отчеты», затем «Стандартные отчеты», затем выберите нужный отчет..

Для сценария, который вы можете настроить для идентификации фрагментированных индексов и перестройки их (и для получения дополнительной информации), проверьте это:

http://www.foliotek.com/devblog/sql-server-optimization-with-index-rebuilding/

1 голос
/ 07 марта 2011

Если вы успешно переиндексировали свои таблицы, фрагментация индекса будет равна нулю (или близка к тому, если у вас есть горячие таблицы). Вы можете использовать этот скрипт для проверки уровня фрагментации

DECLARE 
@IndexID int,
@TableID int,  
@IndexName varchar(256) 

--Enter index name here
SELECT @IndexName = '<index name>'
--Enter table name here
SET @TableID = OBJECT_ID('<table name>') 

SELECT @IndexID = IndID 
FROM sysindexes 
WHERE 
    id = @TableID 
    AND name = @IndexName 

DBCC SHOWCONTIG (@id, @IndexID)

В выводе вы ищете свойство, называемое Плотность сканирования . Это должно быть близко к 100%. Если нет, то ваша переиндексация не завершена / не прошла успешно


Если у вас много таблиц / индексов, это может быть утомительным, поэтому замкните его, сгенерировав скрипт следующим образом:

SELECT 'DBCC SHOWCONTIG ' +
    '(' 
       + CONVERT(varchar(32), si.id) + ',' 
       + CONVERT(varchar(32), si.indid) + 
    ')--'  + so.name
FROM sysobjects so 
INNER JOIN sysindexes si 
ON (so.id = si.id) 
WHERE (
    so.type = 'U' AND
    si.indid < 2 AND
    si.id = object_id(so.name) 
    )
0 голосов
/ 18 мая 2012

Вы можете попробовать эту процедуру. Он перестроит индекс всех таблиц в базе данных и выведет результат по мере его продвижения на панель сообщений вашей Management Studio:

CREATE PROCEDURE [dbo].[ReIndexDatabase]
AS
DECLARE @MyTable VARCHAR(255)
DECLARE myCursor

CURSOR FOR
SELECT table_name
FROM   information_schema.tables
WHERE  table_type = 'base table'

OPEN myCursor
FETCH NEXT
FROM myCursor INTO @MyTable

WHILE @@FETCH_STATUS = 0    BEGIN
  PRINT 'Reindexing Table:  ' + @MyTable
  EXEC('ALTER INDEX ALL ON '+@MyTable+'
  REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = OFF,
                STATISTICS_NORECOMPUTE = ON)');

  FETCH NEXT FROM myCursor INTO @MyTable
END

CLOSE myCursor
DEALLOCATE myCursor
EXEC sp_updatestats

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

Примечание информация вверху страницы.

...