跨數據庫查詢很慢
我在同一個 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 level
100 個(參見計劃:CardinalityEstimationModelVersion
=“ 70 ”,即使用舊的基數估計器)。您的好計劃是使用 SQL Server 2014 的新基數估計器生成的:
CardinalityEstimationModelVersion
=“ 120 ”您應該使用視圖文本更新您的問題,以找出估計出錯的確切謂詞,但是在您的慢速計劃基數中,低估了連接,
OMInternalOrganization
因此NL
在您看到Hash Join
的此表的快速計劃中選擇了連接,從這個開始加入慢速計劃顯示許多其他的Nested Loops
同時Hash Join
更好,它用於快速計劃。我不知道該數據庫保留在
compatibility level
100 中的原因是什麼,也許其他查詢使用舊的基數估計器執行得更好,所以我建議您使用本地查詢選項,而不是將該數據庫的全域更改兼容性級別更改為 120OPTION (QUERYTRACEON 2312)
:即使在那個“舊式”數據庫中也可以使用新的基數估計器。更多關於基數估計器的資訊:基數估計 (SQL Server)