[SQL SERVER]提高分散式查詢效能

[SQL SERVER]提高分散式查詢效能

一般只要使用分散式查詢就無法得到較佳執行計畫,

主要是因為無法取得分散式統計值所導致(權限不足),

最好的方式我個人認為還是把資料拉回本地資料庫,

這意味者你要先花一些時間來建置或開發同步遠端相關資料表(同步方法很多,這裡就不詳細討論了),

如果執意要使用分散式查詢並取得較佳執行計畫,BOL有提到一點

  • 若要在您使用連結伺服器上的資料表時建立最佳查詢計畫,查詢處理器必須擁有來自連結伺服器的資料分佈統計資料。對於資料表的任何資料行擁有有限權限的使用者可能沒有足夠的權限可以取得所有實用的統計資料,而且可能會收到比較沒效率的查詢計畫且效能較差。如果連結的伺服器是 SQL Server 的執行個體,使用者必須擁有資料表,或者使用者必須是連結伺服器上系統管理員 (sysadmin) 固定伺服器角色、db_owner 固定資料庫角色或 db_ddladmin 固定資料庫角色的成員,才能取得所有可用的統計資料。

看完之後覺得效能和安全之間只能擇一(人無時無刻都在抉擇阿~~哀),

我個人還是認為安全比效能來的重要,下面我簡單筆記一下。

 

我建立了2各LinkedServer,都是連到相同SQL Instance(SQL2008 R2)和DB

唯一不同就是TESTUSER使用一般使用者(data_reader role),

TESTSA使用sysadmin role

image

 

針對相同一句SQL執行分散式查詢

image

 

使用SA執行分散式查詢,因為有權限取得分散式統計值,所以實際和估計資料數目相同。

image

 

使用一般使用者執行分散式查詢,因為沒有權限取得分散式統計值,所以實際和估計資料數目約差20筆

image

 

由於我這例子不夠完善,所以看不出執行計畫的差異,

實際如果你透過分散式查詢很複雜TSQL(如join 多資料表和多where 條件)就可以看出更明顯差異。

 

 

 

參考

使用分散式查詢的指導方針

Linked servers: permissions and distributed query performance