ret*_*ala 5 index sql-server t-sql
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
您可以将其添加到您的WHERE
子句中,以省略包含 LOB 类型的任何索引(我想我捕获了所有索引):
AND NOT EXISTS (
SELECT 1 FROM sys.index_columns AS ic
INNER JOIN sys.columns AS c
ON ic.object_id = c.object_id
AND ic.column_id = c.column_id
AND ((c.system_type_id IN (34,35,99,241)) -- image, text, ntext, xml
OR (c.system_type_id IN (167,231,165) -- varchar, nvarchar, varbinary
AND max_length = -1))
WHERE ic.object_id = SI.object_id
AND ic.index_id = SI.index_id
)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 SQL Server 2008 或 2008 R2,您可以将搜索类型更改为以下内容,以便捕获geography
和geometry
(由Kenneth Fisher提供):
AND ((c.system_type_id IN (34,35,99,241)) -- image, text, ntext, xml
OR (c.system_type_id IN (167,231,165) -- varchar, nvarchar, varbinary
AND max_length = -1)
OR (c.user_type_id IN (129,130))) -- geometry, geography
Run Code Online (Sandbox Code Playgroud)
当然,重组查询可能更明智,这样您就可以在线重建索引,并且不要将那些无法完全排除在维护之外的索引。但我同意麦克斯的观点,不要重新发明轮子。去获取 Ola 的脚本,或者,如果您想要更强大的东西,请告诉我。
归档时间: |
|
查看次数: |
2413 次 |
最近记录: |