Cara tanpa rasa sakit untuk membuat indeks berkerumun di atas meja besar?

22

Jadi kami memiliki situs pelanggan yang mengeluh tentang beberapa kinerja yang sangat lambat. Saya melihat sekali dan jelas bahwa masalahnya adalah karena Somebody Else (grrrr) mendesain meja yang menampung sekitar 20 juta catatan tanpa indeks berkerumun.

Sekarang saya ingin membuat indeks berkerumun di atas meja itu - tetapi di lingkungan pengujian saya create indexperintah saya telah berjalan selama satu jam dan itu masih belum selesai. Situs pelanggan adalah lantai toko yang berfungsi 24/7, dan tidak mampu membayar waktu turun satu jam saat saya membuat indeks.

Apakah ada beberapa metode yang kurang kasar untuk membuat indeks yang akan menyelesaikan pekerjaan dengan cepat, atau melakukannya dengan cara yang cerdas yang tidak akan benar-benar mematikan kinerja server saat sedang sibuk?

Kami menggunakan SQL Server Enterprise Edition.

Shaul bilang aku Dukung Monica
sumber

Jawaban:

26
  • Jika server sql Anda adalah edisi Enterprise + dan tabel tidak memiliki bidang BLOB - CREATE CLUSTERED INDEX ... WITH(ONLINE=ON)

  • Jika tidak - tidak ada cara selain membuat tabel dengan skema yang sama di sisi dan dengan bijak mentransfer data ke dalamnya, termasuk semua operasi INSERT / UPDATE / DELETE (menggunakan pemicu, misalnya), dan kemudian secara akurat menjatuhkan tabel lama dan ganti nama baru dengan nama yang sama dengan yang lama - kontra adalah: lambat, menambah beban tambahan ke server dan penyimpanan

Oleg Dok
sumber
12

Tidak yakin versi SQL server yang digunakan pelanggan Anda. Di perusahaan Anda dapat membangun indeks dengan (ONLINE = ON), sehingga tabel tersedia hingga indeks dibuat.


sumber
8
  • Buat tabel baru yang identik dengan aslinya (jelas akan membutuhkan nama yang berbeda)
  • Buat indeks berkerumun di tabel baru
  • Muat data ke tabel baru
  • Jatuhkan meja asli
  • Ganti nama tabel baru menggunakan nama asli

Pastikan Anda menerapkan izin apa pun yang diperlukan dari aslinya.

Bryan
sumber