it-swarm.asia

Kapan saya harus membangun kembali indeks?

Kapan saya harus membangun kembali indeks dalam database relasional saya (SQL Server)?

Apakah ada kasus untuk membangun kembali indeks secara teratur?

57
Nick Chammas

Dengan risiko terlalu umum dalam jawaban saya, saya akan mengatakan bahwa Anda harus menjalankan proses pemeliharaan indeks secara teratur. Namun, proses pemeliharaan indeks Anda hanya akan membangun kembali/mengatur ulang indeks yang secara spesifik memerlukannya.

Ini menimbulkan pertanyaan: kapan indeks perlu dibangun kembali atau ditata ulang? Rolando menyentuh ini dengan baik. Sekali lagi, saya berisiko menjadi sangat luas. Indeks memerlukan pemeliharaan ketika tingkat fragmentasi mempengaruhi kinerja. Tingkat fragmentasi ini dapat bervariasi berdasarkan ukuran dan komposisi indeks.

Berbicara untuk SQL Server, saya cenderung memilih ukuran indeks dan tingkat indeks fragmentasi di mana saya mulai melakukan pemeliharaan indeks. Jika indeks berisi kurang dari 100 halaman, saya tidak akan melakukan pemeliharaan.

Jika indeks antara 10% dan 30% terfragmentasi, saya akan REORGANIZE indeks dan UPDATE statistik. Jika indeks lebih dari 30% terfragmentasi, saya akan REBUILD indeks - tanpa UPDATE STATISTICS, karena ini ditangani oleh REBUILD. Ingat juga bahwa pembangunan kembali hanya memperbarui objek statistik yang secara langsung terkait dengan indeks. Statistik kolom lainnya perlu dipelihara secara terpisah.

Jawaban ini benar-benar hanya jauh untuk mengatakan: Ya, Anda harus melakukan pemeliharaan indeks rutin, tetapi hanya pada indeks yang membutuhkannya.

42
Matt M

Kapan saya harus membangun kembali indeks dalam basis data relasional saya (mis. SQL Server)?

Anda harus membangun kembali indeks ketika mereka menjadi sangat terfragmentasi oleh acara khusus. Misalnya, Anda melakukan beban data yang besar dan besar ke dalam tabel yang diindeks.

Apakah ada kasus untuk membangun kembali indeks secara teratur?

Jadi bagaimana jika indeks Anda menjadi terfragmentasi secara teratur karena aktivitas rutin? Haruskah Anda menjadwalkan pembangunan kembali reguler? Seberapa sering mereka harus berlari?

Tom Kyte , dalam ini tas klasik Tom , merekomendasikan:

Jeda waktu antara pembangunan kembali indeks harus sekitar SELAMANYA.

...

Tidak tahu bagaimana mengatakannya dengan lebih baik - indeks ingin menjadi besar dan gemuk dengan ruang ekstra. Itu ada di kolom yang Anda perbarui - memindahkan entri indeks dari satu tempat ke tempat lain dalam indeks. Suatu hari baris memiliki kode "A", hari berikutnya kodenya adalah "G", lalu "Z" lalu "H" dan seterusnya. Jadi entri indeks untuk baris bergerak dari satu tempat ke tempat lain dalam indeks. Saat melakukannya, diperlukan ruang - akan, jika ruang tidak ada, kami membagi blok menjadi dua - dan membuat ruang. Sekarang indeks semakin gemuk. Seiring waktu indeksnya 2-3x ukurannya ketika Anda mulai dan "setengah atau lebih kosong" Tapi itu OK karena Anda memindahkan baris. Sekarang ketika kita memindahkan baris, kita tidak lagi harus membagi blok untuk membuat ruangan - ruangan sudah tersedia.

Kemudian Anda datang dan membangun kembali atau menjatuhkan dan menciptakan kembali indeks (yang memiliki efek yang sama - hanya membangun kembali itu "lebih aman" - tidak memiliki peluang kehilangan indeks dan bisa lebih cepat karena indeks dapat dibangun kembali oleh memindai indeks yang ada alih-alih memindai tabel dan menyortir dan membuat indeks baru). Sekarang, semua ruang Nice itu hilang. Kami memulai proses pemisahan blok lagi - membawa kami kembali ke tempat kami mulai.

Anda tidak menghemat ruang.

Indeks segera kembali seperti semula.

Anda hanya akan membuang-buang waktu untuk membangunnya kembali sehingga siklus setan ini berulang.

Logikanya di sini adalah suara, tetapi bias terhadap profil beban baca-berat.

