?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
下面是查詢?yōu)榱说玫浇Y(jié)果不得不經(jīng)過的階段的簡短描述。
首先必須先建立起從應(yīng)用程序到PostgreSQL服務(wù)器的連接, 應(yīng)用程序向服務(wù)器發(fā)送查詢?nèi)缓蟮却邮諒姆?wù)器返回的結(jié)果。
分析器階段(parser stage)檢查從應(yīng)用程序發(fā)送過來的查詢, 核對(duì)語法并創(chuàng)建查詢樹(query tree)。
重寫系統(tǒng)(rewrite system)接收分析器階段創(chuàng)建的查詢樹 且搜索任何應(yīng)用到查詢樹上的規(guī)則rules(存儲(chǔ)在系統(tǒng)表里), 并根據(jù)給出的規(guī)則體rule bodies進(jìn)行轉(zhuǎn)換。
重寫系統(tǒng)的一個(gè)應(yīng)用就是實(shí)現(xiàn)視圖(views)。 當(dāng)一個(gè)查詢訪問一個(gè)視圖時(shí)(也就是一個(gè)虛擬表), 重寫系統(tǒng)改寫用戶的查詢,使之成為一個(gè)訪問在視圖定義里給出的對(duì)基本表的查詢。
規(guī)劃器/優(yōu)化器(planner/optimizer) 接收(改寫后的)查詢樹然后創(chuàng)建一個(gè)查詢規(guī)劃(query plan), 這個(gè)查詢規(guī)劃是執(zhí)行器的輸入。
它(規(guī)劃器/優(yōu)化器)首先創(chuàng)建所有得出相同結(jié)果的可能的路徑(paths)。 例如,如果待掃描的關(guān)系上有一個(gè)索引,那么掃描的路徑就有兩個(gè)。 一個(gè)可能是簡單的順序查找,而另一個(gè)可能就是使用索引的查找。 下一步是計(jì)算出不同路徑的執(zhí)行開銷,并且選擇和返回開銷最少的那條。 開銷最小的路徑然后會(huì)被展開成為一個(gè)可以供執(zhí)行器使用的完整的查詢規(guī)劃。
執(zhí)行器遞歸地走過規(guī)劃樹(plan tree)并且按照規(guī)劃指定的方式檢索數(shù)據(jù)行。 執(zhí)行器在對(duì)關(guān)系進(jìn)行掃描時(shí)使用存儲(chǔ)系統(tǒng)(storage system) 進(jìn)行排序(sorts)和連接(joins), 計(jì)算條件(qualifications)并且最終交回生成的數(shù)據(jù)行。
在隨后的小節(jié)里,將對(duì)上面的每一個(gè)步驟進(jìn)行更詳細(xì)的討論, 以便讓對(duì)PostgreSQL的內(nèi)部控制和數(shù)據(jù)結(jié)構(gòu)有一個(gè)更準(zhǔn)確的理解。