Sql-Server

跨數據庫查詢很慢

  • February 3, 2018

我在同一個 SQL 伺服器上有兩個數據庫/目錄,並且一個 SQL 使用者可以訪問它們。

Database01 上的排序規則是 Danish_Norwegian_CI_AS

Database02 上的排序規則是 SQL_Latin1_General_CP1_CI_AS

我需要在“Database02”上查詢兩個視圖。查詢基本上是

SELECT * FROM View01 -- (resulting in 43 rows)
SELECT * FROM View02 -- (resulting in 2000 rows)

這兩個視圖相當複雜(至少可以說),我無權更改它們。

如果我登錄 SQL 伺服器並將“Database02”指定為“預設目錄”,則查詢分別在“0.001”和 30 秒內響應。

但是,如果我登錄 SQL Server 並將“Database01”指定為“預設目錄”,則第一個查詢在 30 秒內執行,而第二個查詢在 600 秒後超時。

在 Database01 上執行的查詢將類似於

SELECT * FROM Database02.View01
SELECT * FROM Database02.View02

誰能解釋一下這種行為?我不想在數據庫之間進行任何連接,所以我不認為不同的排序規則會成為問題。

慢查詢:https ://www.brentozar.com/pastetheplan/?id=BJgyIUhrG

快速查詢:https ://www.brentozar.com/pastetheplan/?id=S1-BUIhSG

PARAMETERIZATION在兩個數據庫上都是“簡單的”。

我查看了您的計劃並找到了造成這種差異的原因:

你會在數據庫中得到一個緩慢的計劃,有compatibility level100 個(參見計劃:CardinalityEstimationModelVersion=“ 70 ”,即使用舊的基數估計器)。

您的好計劃是使用 SQL Server 2014 的新基數估計器生成的:CardinalityEstimationModelVersion=“ 120

您應該使用視圖文本更新您的問題,以找出估計出錯的確切謂詞,但是在您的慢速計劃基數中,低估了連接,OMInternalOrganization因此NL在您看到Hash Join的此表的快速計劃中選擇了連接,從這個開始加入慢速計劃顯示許多其他的Nested Loops同時Hash Join更好,它用於快速計劃。

我不知道該數據庫保留在compatibility level100 中的原因是什麼,也許其他查詢使用舊的基數估計器執行得更好,所以我建議您使用本地查詢選項,而不是將該數據庫的全域更改兼容性級別更改為 120 OPTION (QUERYTRACEON 2312):即使在那個“舊式”數據庫中也可以使用新的基數估計器。

更多關於基數估計器的資訊:基數估計 (SQL Server)

在這裡:使用 SQL Server 2014 基數估計器優化您的查詢計劃

引用自:https://dba.stackexchange.com/questions/196314