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?
sql-server
sql-server-2008
data-warehouse
l --''''''---------------- '' '' '' '' '' '' '
sumber
sumber
Jawaban:
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:
DISABLE
indeks non-cluster, membuat indeks cluster tetap utuhREBUILD
Indeks NCJika 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).
sumber
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:
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.
sumber
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.Baca tentang Fragmentasi
Anda ingin membangun kembali indeks (bukan drop / buat kembali) ketika fragmentasi "terlalu tinggi"
Saya memiliki proc IndexOptimize dalam paket ini yang dijadwalkan berjalan setiap malam.
sumber