Apakah kunci partisi juga harus menjadi bagian dari kunci primer?


24

Saya mempartisi tabel berdasarkan kolom yang bukan kunci utama? Saya telah membaca beberapa informasi yang saling bertentangan hari ini mengenai apakah kolom partisi harus menjadi bagian dari kunci utama. Perasaan saya mengatakan tidak, tetapi saya tidak 100% yakin. Jadi pertanyaan ...

  1. Haruskah kolom partisi menjadi bagian dari primer? Apakah disarankan satu atau lain cara?
  2. Apakah saya harus membuat indeks untuk kunci partisi, atau apakah DBMS melakukannya secara otomatis sendiri?

Jawaban:


11

Tidak semuanya.

Salah satu skenario yang paling umum untuk mempartisi adalah menggunakan bidang tanggal, yang sama sekali tidak terkait dengan PK Anda.

Misalnya, jika Anda memiliki tabel Ordersdengan bidang OrderDateAnda kemungkinan besar partisi berdasarkan pada bulan dan tahun OrderDate.

Ketika catatan usang dan tidak lagi relevan, Anda dapat memindahkan partisi tersebut ke tabel arsip atau database sehingga tidak lagi diproses.

Mempartisi akan bekerja dengan cukup banyak bidang apa pun, tetapi agar dapat berfungsi dengan baik, bidang yang Anda partisi harus digunakan di sebagian besar, jika tidak semua, dari kueri Anda. Jika Anda tidak memasukkan kunci partisi Anda maka pada dasarnya Anda akan mendapatkan pemindaian tabel mahal yang melintasi beberapa tabel (partisi).

EDIT

Untuk bagian 2, saya pikir jawabannya tidak juga. Kunci partisi digunakan untuk menentukan partisi mana yang akan ditempatkan, tetapi saya rasa indeks tidak dipertahankan. Mungkin ada statistik di bagian belakangnya.


10
Saya tahu ini sudah tua, tapi itu menuntun saya ke jalan yang salah, jadi saya pikir saya akan berkomentar untuk orang lain. Kolom Partisi harus berada di kunci Utama jika Anda ingin menggunakan kemampuan SWITCH dari fitur Partisi. Jika tidak di kunci utama Anda akan mendapatkan kesalahan ini: Partition columns for a unique index must be a subset of the index key.
Vaccano

Saya setuju dengan @Vaccano
san

3

Selain jawaban JNK, Anda mungkin harus membaca artikel ini yang membahas tentang menyelaraskan partisi tabel dan partisi indeks.

Ada banyak jenis skenario di mana skema partisi benar-benar mengikuti kolom pertama kunci primer - misalnya dalam skenario gudang data di mana tanggal snapshot dari tabel fakta biasanya kolom partisi serta kolom pertama di kunci utama.

Tetapi sama-sama, dalam lingkungan OLTP di mana PK adalah IDENTITAS atau kunci pengganti lainnya, tidak masuk akal untuk menggunakan ini untuk partisi, karena mempartisi pada nomor sewenang-wenang biasanya tidak terlalu berguna. Dalam sistem OLTP, Anda juga cenderung mempartisi berdasarkan tanggal (mungkin bukan di PK), tetapi berpotensi juga secara regional atau oleh beberapa jenis divisi organisasi (mungkin di PK jika Anda tidak menggunakan pengganti).

Tapi itu bukan keharusan.


Ya, banyak hal bukan keharusan. Bahkan pengindeksan bukanlah keharusan! Agar masuk akal secara fungsional, partisi harus dilakukan pada kolom utama kunci kandidat. Kalau tidak, bagaimana arsitek aplikasi akan menggunakan tabel?
srini.venigalla

@ srini.venigalla Itu adalah kasus umum, tetapi kasus umum lainnya (sama halnya?) adalah untuk mempartisi sesuatu yang sama sekali bukan bagian dari kunci primer atau kandidat - karena partisi sering digunakan untuk pengarsipan, tanggal kedaluwarsa dapat pilihan partisi yang bagus. Tetapi tidak ada yang menyiratkan yang mungkin menjadi bagian dari kunci. Partisi adalah fitur tingkat rendah yang cukup umum dan setidaknya ada dua pola penggunaan yang berbeda dan saling bertentangan di sini, keduanya memiliki praktik terbaik yang sah di sekitarnya.
Cade Roux

0

Itu harus menjadi bagian dari Kunci Kandidat jika bukan bagian dari kunci Primer itu sendiri. Sedang ide, partisi Anda harus menyelaraskan diri dengan kunci utama.

Jadi jawabannya adalah, ya, lebih disukai menjadi bagian dari PK. Jika bukan kunci lain, yang sama-sama cukup baik untuk menjadi seorang PK.


Belum pernah mendengar tentang Kandidat Kunci. Bagaimana cara menentukannya dalam pernyataan tabel Create / Alter?
AngryHacker

Kandidat Kunci hanyalah kunci lain yang memenuhi syarat untuk menjadi Kunci Utama. Misalnya, ID adalah kunci utama. Tetapi dalam tabel yang sama, jika kolom lain misalnya. PERSON_ID juga dapat mengidentifikasi satu baris secara unik, yang disebut Kunci Kandidat. Aturan normalisasi ke-2 dan ke-3 harus berlaku terhadap semua kunci kandidat juga.
srini.venigalla

Dimengerti. Bagaimana dengan bagian ke-2 dari pertanyaan saya?
AngryHacker

Sama seperti indeks lainnya. contoh: CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (BusinessEntityID);
srini.venigalla

4
Ini benar-benar salah. Anda dapat mempartisi pada banyak bidang yang tidak terkait dengan PK sama sekali, seperti OrderDate. Apakah Anda punya sesuatu untuk mendukung klaim Anda?
JNK
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.