it-swarm.asia

Implikasi kinerja menggunakan OPENQUERY dalam suatu tampilan

Silakan lihat ini pertanyaan pada stackoverflow:

Saya menggunakan EasySoft ODBC driver untuk menautkan contoh SQL Server 2008 R2 Express ke Interbase dan saya mengalami beberapa kesulitan untuk mendapatkan metadata dari server jarak jauh. Dari mencari di internet sugesti utama semua menyebutkan menggunakan OPENQUERY alih-alih sintaks server empat bagian tertaut.

MISALNYA. Pendekatan saya (bermasalah) saat ini adalah ...

CREATE VIEW [LIVE].[vwPRDETS]
AS

SELECT *
FROM [LBLIVE]...[PRDETS] WITH (NOLOCK)

Tetapi pada beberapa tabel saya mendapatkan kesalahan saat memanggil tampilan ...

Msg 7353, Level 16, State 1, Line 1 OLE Penyedia DB "MSDASQL" untuk server tertaut "LBLIVE" menyediakan metadata yang tidak konsisten. Kolom tambahan disediakan selama eksekusi yang tidak ditemukan pada saat kompilasi waktu.

Juga, beberapa tampilan yang bahkan tidak dapat saya buat karena saya mendapatkan yang berikut ...

Msg 7315, Level 16, State 1, Line 1 The OLE Penyedia DB "MSDASQL" untuk server tertaut "LBLIVE" berisi beberapa tabel yang cocok dengan nama "" SYSDBA "." AUDIT_LBABKP "".

Meskipun hanya ada satu tabel yang disebutkan.

Pendekatan alternatif dari pencarian di internet tampaknya lebih seperti ...

SELECT *
FROM OPENQUERY(<linked sevrer>, 'SELECT <column list> FROM MyTable')

Jadi, pertanyaan saya adalah, jika saya menggunakan OPENQUERY dalam definisi saya, apakah SQL Server dapat mengoptimalkan SQL yang dihasilkan yang dikirim ke Interbase? Atau apakah benar-benar tidak banyak perbedaan antara kedua pendekatan tersebut?

Ini adalah subjek lintas dan akan menyukai POV dba.

15
Rich Andrews

Ringkasan

Biarkan server yang terhubung melakukan sebanyak mungkin.
Ini mustahil untuk SQL Server untuk mengoptimalkan kueri pada server yang ditautkan, bahkan SQL Server lain

Panjang

Faktor kuncinya adalah di mana kueri berjalan.

Dalam hal ini, ini adalah SELECT sepele sehingga semua baris dari tabel akan dikirim ke kawat. Itu tidak masalah.

Ketika Anda menambahkan GABUNG dan DI MANA maka itu bisa berarti. Anda ingin SQL Server mengizinkan server yang terhubung untuk melakukan sebanyak mungkin penyaringan untuk mengurangi ukuran data yang datang melalui jaringan.

Sebagai contoh, kasus ke-2 di sini harus lebih efisien.

SELECT *
FROM OPENQUERY(<linked server>, 
            'SELECT <column list> FROM MyTable') T1
     JOIN
     SomeLocalTable T2 ON ...
WHERE T1.foo = 'bar'

SELECT *
FROM OPENQUERY(<linked server>, 
           'SELECT <column list> FROM MyTable WHERE foo = ''bar''')
     JOIN
     SomeLocalTable T2 ON ...

Batasan OPENQUERY adalah bahwa Anda tidak dapat menentukan: jadi Anda perlu SQL dinamis untuk menambahkan klausa WHERE dll.

Kinerja server yang ditautkan dapat dipengaruhi oleh sp_serveroption . Pengaturan collation compatible Mengatakan itu semua

Jika opsi ini disetel ke true, SQL Server mengasumsikan bahwa semua karakter di server yang ditautkan kompatibel dengan server lokal, terkait dengan rangkaian karakter dan urutan susunan (atau urutan urutan). Ini memungkinkan SQL Server untuk mengirim perbandingan pada kolom karakter ke penyedia. Jika opsi ini tidak disetel, SQL Server selalu mengevaluasi perbandingan pada kolom karakter secara lokal.

Artinya, cobalah untuk tidak membiarkan SQL Server memproses data secara lokal.

Catatan: Pada foo = 'bar' Saya yang ke-2 contoh di atas, filter dikirim ke server yang ditautkan karena hanya string yang konstan ke SQL Server. Klausa WHERE yang sebenarnya dalam contoh pertama mungkin dikirim atau tidak.

Akhirnya, saya juga menemukan bahwa pementasan data ke tabel temp dan bergabung dengan itu ke tabel lokal seringkali lebih baik daripada bergabung langsung ke OPENQUERY.

20
gbn