国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL7.0手冊-開發者手冊 -63. 數據庫系統里的基因查詢優化

2019-09-08 23:34:06
字體:
來源:轉載
供稿:網友
第六十三章. 數據庫系統里的基因查詢優化
內容 
作為復雜優化問題的查詢處理 
基因算法 (GA) 
Postgres 里的基因查詢優化(GEQO) 
Postgres GEQO未來的實現任務 
作者:由德國弗來堡礦業及技術大學自動控制系 Martin Utesch 書寫.
作為復雜優化問題的查詢處理
在所有關系型操作符里,最難以處理和優化的一個是 join.一個查詢需要回答的可選規劃的數目將隨著該查詢包含的 join 的個數呈指數增長.在訪問關系的分支時的進一步的優化措施是由多種多樣的 聯接方法(join methods) (例如,在 Postgres 里的嵌套循環,索引掃描,融合聯接等(nested loop, index scan, merge join ))來支持處理獨立 join (聯接)和多種多樣的 索引(indices) (如,Postgres里的 r-tree,b-tree,散列(hash)). 
目前 Postgres 優化器的實現在候選策略空間里執行一個近似完全搜索 (near- exhaustive search) .這個查詢優化技術對包含有極廣的查詢需要的數據庫應用領域,例如人工智能等,支持得不夠. 

德國弗來堡礦業及技術大學自動控制系的成員在試圖把Postgres DBMS 作為用于一個電力網維護中做決策支持的知識庫系統的后端時,碰到了上面的問題.該 DBMS 需要為知識庫系統的推導機處理很大的 join (聯接)查詢. 

在可能的查詢規劃空間里進行檢索的惡劣性能引起了人們對發展新的優化技術的需要. 

在隨后的內容里,我們提出一個 基因算法 (Genetic Algorithm) 的實現作為解決數據庫查詢優化問題的一個選擇. 
 


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

基因算法(GA)
GA 是一種啟發式的優化法(heuristic optimization method),它是通過既定的隨機搜索進行操作.優化問題的可能的解的集合被認為是個體 (individuals) 組成的的 人群(population) .一個個體對它的環境的適應程度由它的健康度(fitness)表示. 
一個個體在搜索空間里的參照物是用染色體(chromosomes)表示的,實際上那是一套字符串.一個基因 (gene)是染色體的一個片段,基因對被優化的單個參數進行編碼.對一個基因的典型的編碼可以是 二進制 (binary)或整數(integer)。 

通過仿真進化過程的重組 (recombination)。突變 (mutation),和選擇 (selection)找到新一代的搜索點,它們的平均健康度要比它們的祖先好. 

根據 "comp.ai.genetic" FAQ,我們不論怎么強調 GA 在解決一個問題時不是純隨機搜索都不過份.GA 使用隨機處理,但是結果明顯不是隨機的(比隨機更好). 

GA 結構化框圖:
---------------------------

P(t)    generation of ancestors at a time t
P''(t)  generation of descendants at a time t

