<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 38.1\. 查詢樹 要理解規則系統如何工作,首先要知道規則何時被激發以及它的輸入和結果是什么。 規則系統位于分析器和規劃器之間。以分析器輸出的查詢樹以及用戶定義的重寫規則作為輸入, 重寫規則也是一個查詢樹,只不過增加了一些擴展信息,然后創建零個或者多個查詢樹作為結果。 所以它的輸入和輸出仍然是那些分析器可以生成的東西,因而任何規則系統看到的東西都是可以用 SQL語句表達的。 那么什么是查詢樹呢?它是一個SQL語句的內部表現形式, 這時組成該語句的每個獨立部分都是分別存儲的。如果你設置了配置參數 `debug_print_parse`, `debug_print_rewritten`, 或`debug_print_plan`,那么就可以在服務器日志中看到這些查詢樹。 規則動作也是以查詢樹的方式存儲的,存放在系統表`pg_rewrite`里面。 不過不是用像調試輸出那樣的格式,但包含的內容是完全一樣的。 閱讀一個裸查詢樹需要一定的經驗,但是因為理解查詢樹的SQL 表現就足以理解規則系統,所以這份文檔將不會告訴你如何讀取它們。 當讀取本章中查詢樹的SQL表現時, 必須能夠識別該語句被分解后放在查詢樹里的成員。查詢樹的成員有 命令類型(command type) 這是一個簡單的值,說明哪條命令(`SELECT`, `INSERT`, `UPDATE`, `DELETE`)生成這個查詢樹。 范圍表(range table) 范圍表是一個查詢中使用的關系的列表。在`SELECT` 語句里就是在`FROM`關鍵字后面給出的關系。 每個范圍表表示一個表或一個視圖,表明是查詢里哪個成員調用了它。在查詢樹里, 范圍表是用代號而不是用名字引用的,所以這里不用像在SQL 語句里一樣關心是否有重名問題。這種情況在引入了規則的范圍表后可能會發生。 本章的例子將不討論這種情況。 結果關系(result relation) 這是一個范圍表的索引,用于標識查詢結果前往的表。 `SELECT`查詢通常沒有結果關系。特例`SELECT INTO` 幾乎等于一個跟隨`INSERT ... SELECT` 的`CREATE TABLE`,所以這里就不單獨討論了。 在`INSERT`, `UPDATE`, `DELETE`命令里, 結果關系是更改發生影響的表或視圖。 目標列(target list) 目標列是一列定義查詢結果的表達式。在`SELECT`的情況下, 這些表達式就是構建查詢的最終輸出的東西。它們是位于`SELECT` 和`FROM`關鍵字之間的表達式(`*` 只是表明一個關系的所有字段的縮寫,它被分析器擴展為獨立的字段,因此規則系統永遠看不到它)。 `DELETE`不需要正常的目標列是因為它們不產生任何結果。 相反的,規劃器會向空目的標列中增加一條特殊的CTID記錄, 以允許執行器找到被刪除的行。(當結果關系是一個普通的表時添加CTID。 如果結果關系是一個視圖,則添加所有的行變量,描述在[Section 38.2.4](#calibre_link-1452)。) 對于`INSERT`命令里面,目標列描述了應該進入結果關系的新行。 這些行由那些在`VALUES`子句里的表達式或在`INSERT ... SELECT` 語句里的`SELECT`子句里面的表達式構成。 重寫過程的第一步就是為任何不是由原始的查詢賦值,并且有缺省值的字段增加目標列表項。 任何其它的字段(既無給出值也無缺省值)將由規劃器自動賦予一個常量 NULL 表達式。 對于`UPDATE`命令,目標列描述應該替換舊行的新行。在規則系統里, 它只包含來自命令的`SET column = expression`部分抽取的表達式。 這時,規劃器將通過插入從舊行抽取數據到新行的表達式的方法處理缺失的字段。 就像對`DELETE`,規則系統添加CTID或整行變量使執行者可以識別要被更新的舊行。 目標列里的每個元素都包含著一個表達式,它可以為常量值、一個指向某個范圍表里面的關系的一個字段的變量、 一個參數、一個由函數調用/常量/變量/操作符等構成的表達式樹。 條件(qualification) 查詢條件是一個表達式,它非常類似那些包含在目標列里的條目。這個表達式的值是一個布爾值, 通過此值來判斷對最終結果行是否要執操作(`INSERT`, `UPDATE`, `DELETE`, 或 `SELECT`)。它是一個SQL 語句的`WHERE`子句。 連接樹(join tree) 查詢的連接樹顯示了`FROM`子句的結構。對于像`SELECT ... FROM a, b, c` 這樣的簡單查詢,連接樹只是一個`FROM`項的簡單列表,因為允許以任意順序連接它們。 但如果使用了`JOIN`表達式(尤其是外連接的時候),就必須按照該連接顯示的順序進行連接。 在這種情況下,連接樹顯示`JOIN`表達式的結構。與特定的`JOIN`子句(來自`ON` 或`USING`表達式)相關的限制做為附加在那些連接樹節點的條件表達式存儲。 事實證明把頂層`WHERE`表達式也當做附加在頂層連接樹項的條件來存儲是非常方便的。 所以實際上連接樹代表`SELECT`語句的`FROM`和`WHERE`子句。 其它(others) 查詢樹的其它部分,像`ORDER BY`子句,不準備在這里討論。 規則系統在附加規則時將在那里(ORDER BY 子句)替換一些條目,但是這對于規則系統的基本原理并沒有多大關系。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看