我有一個奇怪的情況。我們有一個帶有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提出的。
如果它確實是一個權限問題與得到的統計數據,我寫了一篇博客文章如何讓周圍無需任何上述權限(有很多的文章中警告,雖然) 。 http://www.spartansql.com/2012/10/cardinality-estimates-over-linked-server.html –
@BenThul偉大的文章!我不知道你可以用這種方式繞過燙髮。感謝分享。 – Jon