我正在使用 T-SQL 自动重建和重组索引。我遇到了无法在线重建的索引问题。这主要是因为包含了 ntext/nvarchar 列。
有没有办法以编程方式将它们标识为该语句的一部分?对 WHERE 谓词的一种补充
SELECT
--TOP 20
OBJECT_NAME(IPS.OBJECT_ID) AS [TableName], avg_fragmentation_in_percent, SI.name [IndexName],
schema_name(ST.schema_id) AS [SchemaName], 0 AS IsProcessed
INTO #FramentedTableList
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL , NULL) IPS
JOIN sys.tables ST WITH (nolock) ON IPS.OBJECT_ID = ST.OBJECT_ID
JOIN sys.indexes SI WITH (nolock) ON IPS.OBJECT_ID = SI.OBJECT_ID AND IPS.index_id = SI.index_id
WHERE ST.is_ms_shipped = 0 AND SI.name IS NOT NULL
AND avg_fragmentation_in_percent >= CONVERT(DECIMAL, @FragmentationThresholdForReorganizeTableLowerLimit)
ORDER BY avg_fragmentation_in_percent DESC
我使用以下内容来检测 LOB:
显然,这是我们用来重建和/或重组索引的更大存储过程的代码片段。我建议您在以下网址查看 Ola Hallengren 的脚本: http ://ola.hallengren.com/
具体查看 WHERE 子句中的 NOT EXISTS。
您可以将其添加到您的
WHERE
子句中以省略任何包含 LOB 类型的索引(我想我已经全部捕获了它们):如果您使用的是 SQL Server 2008 或 2008 R2,则可以将类型搜索更改为以下内容以捕获
geography
和geometry
(归功于Kenneth Fisher):当然,重组查询可能更聪明,这样您就可以在线重建索引,并且不要将那些您不能完全排除在维护之外的索引。但我同意 Max 的观点,不要重新发明轮子。去获取 Ola 的脚本,或者,如果你想要更强大的东西,请告诉我。