本文主要介紹sql executor(由sql server執(zhí)行)是什么意思,下面一起看看sql executor(由sql server執(zhí)行)是什么意思相關(guān)資訊。
本文的目的是對執(zhí)行計劃中每個操作的相關(guān)信息進行分類。數(shù)據(jù)訪問操作首先,訪問數(shù)據(jù)最基本的操作。這可以通過直接訪問表或訪問索引來完成。表的數(shù)據(jù)結(jié)構(gòu)是堆,b樹聚集索引的數(shù)據(jù)是通過構(gòu)建聚集索引和非聚集索引數(shù)據(jù)的b樹來組織的,而表不在堆中,這是根據(jù)存儲量來組織的。一般來說,非聚集索引只包含具有一些列和篩選器索引的表,并且只包括一些行。除了數(shù)據(jù)組織,數(shù)據(jù)訪問還可以分為掃描(搜索)和查找(搜索)兩種。掃描是掃描整個結(jié)構(gòu)中的所有數(shù)據(jù),而搜索只是查找整個結(jié)構(gòu)中的一部分數(shù)據(jù),所以可以看出,因為堆是混亂的,所以無法搜索(查找)棧上的操作。對比b樹的順序,可以在b樹中找到。當訪問堆組織表的數(shù)據(jù)時,將執(zhí)行堆掃描,如圖1所示。圖一。表格掃描正如你所看到的,表格掃描圖標清楚地顯示了表格掃描的性質(zhì),并在一個無序的組織表格中從頭到尾進行掃描。至于聚集索引和非聚集索引的b樹結(jié)構(gòu),也可以進行掃描。一般來說,為了獲得索引中的所有數(shù)據(jù),在一個表或索引中獲得的掃描數(shù)據(jù)樹,大部分都會用聚簇索引進行掃描,這比搜索花費的代價要小。如圖2所示。圖二。聚集索引掃描索引掃描圖標還可以清楚地顯示聚集索引掃描的性質(zhì)。在找到最左邊的葉節(jié)點后,掃描所有的葉節(jié)點以掃描整個結(jié)構(gòu)。當然,同樣的概念也適用于非聚集索引,如圖3所示。圖3。非聚集索引的掃描使得b樹對于b樹結(jié)構(gòu)中的某些數(shù)據(jù)有意義。根據(jù)鍵值,可以從b樹根到單條路徑,減少掃描頁面的不必要消耗。圖4是查詢計劃中的索引查找。圖4。聚集索引查找索引查找圖標也非常生動,可以看到從根節(jié)點到葉節(jié)點的線條。它可以在數(shù)據(jù)頁面上找到。不難看出,如果我們需要查找分散在不同頁面的多個數(shù)據(jù),那么搜索操作要重復很多次。當這個數(shù)字足夠大的時候,sql server會選擇相對低消耗的索引掃描和不重復的索引搜索,這是同一個概念,但不再正確。書簽查找(bookmark lookup)您可能會想,如果非聚集索引可以快速查找數(shù)據(jù),但很遺憾,當非聚集索引不包含所有必需的列時,會發(fā)生什么情況呢?此時,sql server將面臨兩種選擇:直接訪問基礎(chǔ)表獲取數(shù)據(jù)或者非聚集索引查找數(shù)據(jù),然后轉(zhuǎn)到基礎(chǔ)表獲取數(shù)據(jù),不受非聚集索引的影響,選擇依賴于行和其他統(tǒng)計信息的查詢分析器的估計值。會選擇少消費一個。圖5顯示了一個簡單的書簽搜索。圖5。簡單的書簽搜索從圖5可以看出,發(fā)現(xiàn)第一個非聚集索引就可以了,但是這個指標并不包括所有的列,所以必須在這些附加的基本表中找到列,所以要找到鍵。如果把基本表的那堆整理好了,那么專注搜索(searching)就會擺脫搜索(rid searching),關(guān)鍵是擺脫查詢書簽搜索。但有時索引查找返回的行數(shù)太多,使得書簽查找的性能遠低于直接掃描操作。因此,sql server將選擇掃描而不是書簽,如圖6所示。圖6。6.stateprovinceid列有一個非聚集索引,但是由于返回的行數(shù)太大,分析器選擇掃描而不是書簽搜索。這一估計是基于統(tǒng)計資料。關(guān)于統(tǒng)計,我可以看到以前的一篇博文,講的是sql server中統(tǒng)計對查詢的影響。聚合操作(aggregation)聚合函數(shù)支持聚合操作。聚合函數(shù)是在一定條件下將一組數(shù)據(jù)匯總為1,或者根據(jù)規(guī)則聚合為多個數(shù)據(jù)的過程。有些聚合函數(shù),比如average、sum、minimum、different關(guān)鍵字,可能會導致兩種聚合操作:流聚合(stream aggregation)和哈希聚合(hash aggregation)。流聚合(stream aggregation)流聚合需要在聚合的數(shù)據(jù)集中有序地執(zhí)行聚合函數(shù)??梢酝ㄟ^命令對數(shù)據(jù)進行排序,也可以從聚合中直接訪問排序后的數(shù)據(jù)。在另一個非聚集索引中,有標量聚合而沒有聚合操作組,該操作是執(zhí)行聚合流量。例如,我們直接進行標量聚合,如圖7所示。圖7。流量聚合,但是對于組的條款來說,因為數(shù)據(jù)需要按照命令按組列排序,所以需要保證排序。注意,排序操作是一個操作,內(nèi)存保證。當sql server占用內(nèi)存和tempdb時,它總是在排序操作中選擇最低成本和哈希匹配。操作需要排序,如圖8所示。圖8。需要排序的流被聚集和排序。圖8按產(chǎn)品線進行分類,然后根據(jù)它們各自的組對它們進行聚合。hash aggregation上的流量聚合適用于數(shù)據(jù)量相對較小的情況,但對于相對較大的表,使用hash組比排序的開銷要低。hash set在內(nèi)存中建立哈希表實現(xiàn)聚合,所以在內(nèi)存中沒有建立hash排序所需的數(shù)據(jù)。該表將列后面的組作為核心值,如圖9所示。圖9。hash聚合在內(nèi)存中一個好的哈希表中,下面的值作為鍵組,然后處理每個數(shù)據(jù)集。當哈希表中不存在該鍵時,向哈希表中添加一個條目,當哈希表中已經(jīng)存在該鍵時,根據(jù)規(guī)則(和avg等聚合函數(shù)是用于計算值的哈希表)(value)。連接(connection)當多個表連接時(書簽搜索和索引連接計數(shù)),sql server會采用三種不同的連接循環(huán)嵌套連接(nested loop)環(huán)形連接)、合并連接(merge connection)和哈希連接(hash connection),這三種連接并不比其他連接更好,但每種連接都適應特定的場景。循環(huán)嵌套連接(嵌套循環(huán)連接)在圖10中可以看到一個簡單的循環(huán)嵌套連接。圖10。循環(huán)嵌套連接的一個例子循環(huán)嵌套連接的圖標也很生動。在外部輸入(external input)之上,這是索引掃描聚合。在下一個內(nèi)部輸入(internal input)中,這里是聚集索引查找。外部輸入只執(zhí)行一次,內(nèi)部輸入的每一行的連接條件都基于外部輸入。由于是290行,內(nèi)部輸入執(zhí)行290次。您可以通過屬性窗口看到它。如圖11:圖11內(nèi)部輸入執(zhí)行的次數(shù)。根據(jù)嵌套循環(huán)的原理,很容易看出,因為掃描的是外部輸入,所以搜索的是內(nèi)部輸入。當兩個連接的外部輸入結(jié)果集相對較小,而內(nèi)部輸入表查找量非常大時,查詢優(yōu)化器傾向于選擇循環(huán)嵌套模式。合并連接(merge join)不同于循環(huán)嵌套,合并連接只是對每個表的一次訪問。從這個角度來看,組合連接比循環(huán)嵌套要快得多。典型的合并連接如下,如圖12所示。圖12。組合連接的原理不難想象。首先,連接的組合需要雙方的順序。因為輸入條件是有序的,每個輸入集取一行進行比較,等退不等棄。從這里不難看出為什么合并聯(lián)接只允許聯(lián)接等于數(shù)字。我們可以從圖11中的圖標看出這個原理。如果輸入數(shù)據(jù)的兩個方面失敗,查詢分析器將不會選擇合并連接。我們還可以索引提示符來強制合并連接。為了實現(xiàn)這個目標,執(zhí)行計劃必須添加一個排序步驟來實現(xiàn)訂單,如圖13所示。圖13。通過排序,合并連接哈希連接(hash connection)哈希連接只需要兩邊各1個數(shù)據(jù)。哈希連接是通過在內(nèi)存中建立哈希表來實現(xiàn)的。這是比較大的內(nèi)存消耗,內(nèi)存不夠的話會占用tempdb。但事實并非如此。;典型的散列連接不需要有序的組合。如圖14所示。圖14。散列連接在這里,我刪除客戶 sql server組合連接使用兩個以上的輸入來生成一個哈希表,該哈希表可由以下輸入檢測到,并可在屬性窗口中看到,如圖15所示。圖15。哈希鍵生成和哈希鍵檢測一般來說,當兩個輸入數(shù)據(jù)很大,并且數(shù)據(jù)到達數(shù)據(jù)的一個或兩個方面時,使用哈希匹配。多表連接時的并行性,sql server在多cpu或多核的情況下也允許查詢并行,無疑提高了效率。圖16顯示了一個并行示例。圖16。并行增強效率綜述簡要介紹sql server執(zhí)行計劃中常見的操作原則,了解這些步驟和原則是優(yōu)化查詢的基礎(chǔ)工作。
了解更多sql executor(由sql server執(zhí)行)是什么意思相關(guān)內(nèi)容請關(guān)注本站點。