2017-04-06 17 views
0

我有一個奇怪的情況。我們有一個帶有Prod端和Dev端的AS400(同一臺機器,2個NIC卡)從一個生產SQL Server中,我們運行一個來自使用鏈接服務器的MS-SQL服務器的查詢,我將其稱爲'as400'查詢確實有3個連接,執行計劃看起來大致類似於[遠程查詢] =>獲得結果。它執行遠程服務器上的連接(Production AS400)這將在不超過0:00:02(2秒)內執行。其中一個連接表有391萬行。它拉動100行 - 與另一張桌子相連。現在鏈接服務器的陌生性 - 來自加入的性能

,這樣會很奇怪。在同一臺機器的Dev側,運行在不同的SQL Server上,進入另一個NIC卡,使用不同的數據庫(開發人員)執行相同的查詢,執行計劃完全不同!它是:

[查詢1]哈希匹配(內部連接)與[QUERY2]與[QUERY3]與[Query4]

期待每個查詢返回10,000行(我敢肯定,Hash哈希值,這只是使用它作爲猜測,因爲它不知道實際的行,因爲它是遠程的)。看起來要做的是在query2上重新獲得3.91億行,並且在放棄並終止查詢之前,它需要> 23個小時。 (SSMS中運行)

顯然,MS SQL Server在作出決定不通過該關閉的AS400作爲一個單一的查詢。爲什麼?

我可以通過使用OpenQuery(as400,cmd)來解決問題,但它會打開我們到SQL注入,不能對查詢進行簡單的語法檢查,喜歡。使用OpenQuery執行查詢需要6秒鐘,並返回正確的數據。

如果我們通過重寫我們在生產中使用的所有(工作,快速)查詢來解決這個問題,那麼它們也可以針對開發運行 - 它涉及很多努力,並且在實際生產中存在不利因素。

我嘗試使用基於連接的「遠程」的提示,但不被AS400 :-(

試圖尋找在配置/支持的SQL Server的版本,並且似乎沒有(SQL Server幾乎是相同的版本/相同,10.50.6000爲一個工作,10.50.6220爲一個失敗(較新),10.50.6000爲另一個失敗)

任何線索有人想知道,我們有好幾個人在看這個幾個星期 - 包括數據庫架構師,IBM AS400大師和我。(到目前爲止,我的OpenQuery是唯一已經工作的)

另一點,在MS服務器似乎從沒有工作(而查詢23小時運行)的機器開到AS400每秒連接5 - 我不明白,我不是100%確定它與這個問題有關,但它是由AS400提出的。

回答

0

我鄙視鏈接服務器因爲這個原因(以及許多其他)。我一直使用openquery()和使用sp_executesql來幫助防止SQL注入。

還有就是這個在這裏提到:including parameters in OPENQUERY

0

沒有看到查詢和執行計劃聽起來就像遠程訪問服務器上的統計信息時,這是權限的問題。對於查詢引擎,以充分利用所有可用的統計數據,並正確地構建一個計劃,確保用於連接到鏈接服務器的數據庫用戶鏈接服務器上執行下列操作之一:

  1. 的所有者表(s)。
  2. sysadmin固定SERVER角色的成員。
  3. db_owner固定DATABASE角色的成員。
  4. db_ddladmin固定DATABASE角色的成員。

要檢查你使用連接到鏈接服務器使用對象資源管理器是什麼數據庫用戶...

展開服務器\實例>服務器對象>鏈接服務器>右鍵點擊您的鏈接的服務器,然後選擇屬性,然後轉到安全頁面。

如果您沒有將登錄映射到頂部(我不會建議),然後選擇底部的最後一個單選按鈕,使用特定的安全上下文進行連接,並輸入適當的數據庫的用戶名和密碼用戶。而不是使用'sa'在上面的#2或#3的鏈接服務器上創建一個新的db用戶並使用它。然後每次使用鏈接的服務器時,它都將連接到必要的權限。

查看以下文章以獲取更多詳細信息。希望這可以幫助!

http://www.benjaminnevarez.com/2011/05/optimizer-statistics-on-linked-servers/

+0

如果它確實是一個權限問題與得到的統計數據,我寫了一篇博客文章如何讓周圍無需任何上述權限(有很多的文章中警告,雖然) 。 http://www.spartansql.com/2012/10/cardinality-estimates-over-linked-server.html –

+0

@BenThul偉大的文章!我不知道你可以用這種方式繞過燙髮。感謝分享。 – Jon