Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tutorial Partisi dan Partisi Tabel SQL Server

Masalah

Pada artikel ini, kita akan fokus pada demonstrasi partisi tabel. Penjelasan paling sederhana dari tabel partisi bisa disebut membagi tabel besar menjadi kecil. Topik ini memberikan skalabilitas dan pengelolaan.

Apa yang dimaksud dengan partisi tabel di SQL Server?

Asumsikan bahwa kita memiliki meja dan meja itu tumbuh dari hari ke hari. Dalam hal ini, tabel dapat menyebabkan beberapa masalah yang perlu diselesaikan dengan langkah-langkah yang ditentukan di bawah ini:

  • Pertahankan tabel ini. Ini akan memakan waktu lama dan menghabiskan lebih banyak sumber daya (CPU, IO, dll.).
  • Cadangkan.
  • Masalah kunci.

Karena alasan yang disebutkan di atas, kita membutuhkan partisi tabel. Pendekatan ini memiliki manfaat sebagai berikut:

  • Kemampuan manajemen:Jika kita memecah tabel, kita dapat mengatur setiap partisi tabel. Misalnya, kita hanya dapat membuat satu partisi tabel.
  • Kemampuan pengarsipan:Beberapa partisi tabel hanya digunakan untuk alasan ini. Kita tidak perlu mencadangkan partisi tabel ini. Kita dapat menggunakan cadangan filegroup dan mencadangkannya hanya dengan mengubah partisi tabel.
  • Kinerja kueri:Pengoptimal kueri SQL Server memutuskan untuk menggunakan penghapusan partisi. Ini berarti bahwa SQL Server tidak melakukan pencarian untuk partisi tabel yang tidak terkait.

Partisi Tabel Vertikal dan Horizontal di SQL Server

Partisi tabel adalah konsep umum. Ada beberapa jenis partisi yang berfungsi untuk kasus tertentu. Yang paling penting dan banyak digunakan adalah dua pendekatan:partisi vertikal dan partisi horizontal.

Kekhususan masing-masing jenis mencerminkan esensi tabel sebagai struktur yang terdiri dari kolom dan baris:

• Partisi Vertikal membagi tabel menjadi kolom.
• Partisi Horizontal membagi tabel menjadi beberapa baris.

Contoh paling umum dari partisi tabel vertikal adalah tabel karyawan dengan rincian mereka – nama, email, nomor telepon, alamat, ulang tahun, pekerjaan, gaji, dan semua informasi lain yang mungkin diperlukan. Sebagian dari data tersebut bersifat rahasia. Selain itu, dalam banyak kasus, operator hanya memerlukan beberapa data dasar seperti nama dan alamat email.

Partisi vertikal membuat beberapa tabel "sempit" dengan data yang diperlukan. Kueri hanya menargetkan bagian tertentu. Dengan cara ini, bisnis mengurangi beban, mempercepat tugas, dan memastikan bahwa data rahasia tidak akan terungkap.

Partisi tabel horizontal menghasilkan pemisahan satu tabel umum menjadi beberapa tabel yang lebih kecil, di mana setiap tabel partikel memiliki jumlah kolom yang sama, tetapi jumlah baris lebih sedikit. Ini adalah pendekatan standar untuk tabel yang berlebihan dengan data kronologis.

Misalnya, tabel dengan data sepanjang tahun dapat dibagi menjadi beberapa bagian yang lebih kecil untuk setiap bulan atau minggu. Kemudian, kueri hanya akan menyangkut satu tabel kecil tertentu. Partisi horizontal meningkatkan skalabilitas untuk volume data dengan pertumbuhannya. Tabel yang dipartisi akan tetap lebih kecil dan mudah diproses.

Setiap partisi tabel di SQL server harus dipertimbangkan dengan hati-hati. Terkadang Anda harus meminta data dari beberapa tabel yang dipartisi sekaligus, dan kemudian Anda memerlukan JOIN dalam kueri. Selain itu, partisi vertikal mungkin masih menghasilkan tabel besar, dan Anda harus membaginya lebih banyak. Dalam pekerjaan Anda, Anda harus mengandalkan keputusan untuk tujuan bisnis spesifik Anda.

Sekarang kita telah mengklarifikasi konsep partisi tabel di SQL Server, saatnya untuk melanjutkan ke demonstrasi.

Kami akan menghindari skrip T-SQL dan menangani semua langkah partisi tabel dengan wizard SQL Server Partitioning.

Apa yang Anda perlukan untuk membuat partisi database SQL?

  • Database Contoh WideWorldImporters
  • Edisi Pengembang SQL Server 2017

