Pertimbangan dan batasan tabel temporal

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru Azure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Saat Anda bekerja dengan tabel temporal, perhatikan pertimbangan dan keterbatasan berikut terkait sifat versi sistem:

  • Tabel temporal harus memiliki kunci utama yang didefinisikan, untuk mengkorelasikan catatan antara tabel saat ini dan tabel riwayat. Tabel riwayat tidak dapat memiliki kunci utama yang ditentukan.

  • Kolom periode SYSTEM_TIME yang digunakan untuk merekam nilai ValidFrom dan ValidTo harus didefinisikan dengan jenis data datetime2.

  • Sintaksis temporal berfungsi pada tabel atau tampilan yang disimpan secara lokal dalam database. Dengan objek jarak jauh seperti tabel di server tertaut, atau tabel eksternal, Anda tidak dapat menggunakan FOR klausa atau predikat periode secara langsung dalam kueri.

  • Jika nama tabel riwayat ditentukan selama pembuatan tabel riwayat, Anda harus menentukan skema dan nama tabel.

  • Secara default, tabel riwayat dikompresi PAGE .

  • Jika tabel saat ini dipartisi, tabel riwayat dibuat pada grup file default karena konfigurasi partisi tidak direplikasi secara otomatis dari tabel saat ini ke tabel riwayat.

  • Tabel temporal dan riwayat tidak dapat menggunakan FileTable atau FILESTREAM. FileTable dan FILESTREAM memungkinkan manipulasi data di luar SQL Server, sehingga penerapan versi sistem tidak dapat dijamin.

  • Tabel simpul atau tabel tepi tidak dapat dibuat menjadi atau diubah menjadi tabel temporal.

  • Sementara tabel temporal mendukung jenis data blob, seperti (n)varchar(max), varbinary(max), (n)teks, dan gambar, mereka dikenakan biaya penyimpanan yang signifikan dan memiliki implikasi performa karena ukurannya. Saat Anda merancang sistem, berhati-hatilah saat menggunakan tipe data ini.

  • Tabel riwayat harus dibuat dalam database yang sama dengan tabel saat ini. Kueri temporal melalui server tertaut tidak didukung.

  • Tabel riwayat tidak boleh memiliki batasan (kunci primer, kunci asing, tabel, atau batasan kolom).

  • Tampilan terindeks tidak didukung di atas kueri temporal (kueri yang menggunakan FOR SYSTEM_TIME klausa).

  • Opsi online (WITH (ONLINE = ON) tidak berpengaruh dalam ALTER TABLE ALTER COLUMN tabel temporal versi sistem. kolom ALTER tidak dilakukan secara online, apa pun nilai yang ditetapkan untuk opsi ONLINE.

  • Pernyataan INSERT dan UPDATE tidak dapat mereferensikan kolom periode SYSTEM_TIME. Upaya untuk menyisipkan nilai langsung ke dalam kolom ini diblokir.

  • TRUNCATE TABLE tidak didukung saat SYSTEM_VERSIONING adalah ON.

  • Modifikasi langsung data dalam tabel riwayat tidak diizinkan.

  • Untuk menghindari logika bahasa manipulasi data (DML) menjadi tidak valid, pemicu INSTEAD OF tidak diizinkan baik di tabel saat ini maupun di tabel riwayat. AFTER pemicu hanya diizinkan pada tabel saat ini. Pemicu ini diblokir pada tabel riwayat untuk menghindari pembatalan logika DML.

  • Penggunaan teknologi replikasi terbatas:

    • Kelompok ketersediaan: Didukung sepenuhnya

    • Penangkapan data perubahan dan pelacakan perubahan: Hanya didukung pada tabel saat ini

    • Replikasi rekam jepret dan transaksional: Hanya didukung untuk satu publisher tanpa temporal diaktifkan, dan satu subscriber dengan temporal diaktifkan. Penggunaan beberapa pelanggan tidak didukung karena dependensi pada jam sistem lokal, yang dapat menyebabkan data temporal yang tidak konsisten. Dalam kasus ini, publisher digunakan untuk beban kerja pemrosesan transaksi online (OLTP), sementara subscriber berfungsi untuk mengalihkan beban pelaporan (termasuk kueri AS OF). Ketika agen distribusi dijalankan, transaksi dibuka dan tetap terbuka hingga agen distribusi berhenti. ValidFrom dan ValidTo diisi dengan waktu mulai transaksi pertama yang dimulai oleh agen distribusi. Mungkin lebih baik menjalankan agen distribusi sesuai jadwal alih-alih menggunakan perilaku default yang menjalankannya secara terus-menerus, jika bagi aplikasi atau organisasi Anda penting agar ValidFrom dan ValidTo terisi dengan waktu yang mendekati waktu sistem saat ini. Untuk informasi selengkapnya, lihat Skenario penggunaan tabel Temporal.

    • Replikasi gabungan: Tidak didukung untuk tabel temporal

  • Kueri reguler hanya memengaruhi data dalam tabel saat ini. Untuk mengkueri data dalam tabel riwayat, Anda harus menggunakan kueri temporal. Untuk informasi selengkapnya, lihat Mengkueri data dalam tabel temporal versi sistem.

  • Strategi pengindeksan yang optimal mencakup indeks columnstore berkluster atau indeks rowstore B-tree pada tabel saat ini, serta indeks columnstore berkluster pada tabel riwayat, guna mengoptimalkan ukuran penyimpanan dan performa. Jika Anda membuat atau menggunakan tabel riwayat sendiri, buatlah jenis indeks ini yang terdiri dari kolom periode yang dimulai dengan kolom akhir periode. Indeks ini mempercepat kueri temporal dan kueri yang merupakan bagian dari pemeriksaan konsistensi data. Tabel riwayat default membuat indeks rowstore yang dikelompokkan berdasarkan kolom periode (akhir, mulai). Setidaknya, gunakan indeks rowstore yang tidak berklaster.

  • Objek/properti berikut ini tidak direplikasi dari tabel saat ini ke riwayat saat tabel riwayat dibuat:

    • Definisi periode
    • Definisi identitas
    • Indexes
    • Statistics
    • Periksa batasan
    • Pemicu
    • Konfigurasi pemartisian
    • Permissions
    • Predikat keamanan tingkat baris
  • Anda tidak dapat mengonfigurasi tabel riwayat sebagai tabel saat ini dalam rantai tabel riwayat.

Note

Dokumentasi biasanya menggunakan istilah pohon B ketika merujuk pada indeks. Dalam indeks rowstore, Mesin Database mengimplementasikan pohon B+. Ini tidak berlaku untuk indeks penyimpan kolom atau indeks pada tabel yang dioptimalkan memori. Untuk informasi selengkapnya, lihat panduan arsitektur dan desain indeks SQL Server dan Azure SQL.