Saya akan berpikir bahwa ini akan menjadi pertanyaan yang cukup sederhana, tetapi saya sebenarnya mengalami kesulitan menemukan jawaban untuk ini.
Pertanyaannya: Bisakah Anda memindahkan baris data dalam tabel yang dipartisi dari satu partisi ke partisi lain hanya dengan memperbarui kolom partisi sehingga melewati batas partisi?
Misalnya, jika saya memiliki tabel yang memiliki kunci partisi:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Dengan fungsi partisi yang memetakan ke kunci utama:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Bisakah saya memindahkan baris dari partisi pertama ke partisi ketiga dengan mengubah SampleID dari 1 menjadi (katakanlah) 500.000?
Catatan: Saya menandai ini sebagai sql server 2005 dan 2008, karena keduanya mendukung partisi. Apakah mereka menanganinya secara berbeda?
$PARTITION
hanya menghitung nomor partisi berdasarkan input; itu tidak benar-benar menguji di mana barisan secara fisik hidup.Untuk menguji ini, percobaan sebenarnya perlu mempartisi tabel. Lihat http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
Meminta fungsi partisi hanya memberi tahu Anda apa yang dikatakan fungsi partisi. Tidak disebutkan di mana data disimpan. Anda dapat mengatur fungsi partisi dan menjalankannya tanpa benar-benar mempartisi tabel, seperti yang telah ditunjukkan di sini.
Untuk mempartisi tabel, Anda juga harus membuat grup file dan skema partisi yang menggunakan fungsi partisi untuk menetapkan hasil fungsi ke grup file. Maka Anda harus meletakkan kunci berkerumun di tabel yang menggunakan skema partisi itu.
Siapkan partisi
Saya bukan ahli dalam baris perintah SQL. Saya menggunakan antarmuka SSMS untuk mengatur grup file pfg1 (dengan file pf1) dan pfg2 (dengan file pf2). Lalu saya mendeklarasikan fungsi dan skema partisi:
Buat tabel dan indeks berkerumun
Setelah Anda melakukan ini, ketika Anda kueri sys.partitions (I have 2005), Anda melihat bahwa tabel sekarang memiliki dua partisi bukan hanya satu untuk tabel. Ini menunjukkan bahwa kami telah mengimplementasikan partisi sepenuhnya untuk tabel ini.
Sekarang kami memiliki dua partisi (dengan jumlah baris untuk masing-masing), kami dapat melakukan percobaan.
Masukkan baris
Periksa partisi sys.art untuk melihat apa yang terjadi.
Ya. Satu baris di setiap partisi.
Pindahkan satu baris.
Periksa partisi
Partisi pertama sekarang memiliki dua baris, bukan 1, dan partisi kedua memiliki nol baris, bukan dua.
Saya pikir ini menegaskan bahwa baris secara otomatis dipindahkan sebagai hasil dari memodifikasi kunci yang dikelompokkan dalam tabel dipartisi.
sumber
Saya kira jawabannya tidak benar. Ketika Anda menggunakan nilai
Anda hanya menghitung ulang apa yang seharusnya menjadi partisi, bukan di mana catatan saat ini.
Kamu harus menggunakan:
Dalam pengujian saya pada sql 2005 nilai berubah tetapi catatan tetap di partisi yang sama. Ini mungkin akan mengacaukan statistik dan optimizer karena akan berjalan dalam mode multi-threaded mengharapkan partisi berada dalam kisaran tertentu. Ini juga akan sepenuhnya salah ketika mencoba menggunakan penghapusan partisi untuk hanya menanyakan partisi yang relevan. Saya pikir Anda perlu menghapus dan memasukkan kembali setiap catatan untuk membuatnya dipindahkan.
sumber
$partition
di sini menunjukkan bahwa jawaban yang diterima benar. Bagaimana Anda mengonfirmasi bahwa rekaman tetap berada di partisi yang sama setelah diperbarui?