Gambar di bawah ini menunjukkan kepada kita bagaimana mendesain partisi tabel. Kami akan membuat partisi tabel berdasarkan tahun dan menemukan grup file yang berbeda.

Pada langkah ini, kita akan membuat dua filegroup (FG_2013, FG_2014). Klik kanan database lalu klik tab Filegroups.

Sekarang, kita akan menghubungkan grup file ke file pdf baru.

Struktur penyimpanan database kami siap untuk partisi tabel. Kami akan menemukan tabel yang ingin kami partisi dan memulai wizard Buat Partisi.

Pada tangkapan layar di bawah, kita akan memilih kolom tempat kita ingin menerapkan fungsi partisi. Kolom yang dipilih adalah “Tanggal Faktur”.

Pada dua layar berikutnya, kami akan memberi nama fungsi partisi dan skema partisi.

Fungsi partisi akan menentukan cara melakukan partisi untuk baris [Penjualan].[Faktur] berdasarkan kolom TanggalPembayaran.

Skema partisi akan menentukan peta untuk baris Sales.Invoices ke filegroups.

Tetapkan partisi ke grup file dan tetapkan batasannya.

Batas Kiri / Kanan mendefinisikan sisi dari setiap interval nilai batas yang mungkin kiri atau kanan. Kami akan menetapkan batasan seperti ini dan klik Perkirakan penyimpanan. Opsi ini memberi kami informasi tentang jumlah baris yang akan ditempatkan di perbatasan.

Dan terakhir, kita akan langsung memilih Run lalu klik Next.

Setelah operasi berhasil, klik Tutup.

Seperti yang Anda lihat, tabel Sales.Invoices kami telah dipartisi. Kueri ini akan menampilkan detail tabel yang dipartisi.

SELECT
  OBJECT_SCHEMA_NAME(pstats.object_id) AS SchemaName
  ,OBJECT_NAME(pstats.object_id) AS TableName
  ,ps.name AS PartitionSchemeName
  ,ds.name AS PartitionFilegroupName
  ,pf.name AS PartitionFunctionName
  ,CASE pf.boundary_value_on_right WHEN 0 THEN 'Range Left' ELSE 'Range Right' END AS PartitionFunctionRange
  ,CASE pf.boundary_value_on_right WHEN 0 THEN 'Upper Boundary' ELSE 'Lower Boundary' END AS PartitionBoundary
  ,prv.value AS PartitionBoundaryValue
  ,c.name AS PartitionKey
  ,CASE 
    WHEN pf.boundary_value_on_right = 0 
    THEN c.name + ' > ' + CAST(ISNULL(LAG(prv.value) OVER(PARTITION BY pstats.object_id ORDER BY pstats.object_id, pstats.partition_number), 'Infinity') AS VARCHAR(100)) + ' and ' + c.name + ' <= ' + CAST(ISNULL(prv.value, 'Infinity') AS VARCHAR(100)) 
    ELSE c.name + ' >= ' + CAST(ISNULL(prv.value, 'Infinity') AS VARCHAR(100))  + ' and ' + c.name + ' < ' + CAST(ISNULL(LEAD(prv.value) OVER(PARTITION BY pstats.object_id ORDER BY pstats.object_id, pstats.partition_number), 'Infinity') AS VARCHAR(100))
  END AS PartitionRange
  ,pstats.partition_number AS PartitionNumber
  ,pstats.row_count AS PartitionRowCount
  ,p.data_compression_desc AS DataCompression
FROM sys.dm_db_partition_stats AS pstats
INNER JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id
INNER JOIN sys.destination_data_spaces AS dds ON pstats.partition_number = dds.destination_id
INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id
INNER JOIN sys.partition_schemes AS ps ON dds.partition_scheme_id = ps.data_space_id
INNER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id
INNER JOIN sys.indexes AS i ON pstats.object_id = i.object_id AND pstats.index_id = i.index_id AND dds.partition_scheme_id = i.data_space_id AND i.type <= 1 /* Heap or Clustered Index */
INNER JOIN sys.index_columns AS ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id AND ic.partition_ordinal > 0
INNER JOIN sys.columns AS c ON pstats.object_id = c.object_id AND ic.column_id = c.column_id
LEFT JOIN sys.partition_range_values AS prv ON pf.function_id = prv.function_id AND pstats.partition_number = (CASE pf.boundary_value_on_right WHEN 0 THEN prv.boundary_id ELSE (prv.boundary_id+1) END)
WHERE pstats.object_id = OBJECT_ID('Sales.Invoices')
ORDER BY TableName, PartitionNumber;