Indeks "gemuk" (mis. Indeks dengan banyak celah) memang menyimpan cukup banyak ruang untuk baris baru dan yang dipindahkan, sehingga mengurangi pemisahan halaman dan menjaga kecepatan penulisan Anda. Namun, ketika Anda membaca dari indeks lemak itu, Anda harus membaca lebih banyak halaman untuk mendapatkan data yang sama karena Anda sekarang menyaring lebih banyak ruang kosong. Ini memperlambat bacaan Anda.

Jadi, dalam basis data baca-berat Anda ingin membangun kembali secara teratur atau mengatur ulang indeks Anda. (Seberapa sering dan dalam kondisi apa? Matt M sudah memiliki jawaban konkret untuk pertanyaan ini.) Dalam database yang mengalami aktivitas membaca dan menulis yang kira-kira setara, atau dalam database yang berat-menulis, Anda kemungkinan besar merusak kinerja database Anda dengan membangun kembali indeks secara teratur.

19
Nick Chammas

Kebanyakan orang membangunnya kembali secara teratur sehingga mereka tidak pernah terpecah-pecah. Ketika Anda perlu membangunnya kembali didasarkan pada seberapa cepat mereka terfragmentasi. Beberapa indeks perlu sering dibangun kembali, yang lain pada dasarnya tidak pernah. Lihat skrip SQLFool kumpulkan yang menangani banyak hal untuk Anda.

11
mrdenny

Seperti dicatat dalam jawaban yang diterima dari Matt M, aturan umum adalah bahwa indeks yang lebih dari 30% terfragmentasi harus dibangun kembali.

Kueri ini akan membantu Anda menemukan berapa banyak indeks yang Anda miliki yang lebih dari 30% terfragmentasi (ketika Anda memilikinya, Anda harus membangunnya kembali):

SELECT DB_NAME() AS DBName,
       OBJECT_NAME(ind.object_id) AS TableName,
       ind.name AS IndexName,
       indexstats.index_type_desc AS IndexType,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages,
       SUM(p.rows) AS Rows 
  FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
         INNER JOIN sys.indexes AS ind ON (    ind.object_id = indexstats.object_id
                                           AND ind.index_id = indexstats.index_id)
         INNER JOIN sys.partitions AS p ON (    ind.object_id = p.object_id
                                            AND ind.index_id = p.index_id)
 WHERE indexstats.avg_fragmentation_in_percent > 30
 GROUP BY
       OBJECT_NAME(ind.object_id),
       ind.name,
       indexstats.index_type_desc,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages 
 ORDER BY indexstats.avg_fragmentation_in_percent DESC
8
amandamaddox3

Kapan saya harus membangun kembali indeks?

Ketika persentase indeks fragmentasi lebih dari 30%.

Apakah ada kasus untuk membangun kembali indeks secara teratur?

Tidak ada kasus seperti itu, tetapi secara umum, melakukan Pemeliharaan Indeks seminggu sekali, selama akhir pekan adalah praktik terbaik untuk menjaga stabilitas lingkungan.

Saya akan merekomendasikan menggunakan skrip pemeliharaan dari Ola Hallengren (skrip pemeliharaan terbaik), menyesuaikan skrip berdasarkan lingkungan Anda dan menjadwalkannya untuk dijalankan selama akhir pekan.

https://ola.hallengren.com/

Catatan: Jangan lupa memperbarui statistik setelah membangun kembali indeks, karena indeks pembangunan kembali tidak memperbarui semua statistik.

5
KrishnaV

Seperti kebanyakan hal di TI, itu tergantung. Masalah apa yang Anda coba perbaiki dengan melakukan indeks pembangunan kembali? Dapatkah Anda menunjukkan bahwa itu benar-benar memperbaiki masalah? Jika demikian, Tweak angkanya sampai Anda menemukan jumlah perawatan paling sedikit yang perlu Anda lakukan untuk memperbaiki masalah.

Jika itu tidak memperbaiki masalah, atau alasan Anda melakukannya adalah hanya untuk menenangkan beberapa metrik yang Anda pantau karena mungkin membuat segalanya lebih baik, maka semua yang Anda lakukan adalah membakar CPU dan IO = dan mungkin membuat masalah Anda lebih buruk.

Ada argumen bahwa memperbaiki fragmentasi tidak akan membuat perbedaan pada server Anda, jadi apakah itu layak dilakukan secara teratur?

https://www.brentozar.com/archive/2017/12/index-maintenance-madness/

http://brentozar.com/go/defrag

1
Greg