gpt4 book ai didi

sql - 根据碎片结果自动重建索引?

转载 作者:行者123 更新时间:2023-12-02 07:23:49 26 4
gpt4 key购买 nike

是否可以添加维护作业来检查索引碎片。如果大于 50%,则自动重建这些索引?

索引大小可以从 100MB 到 10GB 不等。SQL 2005。

谢谢。

最佳答案

我使用这个脚本。请注意,我建议您阅读有关我在这里使用的 dmv 的信息,它们是 SQL2005+ 中的隐藏 gem 。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
CREATE TABLE #FragmentedIndexes
(
DatabaseName SYSNAME
, SchemaName SYSNAME
, TableName SYSNAME
, IndexName SYSNAME
, [Fragmentation%] FLOAT
)

INSERT INTO #FragmentedIndexes
SELECT
DB_NAME(DB_ID()) AS DatabaseName
, ss.name AS SchemaName
, OBJECT_NAME (s.object_id) AS TableName
, i.name AS IndexName
, s.avg_fragmentation_in_percent AS [Fragmentation%]
FROM sys.dm_db_index_physical_stats(db_id(),NULL, NULL, NULL, 'SAMPLED') s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON s.object_id = o.object_id
INNER JOIN sys.schemas ss ON ss.[schema_id] = o.[schema_id]
WHERE s.database_id = DB_ID()
AND i.index_id != 0
AND s.record_count > 0
AND o.is_ms_shipped = 0
DECLARE @RebuildIndexesSQL NVARCHAR(MAX)
SET @RebuildIndexesSQL = ''
SELECT
@RebuildIndexesSQL = @RebuildIndexesSQL +
CASE
WHEN [Fragmentation%] > 30
THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
+ QUOTENAME(SchemaName) + '.'
+ QUOTENAME(TableName) + ' REBUILD;'
WHEN [Fragmentation%] > 10
THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
+ QUOTENAME(SchemaName) + '.'
+ QUOTENAME(TableName) + ' REORGANIZE;'
END
FROM #FragmentedIndexes
WHERE [Fragmentation%] > 10
DECLARE @StartOffset INT
DECLARE @Length INT
SET @StartOffset = 0
SET @Length = 4000
WHILE (@StartOffset < LEN(@RebuildIndexesSQL))
BEGIN
PRINT SUBSTRING(@RebuildIndexesSQL, @StartOffset, @Length)
SET @StartOffset = @StartOffset + @Length
END
PRINT SUBSTRING(@RebuildIndexesSQL, @StartOffset, @Length)
EXECUTE sp_executesql @RebuildIndexesSQL
DROP TABLE #FragmentedIndexes

另请记住,此脚本可能会运行一段时间并阻止对表的访问。除非您有企业版,否则 SQL 可以在重建索引时锁定表。这将阻止使用索引对该表进行的所有查询,直到索引碎片整理完成。因此,不建议仅在维护时段的操作时间内运行索引重建。如果您运行的是企业版,则可以使用 ONLINE=ON 选项在线整理索引碎片。这将使用更多空间,但在碎片整理操作期间您的表不会被阻止/锁定。

如果您需要更多信息,请大声喊叫。

更新:

如果您在较小的数据库上运行此查询,您可能可以在调用 sys.dm_db_index_physical_stats 时使用“DETAILED”参数。这可能是对索引的更详细的检查。评论中的讨论还将指出,在更大的表上,可能值得进行 SAMPLED 扫描,因为这将有助于减少执行索引扫描所需的时间。

关于sql - 根据碎片结果自动重建索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com