it-swarm.asia

Mengapa database saya masih terfragmentasi setelah saya membangun kembali dan mengindeks ulang semuanya?

Saya punya database yang saya coba defragmentasi semua tabel sekaligus dengan menjalankan T-SQL ini:

SELECT 
        'ALTER INDEX all ON ' + name + ' REORGANIZE;' + CHAR(10) +
        'ALTER INDEX all ON ' + name + ' REBUILD;'
    FROM sys.tables

Dan kemudian menyalin dan menempelkan output ke jendela permintaan baru dan menjalankannya. Saya tidak mendapatkan kesalahan, tetapi saya masih memiliki fragmentasi. Saya mencoba menjalankan kedua perintah secara terpisah juga dan masih memiliki fragmentasi. Catatan: Saya telah dibuat sadar bahwa REORGANIZE tidak diperlukan oleh Aaron, dan saya sadar saya bisa menggunakan sql dinamis untuk mengotomatisasi ini.

Saya menjalankan ini untuk menentukan saya masih memiliki fragmentasi:

SELECT * FROM 
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, NULL) 
WHERE avg_fragmentation_in_percent > 0

Dan saya mendapat:

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

Saya tahu saya kehilangan sesuatu yang sangat mendasar, tetapi saya tidak tahu apa.

41
Justin Dearing

Meja kecil. Jumlah halaman dalam tabel Anda adalah:

11, 8, 6, 5, 13, 8, 10

Mereka menempati total 480kb. Secara harfiah tidak ada yang bisa defrag.

Sunting: Ini membutuhkan sedikit penjelasan lebih lanjut.

Tabel atau indeks baru biasanya dialokasikan 8 halaman pertama dari tingkat campuran, bukan seragam. Jadi, dimungkinkan untuk masing-masing dari 8 halaman pertama dialokasikan dari berbagai luasan campuran. Tabel atau indeks yang memakan 8 halaman karenanya dapat memiliki 8 fragmen, 1 pada masing-masing 8 luasan campuran yang berbeda.

Skrip defrag yang lebih banyak digunakan (beberapa contoh yang ditautkan di bawah) cenderung mengecualikan tabel kecil karena ini. IIRC, <500 halaman ada di salah satu atau keduanya. Pada ukuran ini, ada sedikit manfaat untuk defragmenting dan angka fragmentasi berpotensi miring oleh alokasi tingkat campuran.

38

Kutipan dari " Praktik Terbaik Defragmentasi Indeks Microsoft SQL Server 20 ":

"Fragmentasi mempengaruhi disk I/O. Oleh karena itu, fokus pada indeks yang lebih besar karena halaman mereka cenderung tidak di-cache oleh SQL Server. Gunakan jumlah halaman yang dilaporkan oleh DBCC SHOWCONTIG untuk mendapatkan gambaran tentang ukuran indeks (setiap halaman adalah 8 KB dalam ukuran). Secara umum, Anda tidak perlu khawatir dengan tingkat indeks fragmentasi dengan kurang dari 1.000 halaman. Dalam tes, indeks yang berisi lebih dari 10.000 halaman menyadari peningkatan kinerja, dengan yang terbesar keuntungan pada indeks dengan halaman lebih banyak secara signifikan (lebih dari 50.000 halaman) . "

Jadi, jawaban seperti ini untuk pertanyaan Anda dan mendukung jawaban Markus dan Harun.

Anda dapat menemukan informasi yang baik tentang fragmentasi indeks dalam artikel berikut dari Brent Ozar:

Juga lautan info hebat tentang indeks secara umum (juga tentang masalah fragmentasi) dapat ditemukan di blog Kimberly Tripp .

20
Marian

Ini tidak dimaksudkan untuk menjawab pertanyaan Anda, tetapi tidak akan pernah cocok dalam komentar. Anda dapat membuat skrip ini secara dinamis tanpa harus menyalin & menempelkan output ke jendela lain. Mempertimbangkan bahwa sama sekali tidak ada alasan untuk REORGANIZE dan kemudian REBUILD:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'ALTER INDEX all ON ' + name + ' REBUILD;
    ' FROM sys.tables;

PRINT @sql; -- to see the first 8,000 characters and make sure it checks out
-- EXEC sp_executesql @sql;
12
Aaron Bertrand