Praktik Terbaik untuk Filter Baris Berbasis Waktu

Berlaku untuk:SQL Server

Pengguna aplikasi sering memerlukan subset data berbasis waktu dari tabel. Misalnya, tenaga penjualan mungkin memerlukan data untuk pesanan dalam seminggu terakhir, atau perencana peristiwa mungkin memerlukan data untuk peristiwa dalam minggu mendatang. Dalam banyak kasus, aplikasi menggunakan kueri yang berisi fungsi GETDATE() untuk mencapai hal ini. Pertimbangkan pernyataan filter baris berikut:

WHERE SalesPersonID = CONVERT(INT,HOST_NAME()) AND OrderDate >= (GETDATE()-6)  

Dengan filter jenis ini, biasanya diasumsikan bahwa dua hal selalu terjadi ketika Agen Penggabungan berjalan: baris yang memenuhi filter ini direplikasi ke Pelanggan; dan baris yang tidak lagi memenuhi filter ini dibersihkan di Pelanggan. (Untuk informasi selengkapnya tentang pemfilteran dengan HOST_NAME(), lihat Filter Baris Berparameter.) Namun, replikasi penggabungan hanya mereplikasi dan membersihkan data yang telah berubah sejak sinkronisasi terakhir, terlepas dari bagaimana Anda menentukan filter baris untuk data tersebut.

Agar replikasi penggabungan memproses baris, data dalam baris harus memenuhi filter baris, dan harus berubah sejak sinkronisasi terakhir. Dalam kasus tabel SalesOrderHeader , OrderDate dimasukkan saat baris disisipkan. Baris direplikasi ke Pelanggan seperti yang diharapkan karena sisipan adalah perubahan data. Namun, jika ada baris di Pelanggan yang tidak lagi memenuhi filter (baris tersebut untuk pesanan yang lebih lama dari tujuh hari), baris tersebut tidak dihapus dari Pelanggan kecuali diperbarui karena alasan lain.

Kasus perencana peristiwa lebih lanjut menyoroti masalah dengan jenis pemfilteran ini. Pertimbangkan filter berikut untuk tabel Peristiwa :

WHERE EventCoordID = CONVERT(INT,HOST_NAME()) AND EventDate <= (GETDATE()+6)  

Untuk tabel yang berisi peristiwa, sisipan mungkin dibuat jauh lebih awal dari tanggal peristiwa. Jika penyisipan untuk peristiwa dalam minggu mendatang dibuat sebulan yang lalu dan baris tidak diperbarui karena alasan lain, baris tidak direplikasi ke Pelanggan meskipun memenuhi filter baris.

Selain itu, tergantung pada bagaimana publikasi dikonfigurasi, replikasi penggabungan mengevaluasi filter pada waktu yang berbeda:

  • Jika publikasi menggunakan partisi yang telah dikomputasi sebelumnya (default), filter dievaluasi saat baris disisipkan atau diperbarui.

  • Jika publikasi tidak menggunakan partisi yang telah dikomputasi sebelumnya, filter dievaluasi saat Agen Penggabungan berjalan.

Untuk informasi selengkapnya tentang partisi yang telah dikomputasi sebelumnya, lihat Mengoptimalkan Performa Filter Berparameter dengan Partisi yang Telah Dikomputasi. Waktu di mana filter dievaluasi memengaruhi data apa yang memenuhi filter. Misalnya, jika publikasi menggunakan partisi yang telah dikomputasi sebelumnya, dan Anda menyinkronkan data setiap dua hari, subset data untuk tenaga penjual dapat menyertakan baris hingga dua hari lebih lama dari yang diharapkan.

Rekomendasi untuk Menggunakan Filter Baris Berbasis Waktu

Metode berikut memberikan pendekatan yang kuat dan mudah untuk pemfilteran berdasarkan waktu:

  • Tambahkan kolom ke tabel jenis data bit. Kolom ini digunakan untuk menunjukkan apakah baris harus direplikasi.

  • Gunakan filter baris yang mereferensikan kolom baru daripada kolom berbasis waktu.

  • Buat pekerjaan SQL Server Agent (atau pekerjaan yang dijadwalkan melalui mekanisme lain) yang memperbarui kolom sebelum Agen Penggabungan dijadwalkan untuk dijalankan.

Pendekatan ini mengatasi kekurangan penggunaan GETDATE() atau metode berbasis waktu lainnya dan menghindari masalah harus menentukan kapan filter dievaluasi untuk partisi. Pertimbangkan contoh tabel Peristiwa berikut:

EventID EventName EventCoordID EventDate Mereplikasi
1 Resepsi 112 2006-10-04 1
2 Makan malam 112 2006-10-10 0
3 Kelompok 112 2006-10-11 0
4 Pernikahan 112 2006-10-12 0

Filter baris untuk tabel ini kemudian akan terlihat seperti ini:

WHERE EventCoordID = CONVERT(INT,HOST_NAME()) AND Replicate = 1  

Pekerjaan SQL Server Agent dapat menjalankan pernyataan Transact-SQL yang mirip dengan yang berikut ini sebelum setiap Agen Penggabungan berjalan:

UPDATE Events SET Replicate = 0 WHERE Replicate = 1  
GO  
UPDATE Events SET Replicate = 1 WHERE EventDate <= GETDATE()+6  
GO  

Baris pertama mengatur ulang kolom Replikasi ke 0, dan baris kedua mengatur kolom ke 1 untuk peristiwa yang terjadi dalam tujuh hari ke depan. Jika pernyataan Transact-SQL ini berjalan pada 10/07/2006, tabel diperbarui ke:

EventID EventName EventCoordID EventDate Mereplikasi
1 Resepsi 112 2006-10-04 0
2 Makan malam 112 2006-10-10 1
3 Kelompok 112 2006-10-11 1
4 Pernikahan 112 2006-10-12 1

Peristiwa untuk minggu depan sekarang ditandai sebagai siap untuk direplikasi. Lain kali Agen Penggabungan berjalan untuk langganan yang digunakan koordinator peristiwa 112, baris 2, 3, dan 4 akan diunduh ke Pelanggan dan baris 1 akan dihapus dari Pelanggan.

Lihat Juga

GETDATE (Transact-SQL)
Menerapkan Pekerjaan
Filter Baris Berparameter