Cara terbaik untuk mendefrag / memadatkan basis data untuk keperluan arsip

9

Kami punya contoh SQL Server yang digunakan untuk pengarsipan email (milik paket pengarsipan pihak ke-3). Seringkali, perangkat lunak digulingkan ke database kosong baru. Kami telah melakukan ini setiap tiga bulan di masa lalu, tetapi kami ingin melakukannya setiap bulan sekarang. Jumlah data yang diarsipkan sekitar 15 - 20 GB per bulan, dan sebagian besar data hanya berada di beberapa tabel (biasanya 2 - 4).

Setelah kami membuka basis data baru, yang lama digunakan hanya dengan basis read-only. Apa yang ingin saya lakukan adalah mengoptimalkannya menjadi file data yang bagus dan ketat, dengan semua tabel / indeks berdekatan dan memiliki faktor pengisian yang sangat tinggi, dan tidak banyak ruang kosong di akhir file data. Selain itu, kami menggunakan Edisi Standar di server ini, dengan semua batasan yang menyiratkan (kalau tidak saya sudah akan menggunakan kompresi data).

Beberapa kemungkinan yang dapat saya pikirkan:

  1. REBUIL / REORGANISASI indeks, DBCC SHRINKFILE (Oke, ini bukan pilihan yang masuk akal, karena DBCC SHRINKFILE akan memecah kencing dari apa pun yang disentuhnya, tapi saya memasukkannya untuk kelengkapan.)
  2. Buat database baru dengan statistik otomatis tidak aktif. Script dan buat ulang semua tabel dari sumber database. Gunakan bcp untuk mengekspor / mengimpor data ke dalam basis data baru, dalam urutan kunci-cluster. Script dan buat ulang semua indeks. Hitung ulang semua statistik dengan pemindaian penuh.
  3. Buat database baru dengan statistik otomatis tidak aktif. Script dan buat ulang semua tabel dari sumber database. Gunakan SSIS atau T-SQL untuk mentransfer data ke database baru. Script dan buat ulang semua indeks. Hitung ulang semua statistik dengan pemindaian penuh.

Langkah terakhir dalam setiap kasus adalah mengatur basis data ke mode hanya baca.

Pilihan bagus / lebih baik apa yang ada untuk melakukan ini? Kekhawatiran saya adalah memindahkan data sedemikian rupa untuk mempertahankan faktor pengisian tinggi, dan dengan cara yang berdekatan secara logis.

Edit:

Saya harus menyebutkan bahwa sekitar 75% dari data tampaknya disimpan dalam kolom image (LOB).

db2
sumber
3
Apakah Anda (atau aplikasi) peduli jika tabel secara fisik berakhir di filegroup selain PRIMARY?
Jon Seigel
@ JonSeigel saya kira tidak, dan sebenarnya itu ide yang cukup bagus, karena itu akan menyelamatkan saya dari kesulitan membuat database templat, dan memindahkan semua data.
db2
Apakah Anda hanya mempertimbangkan solusi yang Anda kodekan sendiri atau Anda juga dapat meninjau beberapa aplikasi untuk membantu Anda dengan itu? Anda dapat menggunakan Kompres Penyimpanan SQL RedGate untuk mengompresi data langsung. Atau Anda dapat mencoba Virtual Restore untuk membuat cadangan terkompresi tersedia sebagai dbs online (tanpa benar-benar memiliki ruang lengkap yang diperlukan). Mereka semua didasarkan pada driver file windows Hyperbac yang lebih lama yang sangat baik dalam mengompresi data langsung dan backup.
Marian
@Marian Kedengarannya menarik, tapi saya ingin tetap menggunakan kemampuan SQL Server asli untuk saat ini. Saya hanya perlu men-defrag database dengan sangat efektif, tanpa banyak ruang tersisa yang tidak digunakan dalam file. Jika itu adalah alat pihak ketiga yang melakukan pekerjaan alih-alih scripting secara manual, itu bagus.
db2
Itu hanya pemikiran, tetapi mengapa tidak membuat filegroup baru, menambahkan file, mengatur pertumbuhan yang wajar (katakanlah 500MB) dan kemudian membangun kembali tabel Anda ke filegroup baru itu. Kemudian menyusutkan file primer menjadi hampir tidak ada. Anda tidak akan peduli dengan jeda tentang fragmentasi pada tabel sistem.
Nic

