Pengarsipan data lama

26

Kami saat ini mengalami beberapa masalah kinerja karena basis data kami terlalu besar. Ada data yang disimpan dari 10 tahun terakhir dan saya tidak melihat alasan mengapa data yang lebih tua dari 2 tahun harus disimpan dalam tabel yang sama dengan data baru.

Sekarang karena saya tidak memiliki pengalaman yang sangat mendalam dalam mengelola basis data, saya mencari cara terbaik untuk mengarsipkan data lama.


Info

  • Ada sekitar 310'000'000 catatan dalam database secara total.

  • Basis data membutuhkan 250 GB pada hard disk.

  • Versi Server adalah SQL Server 2008 dengan tingkat kompatibilitas SQL Server 2005 (90), tetapi kami berencana untuk meningkatkan ke SQL Server 2012 segera

Saya telah memikirkan dua kemungkinan:

Database Baru

Buat Database yang mirip dengan yang ada di server produksi dan masukkan semua data lama ke dalam database baru.

  • Kerugian: Karena server tertaut tidak diizinkan di lingkungan kita, akan sulit untuk bergabung dengan data lama jika diperlukan

Skema Sejarah

Buat skema baru fe [hist] dengan tabel yang sama seperti dalam database produksi. Masukkan semua data lama dalam tabel baru ini dalam skema baru.

  • Keuntungan: Mudah bergabung, jika data lama akan dibutuhkan di masa depan


  • Apakah Anda lebih suka salah satu solusi daripada yang lain?
    • Mengapa?
  • Apakah ada kemungkinan yang lebih baik?
  • Apakah ada alat yang ada yang memungkinkan tugas ini mudah?
  • Ada pemikiran lain?

Terima kasih sebelumnya

Edit

Pertanyaan tambahan:

Apakah tabel arsip yang baru dibuat juga memerlukan kunci primer / asing?

Atau haruskah mereka hanya memiliki kolom tetapi tanpa kunci / batasan?

xeraphim
sumber
2
Mungkin perlu menyebutkan versi apa yang Anda gunakan, dan std / ent dll.
dwjv
terima kasih atas petunjuk ini, saya telah menambahkan versi di info tambahan. apa yang sebenarnya Anda maksud dengan std / ent? :-)
xeraphim
1
Permintaan maaf saya, edisi Standar atau Perusahaan.
dwjv
Ah oke :-) ini edisi perusahaan
xeraphim

Jawaban:

11

Saya pikir jawaban atas banyak pertanyaan Anda adalah tergantung. Apa masalah kinerja yang Anda miliki? Tampaknya tidak biasa bahwa database akan mengalami masalah kinerja hanya dari tumbuh hingga 250GB.

Mungkin pertanyaan Anda melakukan pemindaian tabel di seluruh tabel fakta bahkan ketika hanya sebagian kecil (misalnya, tahun lalu) dari rentang tanggal yang dibutuhkan? Jika ada permintaan tertentu yang paling penting untuk dioptimalkan, pertimbangkan untuk memposting skema Anda, permintaan, dan rencana eksekusi aktual dalam pertanyaan lain untuk melihat apakah itu dapat dioptimalkan.

Apakah Anda lebih suka salah satu solusi daripada yang lain?

Saya biasanya lebih suka database sejarah, dan saya pikir Guy menjelaskan alasan yang bagus untuk ini dalam tanggapannya .

Kerugian utama yang saya lihat untuk database riwayat (sebagai lawan skema) adalah Anda tidak bisa lagi menggunakan kunci asing untuk tabel arsip Anda. Ini mungkin baik untuk Anda, tetapi itu sesuatu yang harus diperhatikan.

Kerugian yang Anda daftarkan untuk pendekatan ini tidak akurat; Anda akan dapat melakukan kueri di seluruh basis data di server yang sama dengan mudah dan pengoptimal kueri umumnya menangani kueri basis data dengan sangat baik.

Apakah ada kemungkinan yang lebih baik?

