關(guān)系數(shù)據(jù)庫查詢處理(數(shù)據(jù)庫)
時間:2022-12-24 16:30:01 | 來源:信息時代
時間:2022-12-24 16:30:01 來源:信息時代
關(guān)系數(shù)據(jù)庫查詢處理 : DBMS接受用戶的查詢請求(例如SQL查詢語句),進行內(nèi)部處理后將查詢結(jié)果返回給用戶的過程。關(guān)系數(shù)據(jù)庫的查詢語言是一種非過程化語言,這就使得其查詢處理要比層次和網(wǎng)狀數(shù)據(jù)庫復(fù)雜許多。SQL查詢語句的處理過程包括查詢編譯和查詢執(zhí)行兩大部分。如圖1所示。其中查詢編譯包括查詢分析、查詢檢查、查詢優(yōu)化三步(如圖2所示):
(1)對SQL查詢語句進行詞法分析、語法分析和語義檢查。詞法和語法分析是檢查SQL語句是否符合規(guī)定的SQL語法,通過后會生成語法分析樹。語義檢查主要是依據(jù)數(shù)據(jù)字典檢查三方面的內(nèi)容:一是檢查關(guān)系的使用,即FROM子句中出現(xiàn)的關(guān)系是否是該查詢所對應(yīng)模式中的關(guān)系或視圖,并將關(guān)系或視圖名轉(zhuǎn)換為內(nèi)部名。二是檢查與解析屬性的使用,即在SELECT子句或WHERE子句中出現(xiàn)的各個屬性是否是FROM子句中某個關(guān)系或視圖的屬性,并把外部屬性名轉(zhuǎn)換為內(nèi)部名。當(dāng)FROM子句包含多個關(guān)系或視圖時,會通過給屬性加上它所引用的關(guān)系名來解析每個屬性,同時檢查二義性。三是檢查類型,檢查所有屬性的類型是否與其使用相適應(yīng)。
圖1 SQL查詢處理流程
圖2 SQL查詢的編譯過程
(2)根據(jù)數(shù)據(jù)字典中的內(nèi)容進行查詢檢查。查詢檢查的第一步是審核用戶的存取權(quán)限。對于涉及存取謂詞的存取權(quán)限,如果它與數(shù)據(jù)取值有關(guān),則此時不能確定該語句能否執(zhí)行,這時需要生成相應(yīng)的動作,以便運行時檢查。查詢檢查還包括視圖轉(zhuǎn)換。視圖轉(zhuǎn)換可以有兩種方法:一種是視圖消解法,即在from列表中引用視圖的地方,用描述該視圖的語法樹來替換。該語法樹由視圖的定義得到。第二種是實體化視圖法,即當(dāng)from列表中引用視圖時,生成新的查詢,該查詢將視圖實體化為臨時表,在from列表中用到視圖的地方,用該臨時表替換。
(3) 對查詢進行優(yōu)化。優(yōu)化分為兩步,第一步是代數(shù)優(yōu)化,第二步是物理優(yōu)化。代數(shù)優(yōu)化是根據(jù)關(guān)系代數(shù)的等價變換規(guī)則及一套啟發(fā)式規(guī)則,通過對查詢做等價變換,達(dá)到優(yōu)化查詢執(zhí)行的目的。物理優(yōu)化可以基于代價,也可以基于啟發(fā)式規(guī)則,它根據(jù)數(shù)據(jù)字典中記載的各種統(tǒng)計信息和一套啟發(fā)式規(guī)則,按照一定的優(yōu)化策略選擇一個系統(tǒng)認(rèn)為是“較好”的存取方案,并把選中的方案描述出來。
通過這三步,一個SQL查詢語句被編譯成一個查詢執(zhí)行計劃,最后由查詢執(zhí)行器去執(zhí)行。
在查詢編譯器得到的查詢執(zhí)行計劃樹中,除了指定操作算法、滿足交換律和結(jié)合律的操作符的操作順序、需要的緩沖區(qū)大小等執(zhí)行信息外,還需要規(guī)定父子結(jié)點間傳遞中間結(jié)果的方式。
子結(jié)點向父結(jié)點傳遞中間結(jié)果可能以實體化方式,也可能以流水線方式。當(dāng)內(nèi)存不足,或父子操作符之間存在天然的阻塞關(guān)系時,子結(jié)點需要以實體化方式向父結(jié)點傳遞中間結(jié)果,即子結(jié)點的輸出結(jié)果將以臨時文件形式寫到磁盤上,父結(jié)點去磁盤上讀數(shù)據(jù)。子結(jié)點以流水線方式向父結(jié)點傳遞中間結(jié)果時,子結(jié)點操作符的輸出將寫到內(nèi)存緩沖區(qū)中,父結(jié)點操作符從緩沖區(qū)讀數(shù)據(jù),父子操作符可以并行執(zhí)行,而不必等待子操作符執(zhí)行結(jié)束。
查詢執(zhí)行器將查詢執(zhí)行計劃樹按照父子結(jié)點間的實體化關(guān)系,以前序遍歷的順序?qū)⒂媱潣浞殖扇舾煽米訕?并按此順序依次執(zhí)行各子樹。每個子樹內(nèi)部的各結(jié)點可以按流水線方式同時執(zhí)行,子樹之間按實體化方式順序執(zhí)行。最后根結(jié)點的輸出即是得到的最終查詢結(jié)果。