sqlserver2005进行碎片整理,影响生产,如何作才能维持生产,并能进行碎片整理呢?

jgchenhunter 2011-03-29 04:36:08
sqlserver2005进行碎片整理,影响生产,如何作才能维持生产,并能进行碎片整理呢?
我库是一个生产库,碎片程度很严重,需要进行碎片整理,但是由于是生产库,不能停机, 据sqlserver2005官方文档说,可以在线进行碎片整理,并且在帮助文档中给出了脚本,我使用这个脚本整理,磁盘队列会很高,并且影响数据库访问,数据库非常缓慢,数据库大量操作被挂起,出现堵塞现象,我库大约有400个G,整理时间长了,数据库就不能正常使用了,我使用的脚本:


-- ensure a USE <databasename> statement has been executed first.
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname sysname;
DECLARE @objectname sysname;
DECLARE @indexname sysname;
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command varchar(8000);
-- ensure the temporary table does not exist
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;
-- conditionally select from the function, converting 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.
FETCH NEXT
FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag;

WHILE @@FETCH_STATUS = 0
BEGIN;
SELECT @objectname = o.name, @schemaname = 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 = 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
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REORGANIZE';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
EXEC (@command);
END;

IF @frag >= 30.0
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname +' ON ' + @schemaname + '.' + @objectname + ' REBUILD';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
EXEC (@command);
END;
PRINT 'Executed ' + @command;

FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;
END;
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- drop the temporary table
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;
GO




请教大家给个解决办法,谢谢
我怎么做能让他不影响生产库正常工作的情况下,完成碎片整理.哪怕碎片整理的时间长一点没有关系


...全文
160 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jgchenhunter 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 duoxu1983 的回复:]
分时分批做。
[/Quote]

我对单个表的单个索引操作, 也会让库几乎不能正常访问,因为单表的数据量太大,而且处理完还要去写镜像
有其他办法吗?
duoxu1983 2011-03-29
  • 打赏
  • 举报
回复
分时分批做。
jgchenhunter 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fanzhouqi 的回复:]
引用 6 楼 fanzhouqi 的回复:
索引碎片 严重建议 不要整理了

三更半夜 把他重建了 就好了
维护计划里面 可以设置 重建index 的
2005以上的 数据库 支持online 重建index,不用太担心生产
[/Quote]

是的,达到30%的就重建了, 10%--30%的重新组织
慢的原因还有一个就是 他本身和另外一个库作了镜像
不用担心生产怎么行呢
fanzhouqi 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fanzhouqi 的回复:]
索引碎片 严重建议 不要整理了

三更半夜 把他重建了 就好了
[/Quote] 维护计划里面 可以设置 重建index 的
2005以上的 数据库 支持online 重建index,不用太担心生产
fanzhouqi 2011-03-29
  • 打赏
  • 举报
回复
索引碎片 严重建议 不要整理了

三更半夜 把他重建了 就好了
jgchenhunter 2011-03-29
  • 打赏
  • 举报
回复
不这样整理,那怎么整理阿
jgchenhunter 2011-03-29
  • 打赏
  • 举报
回复
索引碎片
dawugui 2011-03-29
  • 打赏
  • 举报
回复
我库大约有400个G?

佩服
--小F-- 2011-03-29
  • 打赏
  • 举报
回复
磁盘碎片还是物理硬盘碎片?
Rotel-刘志东 2011-03-29
  • 打赏
  • 举报
回复
400g数据量这样整理会很耗时的

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