我有一个数据库,我尝试通过运行此T-sql一次对所有表进行碎片整理:
SELECT 'ALTER INDEX all ON ' + name + ' REORGANIZE;' + CHAR(10) + 'ALTER INDEX all ON ' + name + ' REBUILD;' FROM sys.tables
然后将输出复制并粘贴到新的查询窗口并运行它.我没有错误,但我仍然有碎片.我尝试单独运行这两个命令,但仍然有碎片.注意:我已经意识到Aaron不需要REORGANIZE,我知道我可以使用动态sql来自动执行此操作.
我跑了这个来确定我还有碎片:
SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(),NULL,NULL) WHERE avg_fragmentation_in_percent > 0
我得到了:
database_id object_id index_id partition_number index_type_desc alloc_unit_type_desc index_depth index_level avg_fragmentation_in_percent fragment_count avg_fragment_size_in_pages page_count avg_page_space_used_in_percent record_count ghost_record_count version_ghost_record_count min_record_size_in_bytes max_record_size_in_bytes avg_record_size_in_bytes forwarded_record_count compressed_page_count 85 171147655 1 1 CLUSTERED INDEX IN_ROW_DATA 2 0 36.3636363636364 5 2.2 11 NULL NULL NULL NULL NULL NULL NULL NULL NULL 85 421576540 1 1 CLUSTERED INDEX IN_ROW_DATA 2 0 75 7 1.14285714285714 8 NULL NULL NULL NULL NULL NULL NULL NULL NULL 85 965578478 1 1 CLUSTERED INDEX IN_ROW_DATA 2 0 14.7058823529412 6 5.66666666666667 34 NULL NULL NULL NULL NULL NULL NULL NULL NULL 85 1061578820 1 1 CLUSTERED INDEX IN_ROW_DATA 2 0 40 4 1.25 5 NULL NULL NULL NULL NULL NULL NULL NULL NULL 85 1109578991 1 1 CLUSTERED INDEX IN_ROW_DATA 2 0 30.7692307692308 5 2.6 13 NULL NULL NULL NULL NULL NULL NULL NULL NULL 85 1205579333 2 1 NONCLUSTERED INDEX IN_ROW_DATA 2 0 50 5 1.6 8 NULL NULL NULL NULL NULL NULL NULL NULL NULL 85 1493580359 1 1 CLUSTERED INDEX IN_ROW_DATA 2 0 50 6 1.66666666666667 10 NULL NULL NULL NULL NULL NULL NULL NULL NULL
我知道我错过了一些基本的东西,但我不知道是什么.
解决方法
桌子很小.表格中的页数是:
11,8,6,5,13,8,10
它们总共占用480kb.碎片整理真的没什么.
编辑:这需要更多解释.
一个新的表或索引通常从混合而不是统一的范围分配它的前8页.因此,前8页中的每一页都可以从不同的混合范围中分配.因此,消耗8个页面的表或索引可以具有8个片段,在8个不同的混合范围中的每一个上有1个片段.
更广泛使用的碎片整理脚本(下面链接的几个示例)倾向于排除小表,因为这样. IIRC,< 500页在其中一个或两个.在这些规模下,碎片整理的好处很少,碎片化数据可能会受到混合范围分配的影响.
> Ola Hallengren – SQL Server Maintenance Solution
> SQL Fool – Index Defrag Script