<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # PREPARE ## Name PREPARE?--?創建一個預備語句 ## Synopsis ``` PREPARE _name_ [ ( _data_type_ [, ...] ) ] AS _statement_ ``` ## 描述 `PREPARE`創建一個預備語句。一個預備語句是服務器端的對象, 可以用于優化性能。在執行`PREPARE`語句的時候,指定的查詢被解析、分析、 重寫。當隨后發出`EXECUTE`語句的時候,預備語句被規劃和執行。 這種分工避免了重復解析分析工作,允許執行計劃依賴于所提供的特定的參數值。 預備語句可以接受參數:在它執行的時候替換到查詢中的數值。可以在一個預備語句里按照位置來引用參數, 比如`$1`, `$2`等。可以指定一個相應的參數數據類型列表。 如果一個參數的數據類型沒有被指定或聲明為`unknown`, 那么其類型將根據該參數所使用的實際上下文環境進行推測(如果有可能的話)。當執行該語句的時候, 將在`EXECUTE`語句中為這些參數指定實際值。參見[EXECUTE](#calibre_link-107)獲取更多信息。 預備語句只是在當前數據庫會話的過程中存在。如果客戶端退出,那么預備語句就會被遺忘, 因此必須在被重新使用之前重新創建。這也意味著一個預備語句不能被多個數據庫客戶端同時使用; 但是,每個客戶端可以創建它們自己的預備語句來使用。預備語句可以用 [DEALLOCATE](#calibre_link-479)命令手工清除。 如果一個會話準備用于執行大量類似的查詢,那么預備語句可以獲得最大限度的性能優勢。 如果查詢非常復雜,需要復雜的規劃或者重寫,那么性能差距將更加明顯。比如, 如果查詢設計許多表的連接,或者有多種規則要求應用。如果查詢的規劃和重寫相對簡單, 而執行起來開銷相當大,那么預備語句的性能優勢就不那么明顯。 ## 參數 `_name_` 給予這個特定的預備語句任意名字。它必須在一個會話中是唯一的, 并且用于執行或者刪除一個預備語句。 `_data_type_` 預備語句的某個參數的數據類型。如果某個參數的數據類型未指定或指定為`unknown`, 那么將根據該參數使用的上下文環境進行推斷。可以使用`$1`, `$2` 等等在預備語句內部引用這個參數。 `_statement_` `SELECT`, `INSERT`, `UPDATE`, `DELETE`, 或 `VALUES` 語句之一。 ## 注意 如果預備語句執行了足夠長的時間,服務器可能最終決定保存并重新使用一個一般的計劃, 而不是每次重新計劃。如果預備語句沒有參數,那么將立即發生; 否則只在一般計劃看起來不比依賴于特定參數值的計劃昂貴時發生。 典型的,只有查詢的性能對提供的特定的參數值相當遲鈍時選擇一般的計劃。 為了查詢PostgreSQL用于預備語句的查詢計劃,使用[EXPLAIN](#calibre_link-575)。 如果正在使用一個一般的計劃,它將包含參數符號`$``_n_`, 此時定制計劃將有代入的當前實際參數的值。 有關查詢規劃和PostgreSQL為查詢優化的目的收集統計的更多信息, 參閱[ANALYZE](#calibre_link-589)文檔。 盡管預備語句的重點是避免重復分析和規劃語句,但PostgreSQL 在使用它之前強制重復分析和重復計劃語句, 每當在語句中使用的數據庫對象自前一次使用預備語句后經歷了明確(DDL)的變化時。 還有,如果[search_path](#calibre_link-738)的值在到下一個使用時改變了, 那么語句將使用新的`search_path`重新分析。(后面的行為是 PostgreSQL 9.3新增的。) 使用預備語句語義的規則幾乎等于反復重新提交相同的查詢文本, 但是如果沒有對象定義改變那么將有一個性能優勢,尤其是保持使用最佳的規劃。 語義等價不完美的一個例子是如果語句引用一個未經限定名字的表, 然后在一個模式中創建了一個相同名字的表出現在`search_path`中靠前的地方, 那么將不會自動重復分析,因為用于語句的對象沒有改變。但是,如果其他改變強制了一個重復分析, 那么新表將在后來的使用中引用。 可以通過查詢[`pg_prepared_statements`](#calibre_link-968) 系統視圖獲得某個會話中所有可用的預備語句。 ## Examples 為一個`INSERT`語句創建一個預備語句然后執行它: ``` PREPARE fooplan (int, text, bool, numeric) AS INSERT INTO foo VALUES($1, $2, $3, $4); EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00); ``` 為一個`SELECT`語句創建一個預備語句然后執行它: ``` PREPARE usrrptplan (int) AS SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid AND l.date = $2; EXECUTE usrrptplan(1, current_date); ``` 注意,第二個參數的數據類型并未指定。所以將從上下文環境推測`$2`的類型。 ## 兼容性 SQL 標準包含一個`PREPARE`語句,但是它只用于嵌入式 SQL 。 PostgreSQL 實現的`PREPARE`語句的語法也略有不同。 ## 又見 [DEALLOCATE](#calibre_link-479), [EXECUTE](#calibre_link-107)
                  <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>

                              哎呀哎呀视频在线观看