Kapan indeks harus dijatuhkan dan diciptakan kembali?

9

Kami sedang membangun gudang data yang awalnya akan 1 TB dan akan tumbuh sekitar 20 gram setiap bulan.

Untuk tabel tertentu kami melakukan proses ETL harian dan yang lain kami lakukan mingguan / bulanan.

Ketika ada impor data yang masuk ke tabel, apakah perlu untuk menjatuhkan dan membuat ulang indeks?

Apakah ada titik untuk menjatuhkan dan membuat ulang indeks atau apakah mereka secara otomatis diperbarui?

Statistik diatur untuk memperbarui secara otomatis.

Terima kasih banyak atas bantuan dan bimbingannya.

Saya mendapatkan skrip jenius ini:

SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
       CASE WHEN ps.avg_fragmentation_in_percent > 40 THEN 'REBUILD' ELSE 'REORGANIZE' END +
       CASE WHEN pc.partition_count > 1 THEN ' PARTITION = ' + cast(ps.partition_number as nvarchar(max)) ELSE '' END
FROM   sys.indexes AS ix INNER JOIN sys.tables t
           ON t.object_id = ix.object_id
       INNER JOIN sys.schemas s
           ON t.schema_id = s.schema_id
       INNER JOIN (SELECT object_id, index_id, avg_fragmentation_in_percent, partition_number
                   FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)) ps
           ON t.object_id = ps.object_id AND ix.index_id = ps.index_id
       INNER JOIN (SELECT object_id, index_id, COUNT(DISTINCT partition_number) AS partition_count
                   FROM sys.partitions
                   GROUP BY object_id, index_id) pc
           ON t.object_id = pc.object_id AND ix.index_id = pc.index_id
WHERE  ps.avg_fragmentation_in_percent > 10 AND
       ix.name IS NOT NULL

dari sini:

http://weblogs.asp.net/okloeten/archive/2009/01/05/6819737.aspx

Apakah Anda menyarankan saya menjalankan skrip ini setiap hari dan berdasarkan temuan jalankan kode yang dihasilkan?

l --''''''---------------- '' '' '' '' '' '' '
sumber
saya akan sangat berterima kasih jika seseorang menjelaskan kepada saya apa masalahnya dengan pertanyaan saya
l --''''''--------- '' '' '' '' '' ''
Ini pertanyaan terkait yang saya tanyakan. dba.stackexchange.com/questions/11389/... Pengetahuan yang saya peroleh dari pertanyaan ini dan jawabannya banyak mengajari saya dan kami telah merealisasikan keuntungan besar karenanya.
swasheck

Jawaban:

13

Jika ini adalah ETL siklis, dan Anda berada dalam lingkungan data pengembangan (yaitu BUKAN LANGSUNG), maka Anda harus mengelola indeks Anda sebagai bagian dari siklus beban Anda.

Saya melakukan ini untuk beberapa set data setiap bulan, yang terbesar menambahkan sekitar 100 GB setiap bulan ke set data 5 TB.

Saya telah melakukan pengujian ekstensif, dan dari pengalaman saya sendiri, cara paling efisien untuk memuat berkaitan dengan indeks adalah:

  1. DISABLE indeks non-cluster, membuat indeks cluster tetap utuh
  2. Lakukan pemuatan mentah ke tabel data Anda
  3. REBUILD Indeks NC

Jika Anda hanya menambahkan baris secara berkala sebagai bagian dari ETL yang dikelola, inilah caranya. Ini juga memastikan semua statistik Anda mutakhir.

Untuk statistik, penting untuk dicatat bahwa menambahkan 20GB ke basis data 1TB tidak akan mencapai titik kritis untuk pembaruan otomatis statistik, sehingga Anda dapat menambahkan data sebulan penuh tanpa memperbarui statistik.

Membangun kembali indeks NC Anda adalah cara yang baik untuk mengatasi hal ini. Anda mungkin ingin juga melakukan pembangunan kembali indeks berkerumun secara berkala jika fragmentasi menjadi tinggi (tergantung pada struktur tabel Anda dan kunci berkerumun Anda).

JNK
sumber
4
Anda juga dapat memperbarui statistik sebagai bagian terpisah dari proses Anda, dicampur di antara NC membangun kembali jika melakukan itu sering terlalu mahal.
Aaron Bertrand
1

Untuk basis data 1TB +, menjatuhkan dan membuat indeks setiap hari akan berlebihan (bahkan jika Anda hanya membuat ulang beberapa dari mereka).

Jika Anda khawatir tentang kecepatan memasukkan / memperbarui di tabel Anda karena overhead ditambahkan oleh pembaruan indeks, maka saya merekomendasikan dua hal:

  1. Gunakan PK pengganti sehingga sisipan indeks yang dikelompokkan akan memiliki overhead yang minimal.
  2. Profil DWH Anda dan buat indeks yang tidak berkerumun di mana benar-benar diperlukan.

Anda harus hidup dengan pembaruan indeks non-cluster selama operasi insert / update.

Jika Anda khawatir tentang fragmentasi indeks, maka saya sarankan untuk membuat pekerjaan harian (pekerjaan Agen SQL) untuk membangun kembali indeks. Periode pembangunan kembali sebenarnya bisa apa saja, tergantung pada tingkat fragmentasi. Anda harus memperhatikan ini dalam praktik dan mengatur jadwal pekerjaan yang sesuai.

Anda dapat menambahkan beberapa logika ke skrip membangun kembali, tergantung pada tingkat fragmentasi. Beberapa pedoman bagus bisa Anda temukan di sini .

Intinya adalah bahwa dalam keadaan apa pun Anda tidak boleh melakukan indeks penuh membangun kembali pada database sebesar itu.

Marcel N.
sumber
6
Saya harus tidak setuju dengan banyak ini. Itu akan tergantung pada kasus penggunaannya, tetapi baris terakhir under any circumstances you shouldn't do a full index rebuild on a database of that size.itu tidak akurat sama sekali. Saya melakukan ETL pada basis data yang sangat besar sebagai tugas utama saya dan saya melihat manfaat besar dari menonaktifkan dan membangun kembali indeks.
JNK
1
Saya berharap ini diterapkan dalam kasus saya juga. Pada database 1TB sedikit lebih dari berjalan pada lingkungan produksi, saya hampir tidak mampu melakukan indeks non-cluster malam membangun kembali untuk beberapa tabel dengan lebih dari 500 juta. baris. Saya memiliki beberapa proses ETL yang berjalan setiap malam dan langkah terakhir yang saya lakukan dari jam 3:00 pagi adalah membangun kembali indeks.
Marcel N.