System-Versioned Tabel Temporal dengan Tabel Memory-Optimized

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

Tabel temporal versi sistem untuk Tabel yang Dioptimalkan Memori dirancang untuk memberikan solusi hemat biaya untuk skenario di mana audit data dan analisis titik waktu diperlukan di atas data yang dikumpulkan dengan beban kerja OLTP In-Memory. Mereka menyediakan throughput transaksional tinggi, konkurensi bebas kunci dan pada saat yang sama, kemampuan untuk menyimpan sejumlah besar data riwayat yang dapat dengan mudah dikueri.

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 sangat lama (beberapa bulan, bahkan 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 In-Memory digunakan. Namun, menggunakan tabel yang dioptimalkan memori dalam skenario temporal sangat menantang karena sejumlah besar data historis yang dihasilkan biasanya melebihi batas memori 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 yang optimal.

Tabel temporal versi sistem untuk tabel yang dioptimalkan memori menyediakan throughput transaksional tinggi, konkurensi bebas kunci dan pada saat yang sama, 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. Dampak pada operasi DML di minimalisasi melalui penggunaan tabel penahapan internal yang dioptimalkan memori yang dihasilkan secara otomatis yang menyimpan riwayat terbaru dan memungkinkan DLL dijalankan dari kode yang dikompilasi secara asli.

Diagram berikut mengilustrasikan arsitektur ini. Arsitektur Temporal In-Memory Arsitektur

Detail Implementasi

Fakta berikut tentang tabel temporal versi sistem dengan tabel memori yang dioptimalkan adalah pertimbangan yang perlu Anda ketahui saat membuat tabel yang dioptimalkan memori versi sistem. Untuk opsi sintaks dan misalnya, lihat CREATE TABLE (Transact-SQL).

  • Hanya tabel yang dioptimalkan memori tahan lama yang dapat diberi versi sistem (DURABILITAS = SCHEMA_AND_DATA).
  • Tabel riwayat untuk tabel versi sistem yang dioptimalkan memori harus berbasis disk, terlepas dari apakah tabel tersebut dibuat oleh pengguna akhir atau sistem.
  • Kueri yang hanya memengaruhi tabel saat ini (dalam memori) yang dapat digunakan dalam modul T-SQL yang dikompilasi secara asli. Kueri temporal yang menggunakan klausul FOR SYSTEM TIME tidak didukung dalam modul yang dikompilasi secara asli. Penggunaan klausa FOR SYSTEM TIME dengan tabel yang dioptimalkan memori dalam kueri ad hoc dan modul non-asli didukung.
  • Ketika SYSTEM_VERSIONING = AKTIF, tabel penahapan memori internal yang dioptimalkan secara otomatis dibuat untuk menerima perubahan versi sistem terbaru yang merupakan hasil operasi pembaruan dan penghapusan pada tabel saat ini yang dioptimalkan memori.
  • Data dari tabel penahapan memori internal yang dioptimalkan secara teratur dipindahkan ke tabel riwayat berbasis disk oleh tugas flush data asinkron. Mekanisme flush data ini memiliki tujuan untuk menjaga buffer memori internal kurang dari 10% 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 (Transact-SQL) dan meringkas data untuk tabel penahapan internal yang dioptimalkan memori dan tabel temporal saat ini.
  • Anda dapat memberlakukan flush data dengan memanggil sp_xtp_flush_temporal_history.
  • Saat SYSTEM_VERSIONING = NONAKTIF atau ketika skema tabel versi sistem dimodifikasi dengan menambahkan, menghilangkan, atau mengubah kolom, seluruh konten buffer penahapan internal dipindahkan ke tabel riwayat berbasis disk.
  • Kueri data historis secara efektif di bawah tingkat isolasi SNAPSHOT dan selalu mengembalikan gabungan antara buffer penahapan dalam memori dan tabel berbasis disk tanpa duplikat.
  • OPERASI ALTER TABLE yang mengubah skema tabel secara internal harus melakukan flush data, yang dapat memperpanjang durasi operasi.

Tabel Penahapan Memory-Optimized Internal

Tabel penahapan memori internal yang dioptimalkan adalah objek internal yang dibuat oleh sistem 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[_< akhiran>], di mana _<akhiran> ditambahkan secara opsional dalam kasus di mana tabel sudah memiliki kolom Change_ID .
  • Ukuran baris maksimum untuk tabel yang dioptimalkan memori versi sistem dikurangi 8 byte karena kolom BIGINT tambahan dalam tabel penahapan. Maksimum baru sekarang adalah 8052 byte.
  • Tabel penahapan memori internal yang dioptimalkan tidak diwakili dalam Object Explorer SQL Server Management Studio.
  • Metadata tentang tabel ini serta koneksinya dengan tabel temporal saat ini dapat ditemukan di sys.internal_tables (Transact-SQL).

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 8% 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, sesering setiap 5 detik, dan dengan beban kerja ringan, jarang setiap 1 menit. Satu utas diluaskan untuk setiap tabel penahapan internal yang dioptimalkan memori yang perlu dibersihkan.

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 menerapkan flush data dengan memanggil sp_xtp_flush_temporal_history dan menentukan skema dan nama tabel: sys.sp_xtp_flush_temporal_history @schema_name, @object_name. Dengan perintah yang dijalankan pengguna ini, proses pergerakan data yang sama dipanggil seperti ketika tugas flush data dipanggil oleh sistem pada jadwal internal.

Lihat juga