SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command nvarchar(4000);
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function
-- and convert object and index IDs to names.
SELECT
object_id AS objectid,
index_id AS indexid,
partition_number AS partitionnum,
avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;
-- Open the cursor.
OPEN partitions;
-- Loop through the partitions.
WHILE (1=1)
BEGIN;
FETCH NEXT
FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag;
IF @@FETCH_STATUS < 0 BREAK;
SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;
SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;
SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;
-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
IF @frag < 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
IF @frag >= 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
IF @partitioncount > 1
SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
EXEC (@command);
PRINT N'Executed: ' + @command;
END;
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;
-- Drop the temporary table.
DROP TABLE #work_to_do;
GO
分享到:
相关推荐
### 提高SQL Server性能:通过DBCC DBREINDEX重建索引 #### 一、引言 在数据库管理系统中,SQL Server作为一款广泛使用的数据库产品,其性能优化是确保应用程序高效运行的关键因素之一。其中,索引是提升查询速度的...
SQL Server 重新组织和重新生成索引 在 SQL Server 中,索引的碎片可能会对查询性能产生影响,因此需要对索引进行维护。SQL Server 2005 提供了重新组织和重新生成索引的功能,以修复索引碎片。 重新组织索引 ...
适用于SQL server 2008 R2版本及以上,重建全部索引
在SQL Server 2000中,有两种主要的方式来重建索引:使用`CREATE INDEX`语句的`DROP_EXISTING`子句,以及使用`DBCC DBREINDEX`语句。 1. `CREATE INDEX` with `DROP_EXISTING`: 这种方法允许你在不删除旧索引的...
《SQL Server索引重建手册》详细介绍了如何查看和分析索引碎片,如何选择在线重建索引的方式,以及如何观察索引重建的进度。手册强调了操作前必须进行全库备份的重要性,并指出在线重建索引时应遵循的顺序和原则。...
当索引碎片过高时,可能需要重建索引来恢复其性能。 六、索引的影响 索引对读操作有显著提升,但可能降低写操作速度,如插入、删除和更新。因此,在设计索引时,需要平衡读写操作的需求。 七、查询优化器与索引...
根据提供的文件信息,本文将详细解析SQL Server 2000中重建索引与收缩数据库的相关知识点。 ### 一、重建索引 #### 1. 什么是索引 在SQL Server 2000中,索引是提高数据检索速度的重要工具。它可以看作是一种特殊...
SQLServer中的索引碎片是影响数据库性能的重要因素,它分为外部碎片和内部碎片两种类型。外部碎片发生在索引页不在其逻辑顺序上时,导致查询过程中需要额外的页切换,尤其是对于返回有序结果集的查询,这将显著降低...
重新修复数据库索引, PRINT '重建表' + @TableName +'的索引........Start!'
优化 SQL Server 索引的小技巧 SQL Server 中有多种可以让您检测、调整和优化 SQL ...如果你不想自动维护索引,那么你可以手工重建索引,并在需要时执行 UPDATE STATISTICS 命令来刷新 SQL Server 对于该索引的信息。
在SQL Server中,索引是提升数据库性能的关键因素,它们帮助快速定位数据,减少磁盘I/O操作,从而加速查询速度。本篇文章将探讨聚簇索引、非聚簇索引以及覆盖索引的使用和维护策略。 1. **聚簇索引**:聚簇索引决定...
重新组织索引可以提高索引的存储效率,重建索引可以解决索引碎片的问题,压缩索引可以减少存储空间。 索引的维护方法包括索引的重整、索引的重建、索引的压缩等。索引的重整可以解决索引碎片的问题,索引的重建可以...
SQL Server磁盘空间清理及过引重建
**SQLServer索引查询优化指南** SQLServer是一个广泛使用的数据库管理系统,尤其在企业级应用中,性能优化至关重要。本指南将深入探讨SQLServer中的索引原理及其对查询优化的影响。索引是数据库性能的关键因素,它...
SqlServer通过索引碎片整理来优化性能,方法包括重整(REORGANIZE)和重建(REBUILD)。重整是联机对叶级页进行物理排序,重建则是重新构建索引结构。此外,填充因子(FILLFACTOR)的设置也会影响索引页的使用效率和...
如果碎片化程度高,则可能需要重建索引(`ALTER INDEX REBUILD`),这将完全重新创建索引,可能包括重新排序和压缩数据,但成本较高。如果索引跨越多个分区,重建操作还可以指定分区,以处理特定部分。 此脚本提供...
### SQL Server索引设计经验谈 #### 摘要 本文旨在探讨Microsoft SQL Server中的索引设计技巧,尤其是如何通过合理的索引策略来优化查询性能。通过对聚集索引与非聚集索引的选择、索引列的排序方式、填充因子的...
检查索引碎片情况 1.SELECT 2.OBJECT_NAME(object_id) as objectname, 3.object_id AS objectid, 4.index_id AS indexid, 5.partition_number AS partitionnum, 6.avg_fragmentation_in_percent AS fra 7.FROM sys....