Általában nem ajánlott HEAP tábla létrehozása (Table without Clustered Index) , egy esetben jöhet jól, ha nagyon gyors adatbetöltés szükséges.
A Heap tábla azonban töredezik, ennek oka, hogy minden Insert a tábla végére kerül és a Deleted sorok sem kerülnek betöltésre.
Amíg a hagyományos indexeket egy index reorganizációval vagy újraépítéssel (rebuild) karbantarthajtuk és gyorssá tehetjük addig a Heap táblán nincs ilyen beépített karbantartás .
Teendő?
Két fajta módszert találunk a neten, az egyik régebbi módszer a clustered index létrehozása, majd törlése (macerás és nem túl gyors). A másik módszer az SQL 2008-as verziótól működik, a tábla újraépítése:
1 |
Alter table <em>TableName</em> rebuild |
Gyűjtsük ki az adatbázisból a töredezett táblák neveit és azokat építsük újra.
Töredezett Heap táblák:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT dbschemas.[name] as 'Schema', dbtables.[name] as 'Table', dbindexes.[name] as 'Index', indexstats.avg_fragmentation_in_percent, indexstats.page_count FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id = dbindexes.index_id WHERE indexstats.database_id = DB_ID() and dbindexes.[name] is null and indexstats.page_count>1 and indexstats.avg_fragmentation_in_percent >30 ORDER BY indexstats.page_count desc, indexstats.avg_fragmentation_in_percent desc |
Szkript generálása a defragmentációhoz:
1 2 3 4 5 6 7 8 9 |
SELECT 'Alter table ' + dbtables.[name] + ' rebuild' FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id = dbindexes.index_id WHERE indexstats.database_id = DB_ID() and dbindexes.[name] is null and indexstats.page_count>1 and indexstats.avg_fragmentation_in_percent >20 ORDER BY indexstats.page_count desc, indexstats.avg_fragmentation_in_percent desc |