原文:
詳解索引連線型別
sql server有3種連線型別:
在許多影響小的行集的簡單查詢中,巢狀迴圈連線遠遠優於hash和合併連線。用於查詢的連線型別由優化器動態決定。
下面我來先來建立兩張簡單的表。province(十條資料)=》persontenthousand(1萬資料),省份和人的關係,一對多,外來鍵相連;
為了理解雜湊連線,在這個連線中persontenthousand在連線列pid上沒有任何索引,先來看看如下查詢:
可以看到,優化器在兩個表之間使用了hash連線。這種情況經常出現於下表(大表)較大,並且下表(大表)的連線列上沒有索引。
hash連線使用兩個連線輸入-建立輸入和探查輸入。建立輸入是執行計畫中上面的那個輸入(小表),探查輸入是下面那個輸入(大表)。兩個輸入中較小的乙個作為建立輸入。
hash連線的執行分為兩個階段:建立階段和探查階段。在最常用的hash連線方式-記憶體中的hash連線中,整個建立輸入被掃瞄或計算,然後再記憶體中建立乙個hash表。每個行根據計算的hash鍵值(相當於斷言中的一組列)被插入到乙個hash表元中。
這個建立階段之後是探查階段。整個探查輸入被逐行進行掃瞄或計算,對於每個探查行,計算乙個hash鍵值。對應的hash表元使用來自探查輸入的hash鍵值進行掃瞄,匹配被生成。
查詢優化器使用hash連線高效處理大的、未排序、沒有索引的輸入。通常:所求資料在其中一方或雙方沒有排序的條件達成時,會選用雜湊匹配。
先看下面的查詢:
對於這個查詢,優化器使用兩個表之間的乙個合併連線。合併連線要求兩個連線輸入在合併列上排序,這將在連線條件中定義。如果兩個連線上有索引,那麼連線輸入由該索引排序。因為每個連線輸入都被排序,合併排序從每個輸入得到一行比較是否相等,如果它們相等,匹配的行被生成。這個過程重複道所有行都被處理。
在以上的查詢中,下面我們將在persontenthousand表的pid(連線列)上建立聚集索引,在執行相同的查詢:
巢狀迴圈連線使用乙個連線輸入作為外部輸入表,另乙個作為內部輸入表。外部輸入表是執行計畫中上面的輸入,而內部輸入表是下面的輸入表。外部迴圈逐行消費外部輸入表。內部迴圈為每個外部行執行一次,搜尋內部輸入表的匹配行。
如果外部輸入相當小,內部輸入大但是有索引,巢狀迴圈連線是非常高效的。在許多影響少數行的簡單查詢中,巢狀迴圈連線遠遠優於hash和合併連線。連線通過犧牲其他方面來提高速度-使用記憶體來取得小的資料集並且快速地與第二個資料集比較,迴圈連線熟讀很快。合併連線與此相似,使用記憶體和一小部分tempdb來進行其排序的比較,hash連線使用記憶體和tempdb建立hash表。雖然迴圈連線更快,但是隨著資料集變得更大,它比hash或合併消耗更多的記憶體,這就是sql server在不同資料集的情況下使用不通計畫的原因。
連線型別
連線列上的索引
連線表的一般大小
預先排序
連線子句
hash
內部表:不需要索引
外部表:可選
最佳條件:小的外部表,大的內部表
任意不需要
equi-join
合併內部/外部表:必須有索引
最佳條件:兩個表都有聚集或覆蓋索引大需要
equi-join
巢狀迴圈
內部:必須索引
外部:最好有索引小可選
所有 要注意排序條件。上面的**總結的已經非常好了,要不是說最佳條件覆蓋索引,我到現在都搞不出合併連線的示例。
詳解索引連線型別
sql server有3種連線型別 在許多影響小的行集的簡單查詢中,巢狀迴圈連線遠遠優於hash和合併連線。用於查詢的連線型別由優化器動態決定。下面我來先來建立兩張簡單的表。province 十條資料 persontenthousand 1萬資料 省份和人的關係,一對多,外來鍵相連 為了理解雜湊連線...
Oracle索引 索引型別
oracle 提供了多種不同型別的索引以供使用。簡單地說,oracle 中包括如下索引 b 樹索引 這些是我所說的 傳統 索引。到目前為止,這是 oracle 和大多數其他資料庫中最常用的索引。b 樹的構造類似於二叉樹,能根據鍵提供一行或乙個行集的快速訪問,通常只需很少的讀操作就能找到正確的行。不過...
索引與索引型別
size large 索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 name 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資訊。索引是乙個單獨的 物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值...