Tabel temporal versi sistem dengan tabel memori yang dioptimalkan

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru Azure SQL Managed Instance

Tabel temporal berversi sistem untuk tabel yang dioptimalkan memori menyediakan solusi yang hemat biaya untuk skenario yang memerlukan audit data dan analisis pada titik waktu tertentu terhadap data yang dikumpulkan dengan beban kerja OLTP dalam memori.

Note

Tabel temporal yang dioptimalkan memori hanya tersedia di SQL Server dan Azure SQL Managed Instance. Tabel yang dioptimalkan memori dan tabel temporal tersedia secara independen di Azure SQL Database.

Overview

Tabel temporal versi sistem secara otomatis menyimpan riwayat lengkap perubahan data, dan mengekspos ekstensi Transact-SQL yang nyaman untuk analisis titik waktu. Dalam skenario umum, riwayat data disimpan dalam waktu lama (beberapa bulan, bahkan bertahun-tahun), meskipun tidak rutin ditanyakan.

Audit data dan analisis berbasis waktu dapat diminta di berbagai lingkungan, terutama pada sistem OLTP yang memproses permintaan dalam jumlah sangat besar dan di mana teknologi OLTP dalam memori digunakan. Namun, menggunakan tabel memori yang dioptimalkan dalam skenario temporal sangat menantang karena sejumlah besar data historis yang dihasilkan biasanya melebihi batas RAM yang tersedia. Pada saat yang sama, menggunakan RAM untuk menyimpan data historis yang bersifat baca-saja, yang semakin jarang diakses seiring bertambah tuanya data tersebut, bukanlah solusi yang optimal.

Tabel temporal versi sistem untuk tabel yang dioptimalkan memori menyediakan throughput transaksi tinggi dan konkurensi tanpa kunci. Anda dapat menyimpan sejumlah besar data riwayat dengan menggunakan tabel dalam memori untuk menyimpan data saat ini (tabel temporal), dan tabel berbasis disk untuk data historis. Dampak pada operasi DML diminimalkan dengan menggunakan tabel penahapan internal yang dioptimalkan untuk memori dan dibuat secara otomatis, yang menyimpan riwayat terkini dan memungkinkan operasi DML dijalankan dari kode yang dikompilasi secara native.

Diagram berikut mengilustrasikan arsitektur ini.

Diagram arsitektur temporal dalam memori.

Detail implementasi

Saat Anda membuat tabel yang dioptimalkan memori versi sistem, ketahui pertimbangan berikut. Untuk opsi sintaks dan misalnya, lihat CREATE TABLE.

  • Hanya tabel teroptimasi memori yang persisten yang dapat diberi versi oleh sistem (DURABILITY = SCHEMA_AND_DATA).

  • Tabel riwayat untuk tabel versi sistem yang dioptimalkan untuk memori harus berbasis disk, baik Anda membuatnya maupun yang dibuat oleh sistem.

  • Anda dapat menggunakan query yang hanya memengaruhi tabel dalam memori saat ini dalam modul T-SQL yang dikompilasi secara native. Modul yang dikompilasi secara native tidak mendukung klausa ini FOR SYSTEM TIME , tetapi kueri ad hoc dan modul non-native dapat menggunakan klausa ini terhadap tabel yang dioptimalkan untuk memori.

  • Dengan SYSTEM_VERSIONING = ON, sistem secara otomatis membuat tabel staging internal yang dioptimalkan untuk memori untuk menerima perubahan versi sistem terbaru, yang dihasilkan dari operasi pembaruan dan penghapusan pada tabel yang dioptimalkan memori saat ini.

  • Tugas pengosongan data asinkron secara rutin memindahkan data dari tabel staging internal yang dioptimalkan untuk memori ke tabel riwayat berbasis disk. Mekanisme flush data ini menjaga buffer memori internal kurang dari 10 persen dari konsumsi memori objek induknya. Anda dapat melacak total konsumsi memori dari tabel temporal sistem versi yang dioptimalkan memori dengan melakukan kueri sys.dm_db_xtp_memory_consumers, dan merangkum data untuk tabel staging internal yang dioptimalkan memori dan tabel temporal saat ini.

  • Untuk melakukan proses flush data secara manual, jalankan sp_xtp_flush_temporal_history.

  • Dengan SYSTEM_VERSIONING = OFF, atau ketika Anda memodifikasi skema tabel versi sistem dengan menambah, menghapus, atau mengubah kolom, seluruh isi buffer staging internal dipindahkan ke dalam tabel riwayat berbasis disk.

  • Proses kueri data historis secara efektif berada pada level isolasi snapshot, dan selalu menghasilkan gabungan antara buffer staging dalam memori dan tabel berbasis disk tanpa duplikat.

  • ALTER TABLE operasi yang mengubah skema tabel secara internal harus melakukan data flush, yang dapat memperpanjang operasi.

Tabel penahapan memori internal yang dioptimalkan

Sistem membuat tabel staging internal yang dioptimalkan untuk memori guna mengoptimalkan operasi DML.

  • Nama tabel menggunakan format berikut: Memory_Optimized_History_Table_<object_id> di mana <object_id> adalah pengenal tabel temporal saat ini.

  • Tabel ini mereplikasi skema tabel temporal saat ini ditambah satu kolom bigint . Kolom tambahan ini menjamin keunikan baris yang dipindahkan ke buffer riwayat internal.

  • Kolom tambahan memiliki format nama berikut: Change_ID[<suffix>], di mana <suffix> secara opsional ditambahkan dalam kasus di mana tabel sudah memiliki Change_ID kolom.

  • Ukuran baris maksimum untuk tabel teroptimalkan memori berversi sistem dikurangi sebanyak 8 byte karena adanya kolom ekstra bigint di tabel staging. Maksimum sekarang adalah 8.052 byte.

  • Tabel staging internal yang dioptimalkan untuk memori tidak muncul di Object Explorer dari SQL Server Management Studio.

  • Anda dapat menemukan metadata tentang tabel ini, dan hubungannya dengan tabel temporal saat ini, di sys.internal_tables.

Tugas pengosongan data

Tugas pengosongan data berjalan secara berkala, dan memeriksa apakah ada tabel yang dioptimalkan untuk memori yang memenuhi kondisi berdasarkan ukuran memori untuk pemindahan data. Pergerakan data dimulai ketika konsumsi memori tabel staging internal mencapai delapan persen dari konsumsi memori tabel temporal saat ini.

Tugas flush data diaktifkan secara teratur dengan jadwal yang bervariasi berdasarkan beban kerja yang ada. Dengan beban kerja tinggi, tugas dapat berjalan setiap 5 detik. Dengan beban kerja ringan, frekuensi naik ke setiap menit. Satu thread dibuat untuk setiap tabel staging internal yang dioptimalkan untuk memori dan memerlukan pembersihan.

Flush data menghapus semua rekaman dari buffer internal dalam memori yang lebih lama dari transaksi terlama yang saat ini berjalan untuk memindahkan rekaman ini ke tabel riwayat berbasis disk.

Anda dapat menjalankan flush data dengan menjalankan sp_xtp_flush_temporal_history dan menentukan skema dan nama tabel:

EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;

Proses pergerakan data yang sama dipanggil seperti ketika sistem menjalankan tugas flush data pada jadwal internalnya.