Jawaban:

1

Untuk menghilangkan fragmentasi fisik dalam file, Anda dapat memindahkan indeks berkerumun dengan drop yang ada ke grup file baru. Karena mereka akan menjadi RO, buatlah semuanya menjadi pengisi 100% karena tidak ada ruang yang diperlukan untuk menyisipkan, pemisahan halaman yang disebabkan oleh pembaruan.

Ini juga akan memungkinkan Anda untuk melakukan pemulihan sedikit demi sedikit dan membawa database online dengan sangat cepat jika Anda memutuskan untuk pergi ke Enterprise. Enterprise juga memungkinkan indeks toko kolom selain secara besar-besaran mengurangi waktu kueri untuk data Hanya Baca ini, yang merupakan fillet masif.

Anda dapat menggunakan opsi shrinkfile sekali sebelum beralih untuk membaca hanya tanpa masalah serius dengan fragmentasi untuk menghapus ruang di akhir file seperti yang Anda inginkan.

Di samping catatan, hanya memeriksa bahwa Anda menggunakan Datatypes terbaru untuk LOBS Anda. yaitu nvarchar (max) atau varchar (max) bukannya ntext atau teks, varbinary (max) bukan gambar?

Barang rusak
sumber
Sayangnya sebagian besar menggunakan teks dan gambar. Ini adalah aplikasi pihak ke-3, jadi saya tidak memiliki kemampuan untuk mengubahnya.
db2
@ benar-benar transparan ke aplikasi, dengan SQL server menyimpan informasi dalam baris jika <8k. Jika vendor mengatakan itu tidak didukung, saya akan bertanya kepada mereka mengapa mereka masih menggunakan tipe data yang awalnya ditinggalkan dalam SQL Server 2005!
DamagedGoods
Saya tidak dapat sepenuhnya yakin bahwa aplikasi tersebut tidak melakukan hal-hal khusus teks / gambar seperti WRITETEXT yang akan gagal setelah mengubah tipe data. Tetapi kembali ke poin utama, sepertinya membuat ulang indeks berkerumun tidak akan benar-benar memindahkan data LOB dengannya.
db2
Anda dapat melakukan ini tetapi Anda harus masuk ke perancang di GUI, kemudian memperluas propertinya, kemudian Anda memiliki 'ruang data reguler' tetapi juga sebuah grup berkas TEXTIMAGE, mengubah kehendak ini, tetapi hati-hati ini akan membuat ulang tabel! Anda dapat dengan jelas
menuliskan
Mengerti, itu mungkin cara yang berguna untuk menghasilkan skrip bangun ulang yang sesuai, paling tidak.
db2
0

Saya menghadapi masalah serupa dengan alat pihak ketiga yang juga menggunakan tipe data gambar untuk menyimpan data yang tidak terstruktur, dan saya menyelesaikannya dengan mengonversi kolom untuk menggunakan filestream . Anda perlu melakukan beberapa pengujian untuk memastikan aplikasi masih berfungsi seperti yang Anda harapkan, tetapi ini akan memberi Anda kemampuan untuk menulis proses pengarsipan Anda sendiri yang memindahkan data Anda ke arsip db secara efisien.

Liam Confrey
sumber
Saya curiga filestream tidak akan bagus dalam kasus ini. Kami memiliki lebih dari 14 juta baris di 17 basis data, dan kami mendapatkan pesan sekitar 15.000 per hari. Sebagian besar badan pesan di bawah 4 KB, jadi limbah cluster NTFS mungkin akan brutal (dan itu bahkan jika kita menambahkan volume disk baru dengan ukuran blok lebih kecil dari 64KB).
db2
Dalam hal ini, dapatkah Anda mengonversi tipe data menjadi sesuatu seperti nvarchar (maks) dan menggunakan klausa TEXTIMAGE_ON untuk menentukan grup berkas yang berbeda untuk objek besar ini? Itu akan memungkinkan Anda menyimpan data di luar baris dan memungkinkan untuk membuat proses Anda sendiri untuk mengelola pengarsipan.
Liam Confrey
penggunaan filestream sangat tergantung pada seberapa besar masing-masing LOBS. Saya pikir> 1MB per catatan untuk dipertimbangkan. Jadi saya setuju dalam hal ini bukan pilihan
DamagedGoods