<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之旅 廣告
                # F.31\. postgres_fdw `postgres_fdw`模塊提供外部數據封裝器的功能,PostgreSQL通過 它可以訪問存儲在外部的 PostgreSQL服務器上的數據。 本模塊提供的功能不但涵蓋老版本中[dblink](#calibre_link-63)模塊實現的功能, 而且postgres_fdw提供更加透明和符合標準的語法來訪問遠程表,并在許多情況下 提供更好的性能。 使用`postgres_fdw`模塊做遠程訪問的準備: 1. 使用[CREATE EXTENSION](#calibre_link-572)語句安裝`postgres_fdw`. 2. 使用[CREATE SERVER](#calibre_link-6)語句,為每個需要連接的遠程數據庫 創建一個外部服務器對象。指定除了`user`和`password` 以外的連接信息作為服務器對象的選項。 3. 使用[CREATE USER MAPPING](#calibre_link-68)語句,為每個需要通過外部服務器 訪問的數據庫創建用戶映射。指定遠程的和密碼作為映射用戶的`user` 和`password`。 4. 使用[CREATE FOREIGN TABLE](#calibre_link-0)語句,為每個需要訪問的遠程表創建外部表。 創建的外部表的對應列必須與遠程表匹配。也可以在外部表中使用與遠程表不同的表名和列名, 但前提是你必須將正確的遠程對象名作為創建外部表對象的選項。 上面的操作成功后就可以使用`SELECT`外部表的方式訪問存儲在 遠程表中的數據了。同樣`INSERT`, `UPDATE`和 `DELETE`操作都是可以執行的。(映射的遠程用戶需要有能做這些操作的權限) 建議外部表的字段和相關聯的遠程表使用相同的數據類型和校對規則,雖然 `postgres_fdw`允許在需要的時候進行字符類型的轉換,但當數據 類型和校對規則不匹配的時候,由于遠程服務器和本地服務器對于 `WHERE`條件的不同解釋,也許會造成語義的錯誤。 需要注意的是一個外部表可以聲明比和他關聯的遠程表更少的列,列的排序也可以 不同。和遠程表列的關聯用的是列名,和列的位置無關。 ## F.31.1\. postgres_fdw中FDW選項 ### F.31.1.1\. 連接選項 一個作為封裝外部數據使用的外部服務器,可以使用libpq接受的連接字符串,詳見 [Section 31.1.2](#calibre_link-498),除了下面的選項是不允許使用的: * `user`和`password`(將在用戶映射中指定) * `client_encoding`(根據本地服務器編碼自動設定) * `fallback_application_name`(設定為`postgres_fdw`) 只有超級用戶連接到外部服務器是不需要密碼的,所以需要為映射的普通用戶指定 `password`。 ### F.31.1.2\. 對象名稱選項 這些設置選項被用來控制被發往遠程postgres服務器中的sql語句對象名稱。 在外部表的名和關聯的遠程表名不同時,用于設置關聯。 `schema_name` 這個選項可以為外部表指定模式名,和遠程服務器上的表做關聯。如果忽略 這個選項,遠程表本身的模式名會被外部表使用。 `table_name` 這個選項可以為外部表指定表名,和遠程服務器上的表做關聯。如果忽略 這個選項,遠程表本身的表名會被外部表使用。 `column_name` 這個選項可以為外部表列指定表名,和遠程服務器上的列做關聯。如果忽略 這個選項,遠程表本身的列名會被外部表使用。 ### F.31.1.3\. 成本估算選項 `postgres_fdw`檢索數據是在遠程服務器上執行的,所以成本的估算 不只是遠程服務器掃描外部表的效率,還應該加上網絡通信的開銷。想要獲得預期 結果最可靠的方式是對遠程服務器做請求增加開銷,但是對于一些簡單查詢來說可能 不值得這樣做,所`postgres_fdw`提供如下選項做成本估算: `use_remote_estimate` 外部表或者外部服務器可以指定該選項,用來控制`postgres_fdw`是否發出遠程的 `EXPLAIN`命令來獲取成本估算。表的設定優先于服務器的設定,但只限于 設定的表。默認值的false。 `fdw_startup_cost` 外部服務器可以指定該選項,該數值類型的選項會在每個外部表的查詢開始前加入 一個數值成本。用這個值代表建立連接,在遠程端的查詢分析和規劃的額外開銷。 默認值是 `100`。 `fdw_tuple_cost` 外部服務器可以指定該選項,該數值類型的選項會根據外部表掃描結果為每行加入 一個額外的成本。這個代表服務器間傳輸數據的額外的網絡開銷。可以用這個數值 的高低來反應到遠程服務器的網絡延遲。默認值是`0.01`。 `use_remote_estimate`值為真的時候,成本估算的方法是 `postgres_fdw`獲取遠程服務器的語句執行操作成本估算值加上 `fdw_startup_cost`和`use_remote_estimate`。 當值為假的時候,成本估算方法只能是按照語句本地的執行成本加上 `fdw_startup_cost`和`use_remote_estimate`。 除非本地表的統計信息和遠程表統計信息的相同,否則本地的估算一般是不精確的。 在外部表執行[ANALYZE](#calibre_link-589)操作來刷新遠程表的統計信息, 這個操作會掃描遠程表,使計算和存儲統計信息就像在本地一樣。在本地保存統計信息 可以減少遠程表的每個查詢的執行計劃都造成系統開銷。但是如果遠程表被更新的頻率 太高,本地的統計信息也會很快失去應有的作用。 ### F.31.1.4\. 更新選型 默認情況下,所有`postgres_fdw`相關外部表都假設是可以更新的。應用時 優先下面的選項 功能: `updatable` 這個選項用來控制外部表是否可以用`INSERT`,`UPDATE`和 `DELETE`來修改。該選項可以被外部表或者外部服務器指定。表級別的 選項優先于服務器級別的。默認值是`true`。 當然如果一個遠程表本身是不能用增刪改的,那將會報錯。錯誤直接會在本地拋出。 注意`information_schema`將會根據這個選項的設置顯示一個外部表是 否可以增刪改,而不會去檢查遠程服務器。 ## F.31.2\. 連接管理 `postgres_fdw`會在第一個查詢外部服務器關聯的外部表時 建立和外部服務器的連接。這個連接會一直保持,而且在同一個會話中被重用。 如果涉及多個用戶(用戶映射)訪問外部服務器時,每個用戶映射都戶建立一個連接。 ## F.31.3\. 事務管理 當查詢涉及外部服務器的遠程表時,將在本地開啟一個對應的事務, `postgres_fdw`將會在遠程服務器也開啟事務。 遠程事務會和本地事務提交終保持同步。保存點也是一樣。 當本地的事務隔離級別為`SERIALIZABLE`時,遠程的事務隔離級別也使用 `SERIALIZABLE`。否者遠程的隔離級別將是`REPEATABLE READ`。 這是為了保證如果一個查詢涉及遠程服器上多個表的掃描,所有的掃描都會得到一致 的快照結果。這樣產生的結果是即使遠程服務器上的數據由于其他的操作在更新,單 個事務查詢返回的結果也是一樣的。上述結果在本地事務隔離級別 `SERIALIZABLE` 和`REPEATABLE READ`無論怎樣都是可以實現的,但是在`READ COMMITTED` 下可能會得到意想不到的結果。未來的PostgreSQL發行版本也許會 修改這些規則。 ## F.31.4\. 遠程查詢優化 postgres_fdw嘗試優化遠程查詢,以減少從外部服務器的數據傳輸量。通用將帶 `WHERE`查詢條件的語句傳到遠程服務器上執行和不取回與查詢結果不相關 的列來實現。為了減少查詢未被執行的風險,`WHERE`從句中都是內建的數據類型 操作和函數的時候才會被傳到遠程服務器上。在從句中的操作和函數必須是不可變的。 `EXPLAIN VERBOSE`可以用來檢查被送到遠程服務器上的查詢執行的實際狀況。 ## F.31.5\. 版本兼容 `postgres_fdw`可以將PostgreSQL8.3版本以后的服務器 作為遠程服務器使用。8.1,8,2的服務器只能提供讀的功能。有這樣個問題由于版本的差異 將where中的內建函數送到遠程服務器上執行的時候,遠程服務器由于版本低無法識別會報 "function does not exist"或者相似的錯誤。可以用從寫sql的方式解決,我們嵌入 一個子查詢sub-`SELECT` with `OFFSET 0`,將有問題的函數和操作移 出 sub-`SELECT`。 ## F.31.6\. 作者 Shigeru Hanada `&lt;[shigeru.hanada@gmail.com](mailto:shigeru.hanada@gmail.com)&gt;`
                  <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>

                              哎呀哎呀视频在线观看