Partisi SQL Server - apa yang harus digunakan untuk kunci partisi?

10

Saya tidak pernah bekerja dengan partisi SQL Server tapi saya saat ini dihadapkan dengan mendesain database yang mungkin membutuhkan volume. Sistem ini untuk kupon. Kupon akan diterbitkan secara berkala, biasanya setiap enam minggu meskipun akan ada juga penerbitan ad-hoc - misalnya untuk acara khusus. Ada 15 juta pelanggan dan untuk setiap acara penerbitan, setiap pelanggan akan menerima 6 jenis kupon yang berbeda, memberikan total 90 juta contoh kupon. Kami perlu melacak data penukaran instance kupon dan mempertahankannya selama 6 bulan, meskipun biasanya kupon hanya berlaku selama enam minggu. Setiap permintaan penukaran kupon yang tidak valid tidak akan mencapai basis data karena akan divalidasi oleh POS hingga.

Selama periode enam bulan kita perlu menyimpan hingga 360 juta baris di tabel Kupon Instance dan hingga 72 juta (dengan asumsi tingkat penukaran maks 20%) di tabel Penebusan. Saya merasa bahwa angka-angka ini terlalu besar untuk satu partisi?

Pertanyaan saya adalah - apa yang harus digunakan sebagai kunci partisi? Satu kandidat yang jelas akan dengan acara penerbitan, memberikan sekitar 6 partisi. Tetapi kemudian saya berpikir bahwa mungkin bahkan itu akan memberikan ukuran partisi yang terlalu besar untuk memungkinkan kinerja yang optimal? Apakah mungkin untuk mempartisi dengan dua kunci misalnya dengan acara penerbitan + digit terakhir dari id pelanggan? Jadi logikanya adalah:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

Juga, saya tidak yakin dengan spesifikasi server database yang akan kami butuhkan. Apakah 16gb dan 8CPU cukup? Db harus dapat mengembalikan hasil dari tabel instance kupon, dikunci pada nilai barcode numerik dalam waktu kurang dari setengah detik. Permintaan transaksi yang diharapkan untuk divalidasi (pilih) dan tebus (masukkan) diperkirakan akan memuncak pada sekitar 3.500 per menit.

SQL Server 2008r2 64bit db server akan ditetapkan sebagai VM dari host yang sangat kuat dengan akses ke SAN kinerja tinggi dan kapasitas besar.

Saya akan sangat berterima kasih atas saran dari mereka yang telah menggunakan solusi SQL Server untuk mengelola volume yang sama.

Salam

Rampok.

Rob Bowman
sumber
2
Tabel Anda masih kecil - tidak PERLU untuk partisi, saya punya meja dengan beberapa miliar baris tanpa partisi, berfungsi. Partisi bagus untuk DROP CEPAT.
TomTom
1
Omong kosong @ TomTom, partisi dapat bermanfaat di baris menghitung bagian dari ini. Memang skema partisi harus bermanfaat bagi pola akses untuk mewujudkan peningkatan kinerja tetapi selimut "tidak perlu" pada ukuran ini jelas salah.
Mark Storey-Smith
1
Tidak, itu benar. PERLU! = Manfaat. KEBUTUHAN adalah ketika Anda mengalami masalah melakukan kueri tanpa partisi.
TomTom
1
Hey @TomTom Saya pikir Anda perlu teman istirahat kecil, itu sedikit kuat, bahkan jika tidak benar-benar menyinggung. Saya setuju dengan Mark StoreySmith, selimut "no NEED" jelas salah, namun pernyataan Anda bahwa itu mungkin tidak diperlukan adalah benar. Saya membayangkan ini masalah pengindeksan. Saya juga tahu bahwa Mark tahu apa yang Anda maksud dengan kebutuhan vs manfaat. Potong kami semua sedikit kendur dan hilangkan kafein, k? (Dan percayalah, saya dikenal memiliki kesabaran yang sangat sedikit di beberapa hari, terutama hari-hari seperti hari ini di mana saya menderita sakit punggung)
jcolebrand

Jawaban:

14

Pertanyaan spesifikasi server harus diarahkan ke Serverfault atau DBA.SE.

Untuk pertanyaan tentang partisi, saya rasa Anda tidak perlu melakukan partisi untuk ini.

Baris 360m banyak tetapi tidak terlalu sulit.

Apakah TIDAK dalam keadaan apa pun mencoba untuk partisi berdasarkan digit terakhir dari lapangan. Saya tidak yakin ini akan berhasil, tetapi itu bukan SARGable yang tidak akan dapat dipertahankan.

Jika Anda hanya perlu melakukan pencarian satu baris berdasarkan kunci numerik, partisi mungkin tidak akan membantu.

Jika Anda memutuskan untuk mengejar rute partisi, ingatlah untuk menjadi efektif semua pertanyaan Anda perlu menyertakan kunci partisi Anda sehingga mesin tahu partisi mana yang akan diperiksa. Kalau tidak, itu akan memeriksa semuanya dan Anda benar-benar merusak kinerja.

