Sql-Server

連接表的大記憶體授予

  • November 19, 2021

當我從兩個連接表中選擇列時,會獲得巨大的記憶體授權 (529808)。如果我分別查詢每個表列,它的組合記憶體授予僅為 8008。

為什麼列的組合列表具有如此大的記憶體授予?或者我可以採取哪些步驟來找出答案?

SELECT *記憶體授予為 529808: 在此處輸入圖像描述


僅查詢第一個表中的列的記憶體授予為 6152: 在此處輸入圖像描述


僅查詢另一個表中的列的記憶體授予為 1856 在此處輸入圖像描述

記憶山羊

您的第一個帶有合併連接的查詢計劃中有一個排序來支持該操作。合併連接需要有序數據,並且您只有來自內部表的索引排序數據。

外部表的索引在索引鍵的有用位置沒有連接鍵,因此排序。

當 you 時SELECT *,您將按*存在的任何排序元素進行排序。這是數據操作的大小,您需要為暫存空間提供記憶體授權以適應它。

在另一個合併連接查詢中,您的排序操作將只發生在連接列上,這將比*您的第一個範例中需要的記憶體空間少得多。

隨意將滑鼠懸停在排序運算符上以驗證輸出和按列排序。

雜湊連接查詢沒有排序,但是雜湊連接需要一些記憶體(只是更少,因為雜湊通常不是排序方式的數據大小)來建構雜湊表。

雖然沒有提到,但值得注意的是並行性不會導致記憶體授權增加 DOP

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