SQL Server執行SQL語句時內存占用特點[4]

發表于:2008-07-15來源:作者:點擊數: 標簽:sqlSqlSQLSERVER語句
在兩個表都有聚集索引情況下,邏輯讀最小,每個表只有2到3次。而且只有實際需要輸出的數據才會被讀入內存頁。兩個表都有非聚集索引情況下,消耗的邏輯讀和內存資源近似。 測試5:執行Merge Join 5.1 執行全表選取或者低選擇性選取 執行 SQL : 以下是引用片段
在兩個表都有聚集索引情況下,邏輯讀最小,每個表只有2到3次。而且只有實際需要輸出的數據才會被讀入內存頁。兩個表都有非聚集索引情況下,消耗的邏輯讀和內存資源近似。

  測試5:執行Merge Join

  5.1 執行全表選取或者低選擇性選取

  執行SQL:

以下是引用片段:
 Select * From P_Order A
  Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo

  如果兩張表都沒有任何索引,則兩張表都要進行全表掃描。所有的數據都要讀入內存頁。

  邏輯讀數近似等于兩張表的數據頁總和。SQL Server處理過程中將使用到臨時表。

  只有一張表有聚集索引的情形類似,SQL Server處理過程中將使用到臨時表。并且讀入所有的數據頁到內存。

  如果兩張表都有聚集索引,盡管兩表的數據都會被讀入內存頁,但邏輯讀數已經大大減少,等于其中一張表總數據內存頁數加上最終輸出的數據頁數。而且SQL Server處理過程中將不需要再使用臨時表。

  5.2 執行高選擇性選取

  對于這樣的高選擇性SQL語句,SQL Server 將提示無法生成執行計劃。

以下是引用片段:
Select * From P_Order A
  Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo
  Where A.MobileNo=28913

  但可以執行:

以下是引用片段:
 Select * From P_Order A
  Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo
  Where A.MobileNo<=28001 (注:最終結果只有2條)

  這樣的屬于低選擇性語句,但最終結果也很少的語句。如前面所述,這種情況下,采.netsted loop聯接效率可能更高。

  4.2 執行高選擇性選取

  執行如下的SQL語句:

以下是引用片段:
 Select * From P_Order A
  Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo
  Where A.MobileNo=28913

  在兩個表都沒有任何索引情況下,兩張表都將執行全表掃描。要讀入所有的數據頁到內存??傮w邏輯讀取決于兩表的數據頁數。

  在一個表有聚集索引或者非聚集索引情況下,該表將執行Index Seek,另一個表將出現全表掃描。內存數據緩沖區中,將有一張表只讀入最終數據所在的數據頁、一張表讀入全部數據頁。邏輯讀數取決于表在聯接中的秩序、以及無索引表的數據頁數。

  在兩個表都有聚集索引情況下,邏輯讀最小,每個表只有2到3次。而且只有實際需要輸出的數據才會被讀入內存頁。兩個表都有非聚集索引情況下,消耗的邏輯讀和內存資源近似。

  測試5:執行Merge Join

  5.1 執行全表選取或者低選擇性選取

  執行SQL:

以下是引用片段:
 Select * From P_Order A
  Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo

  如果兩張表都沒有任何索引,則兩張表都要進行全表掃描。所有的數據都要讀入內存頁。

  邏輯讀數近似等于兩張表的數據頁總和。SQL Server處理過程中將使用到臨時表。

  只有一張表有聚集索引的情形類似,SQL Server處理過程中將使用到臨時表。并且讀入所有的數據頁到內存。

  如果兩張表都有聚集索引,盡管兩表的數據都會被讀入內存頁,但邏輯讀數已經大大減少,等于其中一張表總數據內存頁數加上最終輸出的數據頁數。而且SQL Server處理過程中將不需要再使用臨時表。

  5.2 執行高選擇性選取

  對于這樣的高選擇性SQL語句,SQL Server 將提示無法生成執行計劃。

以下是引用片段:
Select * From P_Order A
  Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo
  Where A.MobileNo=28913

  但可以執行:

以下是引用片段:
 Select * From P_Order A
  Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo
  Where A.MobileNo<=28001 (注:最終結果只有2條)

  這樣的屬于低選擇性語句,但最終結果也很少的語句。如前面所述,這種情況下,采用netsted loop聯接效率可能更高。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97