<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 52.4\. 外數據封裝查詢規劃 FDW回調函數`GetForeignRelSize`, `GetForeignPaths`, `GetForeignPlan`和 `PlanForeignModify`必須適合PostgreSQL規劃器的工作。 這有一些他們必須做的說明。 在`root`和`baserel`中的信息可以用于減少從外表中(因此降低成本)讀取的信息量。 `baserel-&gt;baserestrictinfo`特別有趣,正如它包含應該用于過濾讀取的行的限制資格測試(`WHERE` clauses)。 (FDW本身不需要執行這些測試,正如核心執行者反而可以檢查它們。) `baserel-&gt;reltargetlist`可以用于決定需要抓取哪個列;但是注意它僅僅列出通過 `ForeignScan`規劃節點發出的列,不是在質量評估中使用的列也不是查詢輸出列。 各種私有字段可用于FDW規劃函數保持信息。一般來說,無論在FDW私有字段存儲什么 應該是palloc,所以它將在規劃結束后被回收。 `baserel-&gt;fdw_private`是`空`指針,可用于FDW規劃函數存儲與特定外表相關的 信息。當創建`baserel`結點時,核心規劃器并不接觸它除了初始化為NULL外。 從`GetForeignRelSize`到`GetForeignPaths`和/或者 `GetForeignPaths`到`GetForeignPlan`傳遞信息是非常有用的, 從而避免重復計算。 `GetForeignPaths`可以通過在`ForeignPath`節點的 `fdw_private`字段存儲私有信息標識不同訪問路徑的含義。 作為`List`指針聲明`fdw_private`,但是實際上可以包含任何由于 核心規劃器沒有接觸的東西。然而,最好辦法是通過`nodeToString`可傾式表示形式, 用于調試后端可用支持。 `GetForeignPlan`可以檢查所選的`ForeignPath`節點的 `fdw_private`字段,并且可以產生放在`ForeignScan` 規劃節點中的`fdw_exprs`和`fdw_private`列表, 在執行時間他們可用。這些列表必須在`copyObject`知道如何拷貝的形式中被表示。 `fdw_private`列表沒有其他限制,并且不能通過任何方式的核心后端進行解釋。 `fdw_exprs`列表如果不是零,那么希望包含在運行時執行的表達式樹。 這些樹將通過規劃器使得它們完全可執行進行后處理。 在`GetForeignPlan`中,往往目標列表可以拷貝到規劃節點中。 已通過的scan_clauses列表包含和`baserel-&gt;baserestrictinfo`相同分句, 但是為了更好的執行效率可能重新排序。 在簡單情況下FDW可以從scan_clauses列表(使用`extract_actual_clauses`)中刪除`RestrictInfo`節點, 并且將所有分句放入規劃節點的資格列表中,這意味著在運行期間通過執行器將檢查所有分句。 更多復雜的FDW可能檢查一些內部分句,在這種情況下那些分句可以從規劃節點的列表中刪除,以便執行器 不會浪費復查它們的時間。 作為一個例子,FDW可能標識一些來自`_foreign_variable_` `=` `_sub_expression_`的限制分句,它決定了在給定`_sub_expression_`的本地評估值的 遠程服務器上被執行。在`GetForeignPaths`期間產生了該分句的實際標識, 因為它會影響路徑的成本估算。路徑的`fdw_private`字段可能包含一個指向 已標識分句的`RestrictInfo`節點的指針。然后`GetForeignPlan`從scan_clauses中 刪除該分句,但是增加`_sub_expression_`到`fdw_exprs`以確保 它獲得可執行形式。它也可能將控制信息放到規劃節點的`fdw_private` 字段以告知執行函數在運行時間執行什么。傳送到遠程服務器的查詢可能涉及到像`WHERE` `_foreign_variable_` = $1的一些內容,使用從`fdw_exprs`表達式樹評估中獲得的參數值。 FDW應該總是構建至少一個僅僅依賴于表的限制分句的路徑,在連接查詢中,它也可能選擇構建依賴于連接分句的路徑, 比如 `_foreign_variable_` `=` `_local_variable_`。該分句沒有在`baserel-&gt;baserestrictinfo`中找到, 但是必須在關系的連接列表中尋找。 使用分句的路徑被稱為"參數化路徑"。 它必須標識用于使用`param_info`合適值的已選擇連接分句的其他關系; 使用`get_baserel_parampathinfo`計算該值。在`GetForeignPlan`中, 連接分句的`_local_variable_`部分將被添加到`fdw_exprs`中, 然后運行時該情況與普通限制分句一樣運行。 當規劃一個`UPDATE`或者`DELETE`的時候, `PlanForeignModify`可以查找外表的`RelOptInfo`結構, 并且充分使用通過掃描規劃函數預先創建的`baserel-&gt;fdw_private`數據。 然而,在`INSERT`中不掃描目標表,所以沒有`RelOptInfo`。 通過`PlanForeignModify`返回的`List`與`ForeignScan`規劃節點 的`fdw_private`列表有相同的限制, 即它必須包含`copyObject`知道如何拷貝的結構。 `UPDATE`或者`DELETE`反對外部數據源支持并發更新,推薦 `ForeignScan`操作鎖定抓取的行,也許通過`SELECT FOR UPDATE`的等價物。 當在`SELECT FOR UPDATE/SHARE`引用外表時,FDW可能也會在抓取時選擇鎖定行。 如果沒有做,就有關外表來說, 那么`FOR UPDATE`或者`FOR SHARE`選項本質上是無操作的。 這種操作可能會產生本地表操作上輕微的語義差異,行鎖定通常盡可能的延遲: 遠程行可能獲得鎖定即使他們隨后沒有本地應用限制或者連接條件。 然而,匹配局部語義確實需要每行的額外遠程訪問,并且不可能依賴于 外部數據源提供的鎖定語義內容。
                  <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>

                              哎呀哎呀视频在线观看