sqlserver 全部索引重建
declare @maxfrag DECIMAL
select @maxfrag = 90
--宣告變數
SET NOCOUNT ON
DECLARE @tablename VARCHAR (128)
DECLARE @execstr VARCHAR (255)
DECLARE @objectid INT
DECLARE @objectowner VARCHAR(255)
DECLARE @indexid INT
DECLARE @frag DECIMAL
DECLARE @indexname CHAR(255)
DECLARE @dbname sysname
DECLARE @tableid INT
DECLARE @tableidchar VARCHAR(255)
--檢查是否在使用者資料庫裡執行
SELECT @dbname = db_name()
IF @dbname IN ('master', 'msdb', 'model', 'tempdb')
BEGIN
PRINT 'This procedure should not be run in system databases.'
RETURN
END
--第1階段:檢測碎片
--宣告遊標
DECLARE tables CURSOR FOR
SELECT convert(varchar,so.id)
FROM sysobjects so
JOIN sysindexes si
ON so.id = si.id
WHERE so.type ='U'
AND si.indid < 2
AND si.rows > 0
-- 建立一個臨時表來儲存碎片資訊
CREATE TABLE #fraglist (
ObjectName CHAR (255),
ObjectId INT,
IndexName CHAR (255),
IndexId INT,
Lvl INT,
CountPages INT,
CountRows INT,
MinRecSize INT,
MaxRecSize INT,
AvgRecSize INT,
ForRecCount INT,
Extents INT,
ExtentSwitches INT,
AvgFreeBytes INT,
AvgPageDensity INT,
ScanDensity DECIMAL,
BestCount INT,
ActualCount INT,
LogicalFrag DECIMAL,
ExtentFrag DECIMAL)
--開啟遊標
OPEN tables
-- 對資料庫的所有表迴圈執行dbcc showcontig命令
FETCH NEXT
FROM tables
INTO @tableidchar
WHILE @@FETCH_STATUS = 0
BEGIN
--對錶的所有索引進行統計
INSERT INTO #fraglist
EXEC ('DBCC SHOWCONTIG (' + @tableidchar + ') WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS')
FETCH NEXT
FROM tables
INTO @tableidchar
END
-- 關閉釋放遊標
CLOSE tables
DEALLOCATE tables
-- 為了檢查,報告統計結果
SELECT * FROM #fraglist
--第2階段: (整理碎片) 為每一個要整理碎片的索引宣告遊標
DECLARE indexes CURSOR FOR
SELECT ObjectName, bjectOwner = user_name(so.uid), ObjectId, IndexName, ScanDensity
FROM #fraglist f
JOIN sysobjects so ON f.ObjectId=so.id
WHERE ScanDensity <= @maxfrag
AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0
-- 輸出開始時間
SELECT 'Started defragmenting indexes at ' + CONVERT(VARCHAR,GETDATE())
--開啟遊標
OPEN indexes
--迴圈所有的索引
FETCH NEXT
FROM indexes
INTO @tablename, @objectowner, @objectid, @indexname, @frag
WHILE @@FETCH_STATUS = 0
BEGIN
SET QUOTED_IDENTIFIER ON
SELECT @execstr = 'DBCC DBREINDEX (' + '''' + RTRIM(@objectowner) + '.' + RTRIM(@tablename) + ''''+ ', ' + RTRIM(@indexname) + ') WITH NO_INFOMSGS'
SELECT 'Now executing: '
SELECT(@execstr)
EXEC (@execstr)
SET QUOTED_IDENTIFIER OFF
FETCH NEXT
FROM indexes
INTO @tablename, @objectowner, @objectid, @indexname, @frag
END
-- 關閉釋放遊標
CLOSE indexes
DEALLOCATE indexes
-- 報告結束時間
SELECT 'Finished defragmenting indexes at ' + CONVERT(VARCHAR,GETDATE())
-- 刪除臨時表
DROP TABLE #fraglist
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15747463/viewspace-742386/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sqlserver索引重建和索引重組的區別和操作方法SQLServer索引
- oracle重建索引Oracle索引
- oracle 索引分析及索引重建Oracle索引
- SqlServer——索引SQLServer索引
- oracle重建索引(一)Oracle索引
- oracle重建索引(三)Oracle索引
- oracle重建索引(二)Oracle索引
- 索引的重建命令索引
- MSSQL Rebuild(重建)索引SQLRebuild索引
- 淺談索引系列之索引重建索引
- oracle批量重建索引方法Oracle索引
- Oracle表與索引的分析及索引重建Oracle索引
- oracle 索引重建提示指令碼Oracle索引指令碼
- 批量重建不可用索引索引
- Oracle表與索引的分析及索引重建(轉)Oracle索引
- oracle 索引什麼時候重建和重建方法討論Oracle索引
- mssql sqlserver 索引專題SQLServer索引
- SqlServer 建立全文索引SQLServer索引
- 教你如何在 elasticsearch 中重建索引Elasticsearch索引
- 淺談oracle中重建索引 (ZT)Oracle索引
- 索引重建的資料來源索引
- Sqlserver表和索引壓縮SQLServer索引
- [zt] SQLSERVER索引的使用技巧SQLServer索引
- 如何在Mac上重建Spotlight索引Mac索引
- 索引重建的資料來源(二)索引
- SqlServer索引的原理與應用SQLServer索引
- 【sqlserver】 統計索引使用次數SQLServer索引
- SQLSERVER的非聚集索引結構SQLServer索引
- SQL Server 2014的重建索引SQLServer索引
- 說說生產系統索引的重建索引
- Oracle 表的移動和索引的重建Oracle索引
- 認識SQLServer索引以及單列索引和多列索引的不同SQLServer索引
- SQLServer索引優化(2):對於索引中include的理解SQLServer索引優化
- (1)掌握SqlServer索引的基本概念SQLServer索引
- 【SqlServer】管理全文索引(FULL TEXT INDEX)SQLServer索引Index
- SQLServer索引維護常用方法總結SQLServer索引
- 【TUNE_ORACLE】索引定期重建的利與弊Oracle索引
- 新手必看:如何在Mac上重建Spotlight索引Mac索引