Estou automatizando a reconstrução e reorganização de índices usando T-SQL. Tenho problemas com índices que não podem ser reconstruídos online. Principalmente isso acontece porque as colunas ntext/nvarchar estão incluídas.
Existe uma maneira de identificá-los programaticamente como parte desta declaração? Então, tipo de adição ao predicado 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
Eu uso o seguinte para detectar LOBs:
Obviamente, este é um fragmento de código de um procedimento armazenado muito maior que usamos para reconstruir e/ou reorganizar índices. Eu recomendaria que você olhasse os scripts de Ola Hallengren em: http://ola.hallengren.com/
Observe especificamente o NOT EXISTS na cláusula WHERE.
Você pode adicionar isso à sua
WHERE
cláusula para deixar de fora quaisquer índices que incluam um tipo LOB (acho que capturei todos):Se você estiver usando o SQL Server 2008 ou 2008 R2, poderá alterar a pesquisa de tipo para o seguinte para capturar
geography
egeometry
(crédito Kenneth Fisher ):Claro, pode ser mais inteligente reestruturar sua consulta para que você reconstrua os índices que você pode online e não deixe aqueles que você não pode fora de sua manutenção. Mas concordo com Max, não reinvente a roda. Vá buscar os scripts de Ola ou, se você quiser algo muito mais robusto, por favor me avise.