Dalam contoh pertama Anda menggunakan notasi "titik", mesin kursor klien digunakan dan sebagian besar hal dievaluasi secara lokal. Jika Anda memilih dari tabel besar dan menggunakan klausa WHERE, catatan akan ditarik ke bawah secara lokal dari db jarak jauh. Setelah data ditarik melintasi server yang ditautkan, baru kemudian klausa WHERE diterapkan secara lokal. Seringkali urutan ini adalah hit kinerja. Indeks pada db jarak jauh pada dasarnya dianggap tidak berguna.
Bergantian ketika Anda menggunakan OPENQUERY, SQL Server mengirimkan pernyataan sql ke database target untuk diproses. Selama pemrosesan, indeks apa pun pada tabel diungkit. Juga klausa where diterapkan di sisi Oracle sebelum mengirim hasil kembali ke SQL Server.
Dalam pengalaman saya, kecuali untuk kueri yang paling sederhana, OPENQUERY akan memberi Anda kinerja yang lebih baik.
Saya akan merekomendasikan menggunakan OpenQuery untuk semuanya karena alasan di atas.
Salah satu poin kesulitan saat menggunakan OpenQuery yang mungkin sudah Anda temui adalah tanda kutip tunggal. Jika string sql yang dikirim ke db jarak jauh memerlukan tanda kutip tunggal di sekitar string atau tanggal tanggal, mereka harus diloloskan. Jika tidak, mereka secara tidak sengaja menghentikan string sql.
Berikut adalah templat yang saya gunakan setiap kali saya berurusan dengan variabel dalam pernyataan openquery ke server tertaut untuk menangani masalah kutipan tunggal:
DECLARE @UniqueId int
, @sql varchar(500)
, @linkedserver varchar(30)
, @statement varchar(600)
SET @UniqueId = 2
SET @linkedserver = 'LINKSERV'
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL'
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '
SET @Statement = @Statement + '''' + @SQL + ''')'
EXEC(@Statement)