數據庫系統之查詢處理與優化

查詢處理的過程
在這裏插入圖片描述
第一步
就是語法分析器與翻譯器處理,對SQL查詢語句進行語法驗證,保證查詢語句的正確性,然後將SQL查詢語句翻譯爲可使用的形式
第二步
是將SQL查詢語句翻譯爲系統對應的內部表示形式,即關係代數表達式
第三步
就是對關係代數表達式進行優化,找出最優的效率最高的關係代數表達式
第四步
根據這個關係代數表達式制定好執行計劃(執行計劃是指執行一個查詢的計算機原語,也就是說它是標註瞭如何執行一個或多個關係代數操作的操作序列)
第五步
執行引擎按照執行計劃進行執行,對數據庫中的表,函數進行操作,最終得到查詢結果響應給用戶。

優化器(就是對關係代數的優化,是通過等價變換得到優化執行方案,也就是操作執行的順序,包含了註釋是否需要採用索引,具體採用的操作執行算法等)

查詢代價的度量
1.查詢處理的代價可通過該查詢對各種資源的使用情況進行度量
2.然而在大型數據庫系統中,在磁盤存取數據的代價通常是最主要的代價
3.我們可以使用傳送磁盤塊數以及搜索磁盤次數來度量查詢計劃代價。假設磁盤子系統傳送一個塊的數據平均消耗tr秒,磁盤塊平均訪問時間(磁盤搜索時間加上旋轉延遲)爲ts秒,那麼依次傳送b個塊以及執行S次磁盤搜索的操作消耗btr+Sts秒

SQL中常見的查詢
1.整個表數據全部讀取,也就是沒有任何條件的查詢
2.有一個單一條件準確定位某一個數據記錄
3.有一個範圍條件要定位多個數據記錄
4.單個條件和範圍條件的結合

選擇操作典型實現方法
1.簡單的全表掃描方法
順序掃描,輸出滿足條件的元組,適合小表,不適合大表
2.索引(或散列)掃描方法
通過索引先找到滿足條件的元組主碼或元組指針,再通過元組指針直接在查詢的基本表中找到元組。適合選擇條件中的屬性上有索引(例如B+樹索引或Hash索引)

選擇操作的實現
例:select * from Student,SC where Student.sno=SC.sno
1.嵌套循環方法
對外層循環(Student)的每一個元組(s),檢索內層循環(SC)中的每一個元組(sc),檢查這兩個元組在連接屬性(sno)上是否相等,如果滿足連接條件,則串接後作爲結果輸出,知道外層循環表中的元組處理完爲止。
2.排序-合併方法(適合連接的諸表已經排好序的情況)
如果連接的表沒有排好序,先對Student表和SC表按連接屬性sno排序,取Student表中第一個sno,依次掃描SC表中具有相同sno的元組,當掃描到sno不相同的第一個SC元組時,返回Student表掃描它的下一個元組,再掃描SC表中具有相同sno的元組,把它們連接起來重複上述步驟直到Student表掃描完。
3.索引連接方法
在SC表上建立屬性sno的索引,(如果原來沒有索引),對Student表中每一個元組,由sno值通過SC的索引查找相應的SC元組,把這些SC元組和Student表中的元組處理完爲止。
4.Hash Join方法
把連接屬性作爲hash碼,用同一個hash函數把R和S中的元組散列到同一個hash文件中。

查詢的代價主要考慮的內容
在分佈式數據庫系統中,查詢代價除了考慮CPU代價I/O代價外,由於數據分佈在不同的場地上,使得查詢處理中還要考慮站點間傳輸數據的代價;分佈透明性是指用戶不需要了解數據分片的位置,分片的分配位置以及數據複製的過程;分佈式查詢優化一般需要考慮操作的執行順序和數據在不同場地間的傳輸順序;執行分佈式數據庫查詢時,導致數據傳輸量大的主要原因時數據間的連接操作和並操作

查詢優化
同一個SQL查詢語句的不同關係代數表達式,它查詢代價時不同的,可以根據關係代數表達式的等價轉換,將關係代數表達式變成代價較低的關係代價表達式,來實現查詢優化。

查詢樹和查詢執行計劃之間的區別
查詢樹不是最優的,不包含實際執行時選擇的算法,執行計劃=優化後的查詢樹+選擇的實際執行的算法(連接運算是用塊連接還是散列連接,是否用流水線等);
查詢執行的時候是用的執行計劃,即優化後的查詢樹加上相應操作的具體算法;
查詢樹的基本優化策略
選擇下移優化策略(優先做選擇,後做關係連接,將選擇移到靠近關係)
投影下移優化策略(通過等價規則先進行投影,去除對查詢無意義的屬性,再做連接)
選擇連接順序優化策略(小關係的連接優先,這樣做中間結果元組會很少,這個代價也會很低)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章