postgresql 資料庫分別採用了動態規劃方法和遺傳演算法來選擇最優的執行計畫。動態規劃方法需要遍歷全部的解空間(有優化),它一定能夠獲得最優解,因此是我們首選的方法。遺傳演算法則只能嘗試從區域性最優解向全域性最優解不斷逼近,但由於遺傳代際的數量的限制,最終可能產生的是區域性最優解。這種方法在表比較多的時候被採用,因為在表比較多的時候,動態規劃的解空間快速地膨脹,可能會導致查詢效能的下降,遺傳演算法的複雜度則可以限制在一定的範圍內。
我們先來看一下 postgresql 資料庫是如何使用動態規劃方法來選擇最優解的,假設參與連線的有 3 個表以及它們上面分別有索引:
create table test_a(a int, b int, c int, d int);
create table test_b(a int, b int, c int, d int);
create table test_c(a int, b int, c int, d int);
insert into test_a select i, i+100, i+200, i+300 from generate_series(1,100) i;
insert into test_b select i, i+100, i+200, i+300 from generate_series(1,100) i;
insert into test_c select i, i+100, i+200, i+300 from generate_series(1,100) i;
create index test_a_idx on test_a(a);
create index test_b_idx on test_b(a,b);
analyze test_a;
analyze test_b;
analyze test_c;
我們來看這樣乙個示例的動態規劃的過程 C 的第16節課
主講 建立windows窗體 主要內容 如何建立windows窗體 定製窗體的外觀。將控制項加入到windows窗 體中 使用文字框,標籤等 通過設定控制項的屬性定製其外觀 將事件和控制項stem關聯起來 16.1使用windows窗體 16.3定製 窗體的外觀,前乙個程式清單包含乙個基本窗體,於f...
優化器執行計畫選擇
1 資料準備 create table test1 as select d.trunc dbms random.value 0,100 as ran val from dba objects d 2 效能改善 2.1 寫法一 優化器還是很智慧型的,走了hash filter篩選,避開了filter連...
第16課類的真正形態
類的真正形態 上 問題 經過不停的改進,結構體struct變得越來越不像它在c語言中的樣子了。在c語言中,struct中是不能定義成員函式的,你如果實在想用成員函式,只能定義成函式指標的形式。這種方式在核心中太普遍了。struct 在c語言中已經有了自己的含義,因此c 也得必須繼續相容,但是在相容的...