查詢處理
- 用戶提交 SQL 查詢請求給數據庫管理系統
- 數據庫管理系統處理和執行 SQL 請求,從數據庫中獲取相應數據並返回。
由於 SQL 只是一種聲明性的語言,因此 DBMS 需要決定如何執行 SQL 查詢語句。
自上而下執行 | SELECT name FROM Person WHERE age<21; | 上層語言(SQL) |
π_name(σ_age<21(Person)) | 下層語言(關係代數 RA) | |
π_name | σ_age<21 | Person |
執行表(查詢樹) | |
查詢結果 |
在上述過程中,查詢處理過程經歷了一下步驟:
- 查詢解析與轉換(Parser and translator)
- 檢查 SQL 查詢語法
- 驗證關係表是否存在(表名、屬性、數據類型、權限等)
- 轉化成關係代數表達式(分解成不同的查詢塊,再分別轉化)
- 查詢優化(Query optimiser)
- 轉化成可能爲最優的執行表(對於同一個 SQL 查詢,可能形成不同的執行表)
- 在執行表中明確每一個操作符的實現
- 評價機(Evaluation engine)
- 評價查詢執行表
- 返回結果給用戶
查詢優化是關係型數據庫管理系統中最重要的任務之一。一個好的 DBMS 必須擁有一個好的查詢優化器。
查詢樹與執行表
每一個 RA 表達式都可以用查詢樹來表示,其中:
- 葉子節點 - 代表輸入的關係表
- 中間節點 - 代表中間結果
- 根節點 - 代表最終結果的關係表
而執行表就是在查詢樹的基礎上,在每個節點的位置添加註解,用以說明每個表的訪問方法以及每個 RA 運算符的實現方法
- 物化(Materialized):操作符的中間結果可以保存在臨時表中,供下一個操作符處理
- 流水線(Pipelined):操作符的中間結果直接發送給另一個操作符,而不需要創建臨時表(也稱爲on-the-fly)
查詢優化
在實踐中,查詢優化器包含以下三種優化方法:
- 語義查詢優化:使用應用程序特定的語義知識將查詢轉換爲成本更低的查詢
- 基於規則的查詢優化:使用啓發式規則將關係代數表達式轉換爲具有可能更低成本的等價表達式。
- 思想:在其他操作之前應用最嚴格的操作,可以減少中間結果的大小
- 下推選擇(Push-down selection):儘早應用,減少元組的數量
- 下推投影(Push-down projection):儘早應用以減少屬性的數量。
- 重新排序連接(Re-ordering joins):首先應用限制性連接來減少結果的大小。
- 基於成本的查詢優化:使用成本模型來估計計劃的成本,然後選擇最具成本效益的計劃
一個普遍的查詢模式爲 連接(join)- 選擇(select)- 投影(project)。