MS Kinerja partisi SQL Server

Kami akan membandingkan kinerja tabel yang dipartisi dan tidak dipartisi untuk tabel yang sama. Untuk melakukannya, gunakan kueri di bawah ini dan aktifkan Sertakan Rencana Eksekusi Aktual.

DECLARE @Dt as date  = '20131231'
SELECT COUNT(InvoiceDate)
  FROM [Sales].[Invoices]
  where InvoiceDate < @Dt

Saat kami memeriksa rencana eksekusi, kami mengetahui bahwa itu termasuk properti "Dipartisi", "Jumlah Partisi Aktual", dan "Diakses Partisi Aktual".

Properti yang dipartisi menunjukkan bahwa tabel ini diaktifkan untuk partisi.

Jumlah Partisi Sebenarnya properti adalah jumlah total partisi yang dibaca oleh mesin SQL Server.

Aktual Diakses Dipartisi properti adalah nomor partisi yang dinilai oleh mesin SQL Server. SQL Server menghilangkan akses untuk partisi lain seperti yang disebut penghapusan partisi dan mendapatkan keuntungan pada kinerja kueri.

Sekarang, lihat rencana eksekusi tabel yang tidak dipartisi.

Perbedaan utama antara kedua rencana eksekusi ini adalah Jumlah Baris yang Dibaca karena properti ini menunjukkan berapa banyak baris yang dibaca untuk kueri ini. Seperti yang Anda lihat dari bagan kompresi di bawah, nilai tabel yang dipartisi terlalu rendah. Karena alasan ini, ia akan menggunakan IO yang rendah.

Selanjutnya, jalankan kueri dan periksa rencana eksekusi.

DECLARE @DtBeg as date  = '20140502'
DECLARE @DtEnd as date  = '20140701'

SELECT COUNT(InvoiceDate)
  FROM [Sales].[Invoices]
  where InvoiceDate between @DtBeg and @DtEnd

Eskalasi penguncian tingkat partisi

Eskalasi kunci adalah mekanisme yang digunakan oleh SQL Server Lock Manager. Ini mengatur untuk mengunci tingkat objek. Ketika jumlah baris yang akan dikunci bertambah, manajer kunci mengubah objek penguncian. Ini adalah tingkat hierarki eskalasi kunci “Baris -> Halaman -> Tabel -> Basis Data”. Tapi, di tabel yang dipartisi, kita bisa mengunci satu partisi karena meningkatkan konkurensi dan kinerja. Tingkat eskalasi kunci default adalah “TABLE” di SQL Server.

Jalankan kueri menggunakan pernyataan UPDATE di bawah ini.

BEGIN TRAN
DECLARE @Dt as date  = '20131221'
UPDATE [Sales].[Invoices] SET CreditNoteReason = 'xxx'   where InvoiceDate < @Dt
SP_LOCK

Kotak merah mendefinisikan kunci eksklusif yang memastikan bahwa beberapa pembaruan tidak dapat dilakukan ke sumber daya yang sama pada waktu yang sama. Itu terjadi di tabel Faktur.

Sekarang, kita akan mengatur mode eskalasi untuk tabel Sales.Invoices untuk mengotomatiskannya dan menjalankan kembali kueri.

ALTER TABLE Sales.Invoices SET (LOCK_ESCALATION = AUTO)

Sekarang, kotak merah mendefinisikan kunci eksklusif indentasi yang melindungi kunci eksklusif yang diminta atau diperoleh pada beberapa sumber daya yang lebih rendah dalam hierarki. Singkatnya, level kunci ini memungkinkan kita untuk memperbarui atau menghapus partisi tabel lainnya. Itu berarti kita dapat memulai pembaruan lain atau menyisipkan partisi tabel lainnya.

Dalam posting sebelumnya, kami juga mengeksplorasi masalah peralihan antara partisi tabel dan menyediakan panduannya. Informasi ini mungkin dapat membantu Anda jika Anda menangani kasus-kasus ini. Lihat artikel untuk informasi lebih lanjut.

Referensi

  1. Mode Kunci
  2. Tabel dan Indeks yang Dipartisi

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Inner Join Basics with Contoh

  2. Konversi 'datetime' menjadi 'smalldatetime' di SQL Server (Contoh T-SQL)

  3. SQL Query untuk mendapatkan hasil agregat dalam pemisah koma bersama dengan grup demi kolom di SQL Server

  4. SQL Server 2016:Simpan Hasil Kueri ke File CSV

  5. T-SQL:Memilih Kolom Berdasarkan MAX (Kolom Lainnya)