2010-05-26 26 views
4

我有一個導入2個鏈接的服務器之間。我基本上需要將來自多重連接的數據放入我的表格中。性能的數據庫間查詢(鏈接的服務器之間)

當前查詢是這樣的:

select a.* 
from db1.dbo.tbl1 a 
     inner join db1.dbo.tbl2 on ... 
     inner join db1.dbo.tbl3 on ... 
     inner join db1.dbo.tbl4 on ... 
     inner join db2.dbo.myside on ... 

DB1 =鏈接服務器

DB2 =我自己的數據庫

這個之後,我使用的是INSERT INTO +選擇要添加這個數據在我的表中位於db2中。 (通常有幾百條記錄 - 這種導入每分鐘運行一次)

我的問題與性能有關。鏈接服務器上的表(tbl1,tbl2,tbl3,tbl4)是巨大的表,其中包含數百萬條記錄,並且會減慢導入過程。 有人告訴我,如果我在存儲過程中在「其他」一側(db1 - 鏈接服務器)上執行連接,則即使查詢看起來相同,也會運行得更快。是對的嗎?這有點難以測試。請注意,連接也包含我的數據庫中的表。

另外。有沒有其他的「技巧」,我可以使用,以使其運行更快?謝謝

回答

1

在db1上放置一個存儲過程以提高性能是正確的,這樣少了數據必須通過管道,因爲在連接中過濾了很多數據。

如果另一邊的數據是靜態的,爲什麼不把它放到物化視圖中?這樣你只需要每天更新一次數據,而不是每次執行查詢。

1

存儲過程被緩存,因此第一次運行存儲過程需要一些時間。所有對該存儲過程的進一步調用將會執行得更快。您可以通過將執行統計信息包含在SSMS中來查看性能影響。

要提高連接性能,請確保您有索引。

請注意,跨服務器插入是危險的,因爲您依賴於網絡。我也不確定你是否可以在這種情況下使用交易。如果不是,那是另一個問題。

我已經看到一個場景,臨時數據庫不能應付這樣一個插入,並修復是使用遊標。這是非常慢,但更可靠的情況。

2

這實際上取決於您的查詢實際上在做什麼。您可以使用連接上的「遠程」提示來強制連接發生在鏈接服務器上。即:

select a.* 
from db1.dbo.tbl1 a 
     inner remote join db1.dbo.tbl2 on ... 
     inner remote join db1.dbo.tbl3 on ... 
     inner remote join db1.dbo.tbl4 on ... 
     inner join db2.dbo.myside on ... 

(我假設你離開的服務器從上面的,所有的引用都是真的「linkedserver.db1」「DB1。」)

如果你能做到大部分工作只需鏈接服務器上的信息,您就可以使用OPENQUERY來加快速度。即:

select a.* 
from OPENQUERY(db1, 'SELECT a.* from db1.dbo.tbl1 a 
     inner join db1.dbo.tbl2 on ... 
     inner join db1.dbo.tbl3 on ... 
     inner join db1.dbo.tbl4 on ... ') a 
     inner join db2.dbo.myside on ... 

但加快它可以在具有鏈接服務器控制哪些返回上一個控制表的最佳方式,但同樣它取決於你的實際查詢,它在做什麼,什麼權限你在鏈接的服務器上。

相關問題