Jika Anda perlu menanyakan data arsip secara teratur, saya mungkin mempertimbangkan untuk mempartisi tabel berdasarkan tanggal . Namun, ini adalah perubahan besar yang dapat datang dengan banyak implikasi kinerja, baik positif (misalnya, penghapusan partisi, pemuatan data yang lebih efisien) dan negatif (misalnya, pencarian tunggal yang lebih lambat, potensi yang lebih besar untuk kemiringan benang dalam kueri paralel). Jadi saya tidak akan membuat keputusan ini dengan mudah jika ini adalah database yang banyak digunakan.

Apakah tabel arsip yang baru dibuat juga memerlukan kunci primer / asing? Atau haruskah mereka hanya memiliki kolom tetapi tanpa kunci / batasan?

Saya akan merekomendasikan memiliki setidaknya kunci utama dan indeks unik sehingga Anda bisa mendapatkan manfaat integritas data yang mereka berikan. Misalnya, ini akan mencegah Anda secara tidak sengaja memasukkan data setahun ke tabel sejarah dua kali. Dan sebagai manfaat samping itu dapat meningkatkan kinerja jika Anda perlu meminta tabel histori.

Ada pemikiran lain?

Karena Anda menggunakan edisi Perusahaan dan berencana untuk meningkatkan ke SQL 2008+, Anda dapat mempertimbangkan kompresi data untuk tabel ini. Kompresi tentu akan mengurangi ruang disk, tetapi tergantung pada disk server dan sumber daya CPU Anda juga dapat meningkatkan kinerja kueri untuk membaca dengan mengurangi disk I / O dan meningkatkan pemanfaatan memori (lebih banyak data masuk dalam cache sekaligus).

Geoff Patterson
sumber
9

Saya lebih suka memiliki skema riwayat atau database historis kedua dari server yang terhubung kapan saja. Menghemat biaya lisensi dan mengelola lebih mudah. Anda kemudian dapat juga menggunakan skema sederhana dan drop beberapa indeks membuat database lebih kecil

Tetapi karena Anda memiliki edisi perusahaan, Anda memiliki opsi ketiga yaitu untuk mempartisi tabel Anda yang, ketika diberlakukan membuatnya lebih mudah untuk mengarsipkan data dan meminta data lama transparan untuk pengguna Anda dan Anda tidak perlu membuat perubahan aplikasi .

Spörri
sumber
1
Memasukkan skema ke-2 ke dalam filegroup itu sendiri juga akan memungkinkan OP untuk menempatkan data arsip pada disk yang lebih lambat, lebih murah,. Karena OP menggunakan Enterprise Edition, mereka juga dapat mengambil manfaat dengan melakukan pemulihan sedikit demi sedikit jika terjadi pemulihan bencana.
Max Vernon
7

Dalam pengalaman saya, basis data kedua akan menjadi pilihan yang lebih disukai karena dua alasan.

  1. Anda dapat mengembalikan data dari cadangan historis lalu letakkan tabel dan indeks yang tidak Anda butuhkan.
  2. Anda dapat memindahkan ini ke server yang berbeda untuk tujuan pelaporan, ini memiliki manfaat karena tidak menggunakan sumber daya dari server utama

Anda masih perlu menghapus semua data historis dari basis data primer tetapi ini bisa dijadwalkan pada.

Orang
sumber
4

Mengabaikan lisensi untuk saat ini karena itu bukan tempat saya menghabiskan waktu saya.