+=========================================+
|>>>>>>>>>>>  Algorithm GA  <<<<<<<<<<<<<<|
+=========================================+
| INITIALIZE t := 0                       |
+=========================================+
| INITIALIZE P(t)                         |
+=========================================+
| evalute FITNESS of P(t)                 |
+=========================================+
| while not STOPPING CRITERION do         |
|   +-------------------------------------+
|   | P'(t)  := RECOMBINATION{P(t)}       |
|   +-------------------------------------+
|   | P''(t) := MUTATION{P'(t)}           |
|   +-------------------------------------+
|   | P(t+1) := SELECTION{P''(t) + P(t)}  |
|   +-------------------------------------+
|   | evalute FITNESS of P''(t)           |
|   +-------------------------------------+
|   | t := t + 1                          |
+===+=====================================+

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

Postgres 里的基因查詢優化(GEQO)
GEQO 模塊是試圖解決類似漫游推銷員問題(TSP)的查詢優化問題的.可能的查詢規劃被當作整數字串進行編碼.每個字串代表查詢里面一個關系到下一個關系的 join 的順序.例如,下面的查詢樹 
       //
      // 2
     // 3
    4  1
是用整數字串 '4-1-3-2' 編碼的,這就是說,首先聯接關系 '4' 和 '1',然后 '3',然后是 '2',這里的 1,2,3,4都是 Postgres 里的關系標識(relids)。 
GEQO 模塊的一部分是采用的 D. Whitley 的 Genitor 算法. 

在 Postgres 里的 GEQO 實現的一些特性是: 

穩定狀態 (steady state) GA 的使用(替換全體中最小健康度的個體,而不是整代的替換)允許向改進了的查詢規劃快速逼近.這一點對在有效時間內處理查詢是非常重要的;
邊緣重組交叉 (edge recombination crossover ) 的使用特別適于在用GA 解決 TSP 問題時保持邊緣損失最低。
否決了把突變(Mutation)作為基因操作符的做法,這樣生成合法的 TSP 漫游時不需要修復機制.

與 Postgres 的查詢優化器實現相比較,GEQO 模塊對Postgres DBMS 有下面的貢獻: 
通過非完全搜索對大的 join (聯接)查詢進行操作;
改善了查詢規劃的開銷尺寸的近似值,因為不需要做規劃融合了(GEQO 模塊把查詢規劃的開銷當作一個個體來評估).

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

PostgresGEQO 未來的實現任務
基本改進
改進查詢處理完后的內存釋放
在處理大 join (聯接)查詢時,用于基因查詢優化的時間看來只是 Postgres 通過過程 MemoryContextFree(在文件 backend/utils/mmgr/mcxt.c 里)釋放內存的 一小部分(fraction).跟蹤調試顯示釋放內存的工作陷在文件 backend/utils/mmgr/oset.c 里的過程 OrderedElemPop 里的一個循環里了.在使用普通 Postgres 查詢優化算法處理長的查詢時也會產生這個問題.
改善基因算法參數設置
在文件 backend/optimizer/geqo/geqo_params.c 里的過程 gimme_pool_size 和 gimme_number_generations,我們在設置參數時不得不為兩個競爭條件做出折衷: 
查詢規劃的優化 
計算處理時間

尋找解決整數溢出的更好的辦法
在文件 backend/optimizer/geqo/geqo_eval.c 里的過程 geqo_joinrel_size,目前對防止 MAXINT 溢出的方法(hack)是把 Postgres 的整數值 rel->size to 設置為它的對數.對 backend/nodes/relation.h 里的 Rel 的變動顯然將嚴重影響整個 Postgres 的實現.
尋找解決內存耗盡的辦法
當一個查詢里的關系超過 10 個時將導致內存的耗盡.在文件 backend/optimizer/geqo/geqo_eval.c里的過程 gimme_tree 是被遞歸調用的.可能我忘記了正確地釋放某些東西了,但是我不知道是什么.當然 join 的rel 數據結構隨著更多的關系打包進入之后會越長越大.歡迎任何建議 :-(
參考
GEQ 算法的參考信息. 
The Hitch-Hiker's Guide to Evolutionary Computation, J 主站蜘蛛池模板: 虹口区| 大新县| 桐乡市| 天祝| 永康市| 宁都县| 错那县| 株洲市| 东方市| 望都县| 无极县| 玉门市| 太仆寺旗| 天镇县| 成都市| 舞钢市| 昌图县| 凤台县| 封丘县| 宁津县| 华坪县| 长春市| 井冈山市| 桦甸市| 香格里拉县| 唐河县| 沙雅县| 海盐县| 基隆市| 五常市| 临江市| 三穗县| 合作市| 岳普湖县| 富蕴县| 奉新县| 北票市| 仁怀市| 通榆县| 彰武县| 彭泽县|