Bagikan melalui


Tabel temporal versi sistem dengan tabel memori yang dioptimalkan

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

Tabel temporal versi sistem untuk tabel yang dioptimalkan memori memberikan solusi hemat biaya untuk skenario di mana audit data dan analisis titik waktu diperlukan di atas data yang dikumpulkan dengan beban kerja OLTP Dalam Memori.

Gambaran Umum

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 dipertahankan untuk jangka waktu yang lama (beberapa bulan, bahkan bertahun-tahun), meskipun tidak dikueri secara teratur.

Audit data dan analisis berbasis waktu dapat diminta di lingkungan yang berbeda, terutama dalam sistem OLTP yang memproses sejumlah besar permintaan 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 baca-saja yang diakses lebih jarang karena menjadi lebih lama, bukanlah solusi optimal.

Tabel temporal versi sistem untuk tabel yang dioptimalkan memori memberikan throughput transaksional tinggi, dan konkurensi bebas kunci. Mereka memberi Anda kemampuan untuk menyimpan sejumlah besar data riwayat dengan menggunakan tabel dalam memori untuk menyimpan data saat ini (tabel temporal), dan tabel berbasis disk untuk data historis. Efek pada operasi DML dikurangi dengan menggunakan tabel penahapan internal yang dioptimalkan memori otomatis yang menyimpan riwayat terbaru, dan memungkinkan DML dijalankan dari kode yang dikompilasi secara asli.

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 yang dioptimalkan memori tahan lama yang dapat di-versi sistem (DURABILITY = SCHEMA_AND_DATA).

  • Tabel riwayat untuk tabel versi sistem yang dioptimalkan memori harus berbasis disk, baik itu dibuat oleh pengguna akhir atau sistem.

  • Kueri yang hanya memengaruhi tabel dalam memori saat ini yang dapat digunakan dalam modul T-SQL yang dikompilasi secara asli. Kueri temporal menggunakan FOR SYSTEM TIME klausul tidak didukung dalam modul yang dikompilasi secara asli. Klausa FOR SYSTEM TIME ini didukung dengan tabel yang dioptimalkan memori dalam kueri ad hoc dan modul non-asli.

  • Dengan SYSTEM_VERSIONING = ON, tabel penahapan internal yang dioptimalkan memori secara otomatis dibuat untuk menerima perubahan versi sistem terbaru, yang merupakan hasil operasi pembaruan dan penghapusan pada tabel yang dioptimalkan memori saat ini.

  • Data dari tabel penahapan internal yang dioptimalkan memori secara teratur dipindahkan ke tabel riwayat berbasis disk oleh tugas flush data asinkron. Mekanisme flush data ini menjaga buffer memori internal kurang dari 10 persen dari konsumsi memori objek induknya. Anda dapat melacak total konsumsi memori tabel temporal versi sistem yang dioptimalkan memori dengan mengkueri sys.dm_db_xtp_memory_consumers, dan meringkas data untuk tabel penahapan internal yang dioptimalkan memori dan tabel temporal saat ini.

  • Anda dapat menjalankan flush data secara manual dengan menjalankan sp_xtp_flush_temporal_history.

  • Dengan SYSTEM_VERSIONING = OFF, atau ketika skema tabel versi sistem dimodifikasi dengan menambahkan, menghilangkan, atau mengubah kolom, seluruh konten buffer penahapan internal dipindahkan ke dalam tabel riwayat berbasis disk.

  • Kueri data historis secara efektif di bawah tingkat isolasi rekam jepret, dan selalu mengembalikan penyatuan antara buffer penahapan dalam memori dan tabel berbasis disk tanpa duplikat.

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

Tabel penahapan memori internal yang dioptimalkan

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

  • Nama tabel dihasilkan dalam format berikut: Memory_Optimized_History_Table_<object_id> di mana <object_id> adalah pengidentifikasi tabel temporal saat ini.

  • Tabel 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 yang dioptimalkan memori versi sistem dikurangi 8 byte karena kolom ekstra besar dalam tabel penahapan. Maksimum baru sekarang adalah 8.052 byte.

  • Tabel penahapan memori internal yang dioptimalkan tidak diwakili di Object Explorer dari SQL Server Management Studio.

  • Metadata tentang tabel ini, dan koneksinya dengan tabel temporal saat ini, dapat ditemukan di sys.internal_tables.

Tugas flush data

Flush data adalah tugas yang diaktifkan secara teratur yang memeriksa apakah tabel yang dioptimalkan memori memenuhi kondisi berbasis ukuran memori untuk pergerakan data. Pergerakan data dimulai ketika konsumsi memori tabel penahapan 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 yang berat, tugas berjalan sesering setiap 5 detik. Dengan beban kerja ringan, frekuensi naik ke setiap menit. Satu utas diluapkan untuk setiap tabel penahapan internal yang dioptimalkan memori yang membutuhkan 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.