Bu makalede, OpenQuery ve Four-Part Names kullanımlarına değineceğiz. Bu yöntemler uzak bir sunucudan veriye ihtiyaç duyulduğu durumlarda geçici bir şekilde bağlantı kurup veriyi almak amacıyla oluşturulmuştur.
OPENQUERY fonksiyonu, uzak bir sunucunun verilerine erişmek için geçici bir yöntemdir. Uzak sunucuyu sık sık sorguluyorsanız, bu fonksiyonu kullanmak yerine bağlantılı sunucuyu kullanmalı veya ETL adımları ile ilgili veriyi DWH’a aktarmalısınız.
OpenQuery syntax’ı aşağıdaki gibidir;
SELECT * FROM OPENQUERY (linkedServer, ‘Query’)
OpenQuery ile yazmış olduğunuz query tamamiyle uzak sunucuda çalıştırılırken, four-part names query ile LinkedServer tek tek çağırıldığında her bir statement için ayrı bir istek gönderilmeye çalışılıyor. Aşağıda OPENQUERY örneğimizin Query Execution Plan’ını görebilirsiniz;
Four-Part Names Query syntax’ı aşağıdaki gibidir;
select col1, col2, col3 from serverName.databaseName.ownerName.tableName a inner join serverName.databaseName.schemaName.tableName b ON a.col1 = b.col1 inner join serverName.databaseName.schemaName.tableName c ON a.col1 = c.col1 where col4 = something
Yukarıda görmüş olduğunuz query’de 3 ayrı linkedServer kullanımı mevcut. SQL Server bu query’i 3 parçaya bölerek ilgili serverda 3 ayrı query olarak çalıştırıyor. Bu da performans açısından OpenQuery’den daha yavaş kalmasına sebep oluyor. Query Execution Plan’ına baktığımızda sonuç şu şekilde;
Eğer Linked Server bağlantısı kurduğumuz SQL server ile query’i çalıştırdığımız server aynı karakter setine sahipse SP_SERVEROPTION “collation compatible” özelliğini ‘true’ yaparak ciddi bir hızlanma kazanabilirsiniz. Ancak eğer bu özellik ‘true’ değilse WHERE clause’unu uygulayabilmek adına LinkedServer’dan tüm tabloyu alıp getirmeye çalışıyor.
Yapmış olduğumuz örnek çalışmada ana sunucularda 8-10 saniye süren queryler, four-part names yöntemiyle saatlerce çalışmasına rağmen sonuç döndürmedi.
Add comment