JNK
sumber
Saya juga setuju. Terkadang Anda hanya perlu indeks yang lebih baik.
jcolebrand
Saya tidak setuju dengan @JNK. Pencarian baris tunggal berdasarkan kunci numerik yang mendapat manfaat dari penghapusan partisi adalah mengurangi IO. Jika pola akses sedemikian rupa sehingga partisi yang sering diakses tetap berada di kumpulan buffer di atas partisi yang jarang diakses, Anda memiliki manfaat kinerja lebih lanjut. Dan kami bahkan belum menyentuh fitur favorit saya yang dipartisi oleh Anda, ketersediaan sebagian.
Mark Storey-Smith
Sebagai catatan, pada poin Anda yang lain saya setuju dengan sepenuh hati :)
Mark Storey-Smith
@ MarkStorey-Smith - Ini akan tergantung pada kuncinya. Seperti yang saat ini didefinisikan dalam OP, partisi tidak akan menambah nilai. Sepertinya dia tidak akan dapat menggunakan kunci dua bagian dengan bidang tanggal atau skema partisi "normal".
JNK
5

Anda BISA mempartisi pada beberapa kunci jika Anda menggunakan kolom yang tetap dihitung; seperti yang orang lain katakan, partisi tidak berfungsi untuk setiap situasi. Saya tidak yakin bahwa saya cukup memahami skenario Anda untuk memberikan saran spesifik, tetapi berikut adalah beberapa pedoman umum:

  • Partisi berguna dalam membaca data ketika kunci partisi adalah bagian dari pernyataan SQL, yang memungkinkan pengoptimal untuk memanggil pengecualian parisi. Anda harus yakin bahwa kunci yang Anda pilih berguna untuk sebagian besar permintaan.

  • Salah satu manfaat dari strategi partisi yang baik adalah untuk menua data; misalnya, jika kunci partisi Anda berbasis tanggal (yaitu, hari dalam setahun), dan Anda ingin menghapus semua data yang lebih tua dari tanggal tertentu, sangat mudah untuk MENGALIHKAN partisi tersebut ke tabel kosong dan potong.

Stuart Ainsworth
sumber
4

Anda benar-benar perlu mendefinisikan persyaratan Anda sedikit lebih jelas. Anda menyebutkan bahwa Anda akan memiliki sekitar 360 juta baris dalam 6 bulan. Bagaimana dalam 2 tahun ke depan? Apakah Anda masih akan tumbuh hanya pada tingkat saat ini Anda sedang tumbuh. Atau ada kemungkinan Anda akan mengalami pertumbuhan eksponensial. Apakah Anda ingin menyimpan data di tabel ini selamanya; atau Anda ingin mengarsipkan data secara teratur.

Partisi dapat digunakan untuk pengarsipan data. Lihat skenario jendela geser. Lihat whitepaper ini dan ini .

Partisi juga dapat digunakan untuk mengelola fragmentasi indeks. Anda dapat membangun kembali / mengatur ulang partisi tertentu.

Anda juga harus mempertimbangkan tampilan yang dipartisi sebagai lawan dari tabel yang dipartisi. Tampilan yang dipartisi tidak memerlukan lisensi SQL Server Enterprise. Tampilan yang dipartisi juga memungkinkan Anda untuk melakukan pembangunan kembali indeks online pada "partisi" tertentu.

Partisi juga dapat dipertimbangkan ketika melakukan perencanaan pemulihan bencana Anda. Ini dapat digunakan untuk pemulihan database parsial. Sebagai contoh: Anda dapat membuat partisi lama Anda di filegroup yang berbeda dari partisi utama / saat ini. Dan kemudian ketika Anda memulihkan, Anda memulihkan filegroup utama, kemudian filegroup di mana partisi Anda saat ini berada dan kemudian yang terakhir Anda dapat mengembalikan filegroup di mana partisi lama berada. Ini dapat mengurangi jumlah waktu aplikasi Anda harus turun.

Lihat video hebat ini dari Kimberly Tripp tentang mempartisi .

Dharmendar Kumar 'DK'
sumber
Kami hanya perlu menyimpan data selama enam bulan. Setiap minggu, kami akan menjalankan pekerjaan rumah tangga yang akan menghapus kupon yang dikeluarkan lebih dari enam bulan sebelumnya.
Rob Bowman
3
Jadi pada dasarnya Anda harus menghapus / menghapus sekitar 15 juta baris setiap minggu. Berapa lebar meja? Saya sarankan Anda mempartisi tabel berdasarkan kolom tanggal. Dengan cara ini, penghapusan mingguan akan menjadi operasi meta sederhana. Anda hanya perlu BERALIH partisi tertua dari tabel dipartisi utama menjadi tabel pementasan. Lalu jatuhkan meja pementasan. Ini disebut skenario Sliding Windows. Lihatlah kertas putih pertama yang saya posting oh bagaimana melakukan ini.
Dharmendar Kumar 'DK'
-2

Kecuali Anda melakukan partisi karena pengarsipan data lama, Anda melakukannya karena alasan yang salah dan tidak boleh melakukannya.

Ryk
sumber
2
Ada banyak alasan untuk menggunakan partisi selain pengarsipan; Pengecualian partisi sangat bermanfaat bagi berbagai jenis kueri, jika digunakan dengan benar.
Stuart Ainsworth
Saya setuju dengan Stuart, ini saran yang agak buruk.
jcolebrand