今天在看 PostgreSQL çš„æ–‡ä»¶æ™‚ï¼Œç™¼ç¾æœ‰å€‹ç« 節在講é‹ç”¨åŸºå› 演算法(Genetic Algorithms) 來最佳化資料庫的查詢方法(Query Plan),就來介紹一下 PostgreSQL 是如何應用的。
所謂的 Query Plan(查詢方法),是指資料庫管ç†ç¨‹å¼å¦‚何由ç¾å˜çš„ Table ä¸ï¼Œåšå‡ºä½¿ç”¨è€…想è¦çš„資料。Query Plan䏿œ€é›£ä»¥è™•ç†çš„æ˜¯ Join 這個動作。Join 這個動作,簡而言之就是把兩個相關的 Table åˆæˆä¸€å¼µå¤§çš„ Table;例如我們有一個 Table 記錄 "人å-å±…ä½åŸŽå¸‚",å¦ä¸€å€‹"人å-喜好"ï¼Œä»Šå¤©å¦‚æžœæˆ‘å€‘è¦æ‰¾å‡º"ä½å°åŒ—ã€åˆå–œæ¡å¯« Blog"的人,就å¯ä»¥åˆ©ç”¨ Join 這個指令,以人åç•¶ä½œç´¢å¼•å€¼ï¼Œåˆæˆä¸€å¼µåŒæ™‚具有我們所需è¦è³‡æ–™çš„ Table。
Join 有很多種方法å¯ä»¥åšåˆ°ï¼Œæœ€å·®çš„ç‹€æ³å°±æ˜¯æŠŠæ‰€æœ‰çš„å¯èƒ½æ€§éƒ½åˆ—出來,å†åˆªæŽ‰ä¸æ£ç¢ºçš„。舉例來說,ä½å€ Table 有一åƒç†ï¼Œå–œå¥½è³‡æ–™ä¹Ÿæœ‰ä¸€åƒç†ï¼Œé‚£éº¼å°±å…ˆç”¢ç”Ÿä¸€ç™¾è¬ç†çš„è¡¨æ ¼ï¼Œå†ä¸€ä¸€åˆªåŽ»ï¼›ç›¸å°çš„,如果我們知é“人å都沒有é‡è¦†ã€å±…ä½åŸŽå¸‚è¡¨æ ¼ä¸ï¼ŒåŒä¸€å€‹äººä¹Ÿåªæœƒæœ‰ä¸€ç†è³‡æ–™ã€æ¯å€‹äººä¹Ÿåªæœ‰ä¸€å€‹å–œå¥½ï¼Œé‚£éº¼ç”šè‡³å¯èƒ½å¹¾åƒç†å°±åšå‡ºä¾†äº†ã€‚
但䏦䏿˜¯æ¯ä¸€å€‹ Query Plan 都是如æ¤çš„é¡¯è€Œæ˜“è¦‹ï¼Œç•¶éœ€è¦æ¯”å°çš„ Table 越來越多,到底是先 Join 哪一個 Tableã€å…ˆ Join 哪兩個 Join å®Œçš„çµæžœï¼Œæœƒè®Šæˆä¸€å€‹éœ€è¦æŠŠå…¨éƒ¨çš„å¯èƒ½æ€§éƒ½åˆ—出來,æ‰çŸ¥é“哪個最好的å•題,我們稱這種解法å«åš"窮盡æœ"(Exhaustiive Search)ï¼Œæ„æ€å°±æ˜¯å¾—把所有的組åˆéƒ½æ‰¾å‡ºä¾†æ‰è¡Œã€‚
更慘的是 Query Plan 的數é‡åˆéš¨è‘— Table çš„å¢žåŠ è€Œå¤§å¹…å¢žåŠ ï¼Œç•¶éœ€è¦ Join çš„ Table 由兩個變三個ã€å››å€‹ç”šè‡³åˆ°å幾個時, Query Plan 的總é‡å°±åƒ 1*2*3*4 這樣呈指數æˆé•·ï¼Œåˆ°æœ€å¾Œè¦æ‰¾å‡ºæ‰€æœ‰çš„å¯èƒ½è§£ç”本身所花的時間,æžä¸å¥½éƒ½æ¯”資料庫查詢時間來得長了。
在德國的 University of Mining and Technology 自動控制å¸é™¢è¨è¨ˆäº†ä¸€å€‹é›»åŠ›æŽ§åˆ¶ç³»çµ±ï¼Œç”¨ PostgreSQL 來當作決ç–ç³»çµ±çš„è³‡æ–™åº«ï¼Œä½†æ˜¯å› ç‚ºæ±ºç–系統需è¦é‹ç”¨å¤§é‡çš„ Join 來進行推ç†çš„é‹ç®—ï¼Œç‚ºäº†å…¼é¡§æ•ˆçŽ‡ï¼Œä»–å€‘æŠŠåŸºå› æ¼”ç®—æ³•å¼•å…¥è³‡æ–™åº«çš„è¨è¨ˆä¹‹ä¸ï¼Œç”¨ä¾†å¿«é€Ÿç”¢ç”Ÿæœ‰æ•ˆçŽ‡çš„ Query Plan。
é—œæ–¼åŸºå› æ¼”ç®—æ³•çš„åŸºæœ¬æ¦‚å¿µåœ¨æ¤ç•¥éŽï¼Œè«‹åƒè€ƒæœ¬ç«™ç›¸é—œæ–‡ç« 。
Query Plan 最佳化的作法和著åçš„ Traveling Salesman Problem(TSP) å•題很類似,先將å¯èƒ½çš„è§£æ³•è®Šæˆæ•¸å—çš„å—串,例如 4-1-3-2 就表示先讓 Table 4 å’Œ Table 1 åš Join,å†å’Œ Table 3ã€2 åš Join。
æ¼”åŒ–æ™‚æŽ¡ç”¨ç©©æ…‹æ¼”åŒ–ï¼Œä¹Ÿå°±æ˜¯æ¯æ¬¡åªæŠŠè¡¨ç¾æœ€å·®çš„一個 Plan 淘汰掉;而å代的產生則是é‹ç”¨ "edge recombination crossover[註二]",而çªè®Šçš„æ©Ÿåˆ¶åœ¨é€™è£¡ä¸¦ä¸ä½¿ç”¨ã€‚
é‹ç”¨åŸºå› 演算法,資料庫å¯ä»¥åœ¨åˆç†çš„æ™‚間䏿‰¾å‡ºæœ‰æ•ˆçš„ Query Plan來進行 Join 的動作,然而除了找出最好的 Query Plan 之外,電腦的的Computation Time也是一個很é‡è¦çš„å› ç´ ï¼Œä¸åŒçš„åƒæ•¸å°æ–¼ç³»çµ±ä¹Ÿæœƒæœ‰ä¸åŒçš„影響。
從這個例åå¯ä»¥çœ‹åˆ°åŸºå› 演算法所é‹ç”¨çš„å ´åˆï¼Œé‚„是脫離ä¸é–‹"在åˆç†çš„æ™‚é–“"ã€"複雜度高的狀æ³ä¸‹"ã€"找到åˆç†å¯æŽ¥å—的解法"的特色。
註一:PostgreSQL 是一個 GPL 的資料庫,最早是由 Berkeley 所發展的,如今和 MySQL åŒç‚ºç¶²è·¯ä¸Šæœ€å—æ¡è¿Žçš„ GPL 資料庫軟體,官方網站在 http://www.postgresql.org。
註二:關於 edge recombination crossover 的說明,請åƒè€ƒé€™è£¡ã€‚
åƒè€ƒè³‡æ–™ï¼š
Genetic Query Optimization
相關閱讀:
上å¸çš„éˆè—¥â”€åŸºå› 演算法(一)
上å¸çš„éˆè—¥â”€åŸºå› 演算法(二)