Oracle 和 DB2,比較和相容性/流程模型/最佳化器
速度優先。
使用者與資料庫中資料互動的方式是透過查詢,在多使用者系統中,查詢量可能非常高。根據查詢型別,它們也可能非常複雜。體量和複雜性的雙重因素意味著 DBMS 分配使用者請求的效率至關重要。為了實現這一點,查詢最佳化器(簡稱為最佳化器)會分析使用者查詢並找出執行它們的最佳方式。最佳化器的工作方式是檢視查詢可以分解和實現的每種可能方式(查詢計劃),然後計算每個計劃的開銷(或成本)。開銷成本考慮諸如將產生多少磁碟 I/O 以及所需的 CPU 量等因素。這些資訊透過儲存在記憶體中的資料字典提供給最佳化器,並且資料字典中的資訊由從資料庫表收集的統計資訊填充。
這種最佳化方法稱為基於成本的最佳化,Oracle 和 DB2 都使用它。還有一種基於規則的歷史最佳化方法,恰如其分地稱為基於規則的最佳化。基於規則的最佳化不再使用,這裡僅出於完整性考慮提及。
最佳化器使用資料字典中的索引統計資訊,因此預設情況下,最佳化器的效率是索引統計資訊準確性的函式。雖然最佳化器使用這些統計資訊來建立每個查詢計劃,但索引統計資訊的變化率取決於表上的插入、更新和刪除活動。雖然單個表的波動性決定了需要更新索引統計資訊的頻率,但此資訊不會立即提供給最佳化器,並且更新統計資訊需要完全掃描表——這不是一項簡單的任務。
對於大量修改的大表和大量表,統計資訊可能會很快過時。在這種情況下,最佳化器可能無法選擇最佳執行路徑。此外,異常情況(例如具有索引的小表(可以容納在幾個塊或頁面中的表))會影響最佳化器。最佳化器使用索引統計資訊,因此如果這些小表上存在索引,即使表掃描效率更高,最佳化器也會使用這些索引。這是因為可以使用單個 I/O 訪問該表。要使用這些表上的索引,需要讀取索引(Oracle 和 DB2 都將索引與表資料分開儲存),然後讀取頁面(或塊)——兩個代價高昂的 I/O 操作。根據任一資料庫中的擴充套件大小,可以使用單個 I/O 獲取整個表。因此,Oracle 和 DB2 都允許您覆蓋最佳化器做出的決策。
總的來說,這就像調整汽車的引擎,您希望最大化效能並最小化油耗——由於這兩個目標之間存在明顯的權衡,因此如何平衡這些權衡非常重要。雖然不可能在無限的效能和零資源消耗之間實現完美的平衡,但目標是接近,並且這些權衡可能會產生戲劇性的後果——您可以做出損害效能和佔用資源的決策。調整值也可能成為收益遞減的練習,並且普遍共識是,一旦您將其調整到所需的位置,就將其固定並保持不變。