Melih Kavraz - Azure Synapse Analytics, SQL Server

OpenQuery vs Four-Part Names

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.

Melih Kavraz

Add comment

Sosyal kanallar üzerinden benimle iletişime geçebilirsiniz.