IMHO, basis data arsip adalah sederhana untuk menerapkan dan memelihara. Mereka berbeda, entitas yang digabungkan secara longgar. Kontrol data dan kontrol beban / sumber daya memiliki batas yang jelas. Dapat dengan mudah pindah ke instance atau server yang berbeda untuk manajemen kinerja yang lebih baik dan biaya bukanlah masalah utama. Perhatikan bahwa paling sederhana! = Usaha termurah atau paling tidak. Ini sebenarnya memiliki tugas yang sedikit lebih banyak tetapi semuanya tugas sederhana dengan dua pengecualian penting:

  1. kendala penegakan - tidak ada batasan lintas basis data dalam SQL Server sehingga Anda perlu memutuskan apakah itu merupakan pemecah kesepakatan.
  2. kueri basis data lintas menggunakan kueri terdistribusi yang masih bergantung pada OLEDB yang sudah usang. Itu berarti Anda mungkin mengalami masalah dengan tipe data baru plus jika Anda mengalami masalah kinerja, tidak mungkin mereka akan pernah diperbaiki

Skema arsip atau tabel arsip saja sedikit lebih rumit untuk diterapkan tetapi jauh lebih mudah digunakan. Semua objek dalam database yang sama berarti Anda tidak perlu mereplikasi dan mempertahankan kontrol akses. Tidak ada kueri basis data lintas yang membuat penyetelan kinerja, pemantauan, pemecahan masalah, dll ...

Partisi tabel adalah solusi hebat dan mampu memberikan banyak manfaat dari tabel arsip / skema tetapi memberikan transparansi kepada pengguna / kueri. Yang mengatakan, itu adalah yang paling kompleks untuk diterapkan dan membutuhkan perawatan berkelanjutan yang tidak mudah bagi pemula.

Beberapa pertimbangan penting:

  • Apakah kueri mengembalikan data historis / dingin secara teratur atau apakah data dingin jarang diakses?
  • Apakah data historis tidak dapat diubah atau apakah diperbarui / dihapus secara berkala?
  • Baris 310m adalah "sedang" (dengan asumsi semua dalam 1 tabel) tergantung pada ukuran baris. Apakah Anda memiliki data ukuran baris? Berapa GB baris 310m itu?
  • Berapa tingkat pertumbuhan tabel itu?
  • Apakah Anda dapat mengubah kode aplikasi dan kueri SQL-nya?

Ini adalah pertimbangan penting karena dapat memiliki dampak signifikan pada solusi yang Anda pilih atau bahkan mungkin tidak mengizinkan solusi tertentu. Misalnya, jika data historis Anda diubah / diperbarui secara berkala (lebih dari sekali seminggu), menggunakan database terpisah berarti Anda harus menggunakan DTC untuk pertanyaan tersebut atau mengelola keamanan transaksi secara manual (tidak sepele untuk memastikan selalu benar). Biaya jauh lebih tinggi daripada data historis yang tidak dapat diubah.

Juga, jika Anda berpikir untuk meningkatkan, pertimbangkan 2016 dan fitur Stretch Database baru: https://msdn.microsoft.com/en-us/library/dn935011.aspx

SQLmojoe
sumber
1

Saya lebih suka memisahkan database menjadi database logis terpisah karena alasan berikut:

1. Persyaratan Sumber Daya

Dengan memisahkan ini ke dalam basis data yang terpisah, ini dapat disimpan pada drive yang berbeda dan dipantau pada tingkat yang berbeda dengan data produksi utama.

2. Kinerja

Dengan membagi data ke database terpisah, basis data Produksi utama dikurangi ukurannya, membantu kinerja keseluruhan.

3. Backup yang Lebih Sederhana

Mencadangkan data yang diarsipkan mungkin tidak dianggap sepenting catatan 'live / current' dalam database SQL utama. Ini mungkin berarti bahwa data yang diarsipkan dapat dicadangkan lebih jarang. Juga karena sifat berurutan tentang bagaimana data yang diarsipkan dicatat, dimungkinkan untuk membuat cadangan bagian dari database yang diarsipkan sekali dan kemudian tidak pernah lagi. Misalnya, sekali data arsip ditulis dalam database Ubah arsip untuk 2014, tidak akan pernah ada perubahan pada data itu lagi.

Catatan: Saya pikir jawaban untuk banyak pertanyaan Anda semuanya tergantung pada keadaan Anda, sifat data, dan masalah kinerja yang Anda alami.

Sathish
sumber