PostgreSQL PREPARE語(yǔ)句

PREPARE 為執(zhí)行準(zhǔn)備一個(gè)語(yǔ)句

PREPARE name [ ( data_type [, ...] ) ] AS statement
  • name: 給這個(gè)特定預(yù)備語(yǔ)句的任意名稱。它在一個(gè)會(huì)話中必須唯一并且后續(xù)將被用來(lái)執(zhí)行或者清除一個(gè)之前準(zhǔn)備好的語(yǔ)句。

  • data_type:預(yù)備語(yǔ)句一個(gè)參數(shù)的數(shù)據(jù)類型。如果一個(gè)特定參數(shù)的數(shù)據(jù)類型沒(méi)有被指定或者被指定為unknown,將從該參數(shù)被使用的環(huán)境中推得。要在預(yù)備語(yǔ)句本身中引用參數(shù),可以使用 1、2等。

  • statement:任何SELECT、INSERT、UPDATE、DELETE或者VALUES語(yǔ)句。

PREPARE創(chuàng)建一個(gè)預(yù)備語(yǔ)句。預(yù)備語(yǔ)句是一種服務(wù)器端對(duì)象,它可以被用來(lái)優(yōu)化性能。當(dāng)PREPARE語(yǔ)句被執(zhí)行時(shí),指定的語(yǔ)句會(huì)被解析、分析并且重寫。當(dāng)后續(xù)發(fā)出一個(gè)EXECUTE命令時(shí),該預(yù)備語(yǔ)句會(huì)被規(guī)劃并且執(zhí)行。這種工作的劃分避免了重復(fù)性的解析分析工作,不過(guò)允許執(zhí)行計(jì)劃依賴所提供的特定參數(shù)值。

預(yù)備語(yǔ)句可以接受參數(shù):在執(zhí)行時(shí)會(huì)被替換到語(yǔ)句中的值。在創(chuàng)建預(yù)備語(yǔ)句時(shí),可以用位置引用參數(shù),如1、2等。也可以選擇性地指定參數(shù)數(shù)據(jù)類型的一個(gè)列表。當(dāng)一個(gè)參數(shù)的數(shù)據(jù)類型沒(méi)有被指定或者被聲明為unknown時(shí),其類型會(huì)從該參數(shù)被使用的環(huán)境中推知(如果可能)。在執(zhí)行該語(yǔ)句時(shí),在EXECUTE語(yǔ)句中為這些參數(shù)指定實(shí)際值。

預(yù)備語(yǔ)句只在當(dāng)前數(shù)據(jù)庫(kù)會(huì)話期間存在。當(dāng)會(huì)話結(jié)束時(shí),預(yù)備語(yǔ)句會(huì)消失,因此在重新使用之前必須重新建立它。這也意味著一個(gè)預(yù)備語(yǔ)句不能被多個(gè)數(shù)據(jù)庫(kù)客戶端同時(shí)使用。不過(guò),每一個(gè)客戶端可以創(chuàng)建它們自己的預(yù)備語(yǔ)句來(lái)使用。預(yù)備語(yǔ)句可以用DEALLOCATE命令手工清除。

當(dāng)一個(gè)會(huì)話要執(zhí)行大量類似語(yǔ)句時(shí),預(yù)備語(yǔ)句可能會(huì)有最大性能優(yōu)勢(shì)。如果該語(yǔ)句很復(fù)雜(難于規(guī)劃或重寫),例如,如果查詢涉及很多表的連接或者要求應(yīng)用多個(gè)規(guī)則,性能差異將會(huì)特別明顯。如果語(yǔ)句相對(duì)比較容易規(guī)劃和重寫,但是執(zhí)行起來(lái)開銷相對(duì)較大,那么預(yù)備語(yǔ)句的性能優(yōu)勢(shì)就不那么顯著了。

對(duì)每一組提供的EXECUTE值,預(yù)備語(yǔ)句可以使用通用計(jì)劃而不是重新做計(jì)劃。對(duì)于沒(méi)有參數(shù)的預(yù)備語(yǔ)句馬上就會(huì)這樣做,否則只有五次或者更多次執(zhí)行產(chǎn)生的計(jì)劃的估計(jì)代價(jià)平均值(包括規(guī)劃開銷)比通用計(jì)劃的代價(jià)估計(jì)更昂貴時(shí)才會(huì)這樣做。一旦選中一個(gè)通用計(jì)劃,在該預(yù)備語(yǔ)句剩余的生存時(shí)間內(nèi)都將使用它。使用在重復(fù)值很多的列中很少出現(xiàn)的EXECUTE值可以產(chǎn)生比通用計(jì)劃更加廉價(jià)的定制計(jì)劃(即使加上規(guī)劃開銷),這樣通用計(jì)劃將不會(huì)被使用。

通用計(jì)劃假定每一個(gè)提供給EXECUTE的值都是該列的可區(qū)分值并且列值是均勻分布的。例如,如果統(tǒng)計(jì)信息記錄了三個(gè)可區(qū)分的列值,通用計(jì)劃會(huì)假定一個(gè)列等值比較將匹配被處理行中的 33%。列統(tǒng)計(jì)值也允許通用計(jì)劃準(zhǔn)確地計(jì)算唯一列的選擇度。如果一個(gè)通用計(jì)劃被選中時(shí),在非均勻分布列上的比較以及制定不存在的值都會(huì)影響平均計(jì)劃代價(jià)。

要檢查一個(gè)預(yù)備語(yǔ)句使用的查詢計(jì)劃,可以使用EXPLAIN,例如EXPLAIN EXECUTE。如果使用的是一個(gè)通用計(jì)劃,它將包含參數(shù)符號(hào)$n,而一個(gè)定制計(jì)劃則會(huì)把提供的參數(shù)值替換進(jìn)去。通用計(jì)劃中的行估計(jì)值反映了這些參數(shù)計(jì)算出來(lái)的選擇度。

更多關(guān)于查詢規(guī)劃的統(tǒng)計(jì)信息的內(nèi)容,下文中的ANALYZE部分。

盡管預(yù)備語(yǔ)句主要是為了避免重復(fù)對(duì)語(yǔ)句進(jìn)行解析分析以及規(guī)劃,但是只要上一次使用該預(yù)備語(yǔ)句后該語(yǔ)句中用到的數(shù)據(jù)庫(kù)對(duì)象發(fā)生了定義性(DDL)改變,將會(huì)對(duì)該語(yǔ)句強(qiáng)制進(jìn)行重新分析和重新規(guī)劃。還有,如果search_path的值發(fā)生變化,也將使用新的search_path重新解析該語(yǔ)句。這些規(guī)則讓預(yù)備語(yǔ)句的使用在語(yǔ)義上幾乎等效于反復(fù)提交相同的查詢文本,但是能在性能上獲利(如果沒(méi)有對(duì)象定義被改變,特別是如果最優(yōu)計(jì)劃保持不變時(shí))。該語(yǔ)義等價(jià)性不完美的一個(gè)例子是:如果語(yǔ)句用一個(gè)未限定的名稱引用表,并且之后在search_path中更靠前的模式中創(chuàng)建了一個(gè)新的同名表,則不會(huì)發(fā)生自動(dòng)的重解析,因?yàn)樵撜Z(yǔ)句使用的對(duì)象沒(méi)有被改變。不過(guò),如果某些其他更改造成了重解析,后續(xù)使用中都會(huì)引用新表。

可以通過(guò)查詢pg_prepared_statements系統(tǒng)視圖來(lái)看到會(huì)話中所有可用的預(yù)備語(yǔ)句。

  • 例子
--創(chuàng)建測(cè)試用表
create table test(a int, b text, c bool, d numeric);

--為一個(gè)INSERT語(yǔ)句創(chuàng)建一個(gè)預(yù)備語(yǔ)句,然后執(zhí)行它:
PREPARE testplan(int, text, bool, numeric) AS INSERT INTO test VALUES($1, $2, $3, $4);
EXECUTE testplan(1, 'Hunter Valley', 't', 200.00);

--為一個(gè)SELECT語(yǔ)句創(chuàng)建一個(gè)預(yù)備語(yǔ)句,然后執(zhí)行它:
PREPARE selectplan(int) AS SELECT * FROM test WHERE a=$1;
EXECUTE selectplan(1); 

EXECUTE 執(zhí)行一個(gè)預(yù)備語(yǔ)句

EXECUTE name [ ( parameter [, ...] ) ]
  • name 要執(zhí)行的預(yù)備語(yǔ)句的名稱。
  • parameter 給預(yù)備語(yǔ)句的參數(shù)的實(shí)際值。這必須是一個(gè)能得到與該參數(shù)數(shù)據(jù)類型( 在預(yù)備語(yǔ)句創(chuàng)建時(shí)決定)兼容的值的表達(dá)式。

EXECUTE被用來(lái)執(zhí)行一個(gè)之前準(zhǔn)備好的語(yǔ)句。 由于預(yù)備語(yǔ)句只在會(huì)話期間存在,該預(yù)備語(yǔ)句必須在當(dāng)前會(huì)話中由一個(gè)更早 執(zhí)行的PREPARE語(yǔ)句所創(chuàng)建。

如果創(chuàng)建預(yù)備語(yǔ)句的PREPARE語(yǔ)句指定了一些參數(shù), 必須向EXECUTE語(yǔ)句傳遞一組兼容的參數(shù),否則會(huì) 發(fā)生錯(cuò)誤。注意(與函數(shù)不同)預(yù)備語(yǔ)句無(wú)法基于其參數(shù)的類型或者數(shù)量重載。 在一個(gè)數(shù)據(jù)庫(kù)會(huì)話中,預(yù)備語(yǔ)句的名稱必須唯一。

EXECUTE返回的命令標(biāo)簽是預(yù)備語(yǔ)句的命令標(biāo)簽而不是 EXECUTE。

DEALLOCATE 釋放一個(gè)預(yù)備語(yǔ)句

DEALLOCATE [ PREPARE ] { name | ALL }
  • PREPARE 這個(gè)關(guān)鍵詞會(huì)被忽略。
  • name 要釋放的預(yù)備語(yǔ)句的名稱。
  • ALL 釋放所有預(yù)備語(yǔ)句。

DEALLOCATE被用來(lái)釋放一個(gè)之前 準(zhǔn)備好的 SQL 語(yǔ)句。如果不顯式地釋放一個(gè)預(yù)備語(yǔ)句,會(huì)話結(jié)束 時(shí)會(huì)釋放它。

EXPLAIN 顯示一個(gè)語(yǔ)句的執(zhí)行計(jì)劃

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

這里 option可以是:

    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    BUFFERS [ boolean ]
    TIMING [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }
  • ANALYZE 執(zhí)行命令并且顯示實(shí)際的運(yùn)行時(shí)間和其他統(tǒng)計(jì)信息。這個(gè)參數(shù)默認(rèn)被設(shè)置為FALSE。
  • VERBOSE 顯示關(guān)于計(jì)劃的額外信息。特別是:計(jì)劃樹中每個(gè)結(jié)點(diǎn)的輸出列列表、模式限定的表和函數(shù)名、總是把表達(dá)式中的變量標(biāo)上它們的范圍表別名,以及總是打印統(tǒng)計(jì)信息被顯示的每個(gè)觸發(fā)器的名稱。這個(gè)參數(shù)默認(rèn)被設(shè)置為FALSE。
  • COSTS 包括每一個(gè)計(jì)劃結(jié)點(diǎn)的估計(jì)啟動(dòng)和總代價(jià),以及估計(jì)的行數(shù)和每行的寬度。這個(gè)參數(shù)默認(rèn)被設(shè)置為TRUE。
  • BUFFERS 包括緩沖區(qū)使用的信息。特別是:共享塊命中、讀取、標(biāo)記為臟和寫入的次數(shù)、本地塊命中、讀取、標(biāo)記為臟和寫入的次數(shù)、以及臨時(shí)塊讀取和寫入的次數(shù)。一次命中表示避免了一次讀取,因?yàn)樾枰膲K已經(jīng)在緩存中找到了。共享塊包含著來(lái)自于常規(guī)表和索引的數(shù)據(jù),本地塊包含著來(lái)自于臨時(shí)表和索引的數(shù)據(jù),而臨時(shí)塊包含著在排序、哈希、物化計(jì)劃結(jié)點(diǎn)和類似情況中使用的短期工作數(shù)據(jù)。臟塊的數(shù)量表示被這個(gè)查詢改變的之前未被修改塊的數(shù)量,而寫入塊的數(shù)量表示這個(gè)后臺(tái)在查詢處理期間從緩存中替換出去的臟塊的數(shù)量。為一個(gè)較高層結(jié)點(diǎn)顯示的塊數(shù)包括它的所有子結(jié)點(diǎn)所用到的塊數(shù)。在文本格式中,只會(huì)打印非零值。只有當(dāng)ANALYZE也被啟用時(shí),這個(gè)參數(shù)才能使用。它的默認(rèn)被設(shè)置為FALSE。
  • TIMING 在輸出中包括實(shí)際啟動(dòng)時(shí)間以及在每個(gè)結(jié)點(diǎn)中花掉的時(shí)間。反復(fù)讀取系統(tǒng)時(shí)鐘的負(fù)荷在某些系統(tǒng)上會(huì)顯著地拖慢查詢,因此在只需要實(shí)際的行計(jì)數(shù)而不是實(shí)際時(shí)間時(shí),把這個(gè)參數(shù)設(shè)置為FALSE可能會(huì)有用。即便用這個(gè)選項(xiàng)關(guān)閉結(jié)點(diǎn)層的計(jì)時(shí),整個(gè)語(yǔ)句的運(yùn)行時(shí)間也總是會(huì)被度量。只有當(dāng)ANALYZE也被啟用時(shí),這個(gè)參數(shù)才能使用。它的默認(rèn)被設(shè)置為TRUE。
  • FORMAT 指定輸出格式,可以是 TEXT、XML、JSON 或者 YAML。非文本輸出包含和文本輸出格式相同的信息,但是更容易被程序解析。這個(gè)參數(shù)默認(rèn)被設(shè)置為TEXT。
  • boolean 指定被選中的選項(xiàng)是否應(yīng)該被打開或關(guān)閉??梢詫慣RUE、ON或1來(lái)啟用選項(xiàng),寫FALSE、OFF或0禁用它。boolean值也能被忽略,在這種情況下會(huì)假定值為TRUE。
  • statement 你想查看其執(zhí)行計(jì)劃的任何SELECT、INSERT、UPDATE、DELETE、VALUES、EXECUTE、DECLARE、CREATE TABLE AS或者CREATE MATERIALIZED VIEW AS語(yǔ)句。
輸出
  • 這個(gè)命令的結(jié)果是為statement選中的計(jì)劃的文本描述,可能還標(biāo)注了執(zhí)行統(tǒng)計(jì)信息
說(shuō)明
  • 為了允許KingbaseES查詢計(jì)劃器在優(yōu)化查詢時(shí)能做出合理的知情決策,查詢中用到的所有表的sys_statistic數(shù)據(jù)應(yīng)該能保持為最新。通常這個(gè)工作會(huì)由autovacuum daemon負(fù)責(zé)自動(dòng)完成。但是如果一個(gè)表最近在內(nèi)容上有大量的改變,我們可能需要做一次手動(dòng)的ANALYZE而不是等待 autovacuum 捕捉這些改變。

  • 為了執(zhí)行計(jì)劃中每個(gè)結(jié)點(diǎn)的運(yùn)行時(shí)間開銷,當(dāng)前的In order to measure the run-time cost of each node in the execution plan, the current implementation of EXPLAIN ANALYZE實(shí)現(xiàn)為查詢執(zhí)行增加了 profiling overhead 。這樣,在一個(gè)查詢上運(yùn)行EXPLAIN ANALYZE有時(shí)候比正常執(zhí)行該查詢要慢很多。開銷的量取決于該查詢的性質(zhì),以及使用的平臺(tái)。最壞的情況會(huì)發(fā)生在那些自身執(zhí)行時(shí)間很短的結(jié)點(diǎn)上,以及在那些具有相對(duì)較慢的有關(guān)時(shí)間的操作系統(tǒng)調(diào)用的機(jī)器上。

例子
--創(chuàng)建查詢測(cè)試表
create table test2(a int);
insert into test2 select i from generate_series(1, 10000) t(i);

--有一個(gè)具有單個(gè)integer列和 10000 行的表,要顯示在其上的一個(gè)簡(jiǎn)單查詢的計(jì)劃:
POSTGRES=# EXPLAIN SELECT * FROM test2;
                        QUERY PLAN                         
-----------------------------------------------------------
 Seq Scan on TEST2  (cost=0.00..145.00 rows=10000 width=4)
(1 row)

--json格式輸出
POSTGRES=# EXPLAIN (FORMAT JSON) SELECT * FROM test2;
           QUERY PLAN            
---------------------------------
 [                              +
   {                            +
     "Plan": {                  +
       "Node Type": "Seq Scan", +
       "Parallel Aware": false, +
       "Relation Name": "TEST2",+
       "Alias": "TEST2",        +
       "Startup Cost": 0.00,    +
       "Total Cost": 145.00,    +
       "Plan Rows": 10000,      +
       "Plan Width": 4          +
     }                          +
   }                            +
 ]
(1 row)

--加參數(shù)ANALYZE
POSTGRES=# EXPLAIN ANALYZE  SELECT * FROM test2 WHERE a=1000;
                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
 Seq Scan on TEST2  (cost=0.00..170.00 rows=1 width=4) (actual time=0.271..2.354 rows=1 loops=1)
   Filter: (A = 1000)
   Rows Removed by Filter: 9999
 Planning time: 0.045 ms
 Execution time: 2.370 ms
(5 rows)

-- 這里是一個(gè)使用EXPLAIN EXECUTE顯示預(yù)備查詢的執(zhí)行計(jì)劃的例子:
POSTGRES=# PREPARE test2plan(int) AS SELECT * FROM test2 WHERE a=$1;
PREPARE
POSTGRES=# EXPLAIN ANALYZE EXECUTE test2plan(1000);
                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
 Seq Scan on TEST2  (cost=0.00..170.00 rows=1 width=4) (actual time=0.243..2.359 rows=1 loops=1)
   Filter: (A = 1000)
   Rows Removed by Filter: 9999
 Execution time: 2.400 ms
(4 rows)

ANALYZE 收集有關(guān)一個(gè)數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息

ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
  • VERBOSE 允許顯示進(jìn)度消息。
  • table_name 要分析的一個(gè)指定表的名稱(可以是模式限定的)。如果省略,當(dāng)前數(shù)據(jù)庫(kù)中所有常規(guī)表(非外部表)都會(huì)被分析。
  • column_name 要分析的一個(gè)指定列的名稱。默認(rèn)是所有列。

ANALYZE收集一個(gè)數(shù)據(jù)庫(kù)中的表的內(nèi)容的統(tǒng)計(jì)信息,并且將結(jié)果存儲(chǔ)在sys_statistic系統(tǒng)目錄中。接下來(lái),查詢規(guī)劃器會(huì)使用這些統(tǒng)計(jì)信息來(lái)幫助確定查詢最有效的執(zhí)行計(jì)劃。

如果不帶參數(shù),ANALYZE會(huì)檢查當(dāng)前數(shù)據(jù)庫(kù)中的所有表。如果帶有一個(gè)參數(shù),ANALYZE只會(huì)檢查那個(gè)表??梢赃M(jìn)一步給出一個(gè)列名的列表,該情況下只會(huì)收集這些列的統(tǒng)計(jì)信息。

輸出

當(dāng)指定了VERBOSE時(shí),ANALYZE會(huì)發(fā)出進(jìn)度消息來(lái)指示當(dāng)前正在處理哪個(gè)表。還會(huì)打印有關(guān)那些表的多種統(tǒng)計(jì)信息。

說(shuō)明

只有被顯式選中時(shí)才會(huì)分析外部表。并非所有外部數(shù)據(jù)包裝器都支持ANALYZE。如果表的包裝器不支持ANALYZE,該命令會(huì)打印一個(gè)警告并且什么也不做。

在默認(rèn)配置中,自動(dòng)清理守護(hù)進(jìn)程會(huì)在表第一次載入數(shù)據(jù)或者用常規(guī)操作改變時(shí)負(fù)責(zé)表的自動(dòng)分析。當(dāng)啟用自動(dòng)清理時(shí),定期運(yùn)行ANALYZE是個(gè)好主意,或者可以在表內(nèi)容做了大的修改后運(yùn)行ANALYZE。準(zhǔn)確的統(tǒng)計(jì)信息將幫助規(guī)劃器選擇最合適的查詢計(jì)劃,從而提升查詢處理的速度。主讀數(shù)據(jù)庫(kù)的一般策略是在一天中使用量最低時(shí)運(yùn)行一次VACUUM和ANALYZE,如果有大量的更新動(dòng)作則是不夠的。

ANALYZE只要求目標(biāo)表上的一個(gè)讀鎖,因此它可以和表上的其他動(dòng)作并行。

ANALYZE收集的統(tǒng)計(jì)信息通暢包括每列中最常見值的列表以及展示每列中近似數(shù)據(jù)分布的一個(gè)直方圖。如果ANALYZE認(rèn)為這些東西無(wú)趣(例如在一個(gè)唯一鍵列中,沒(méi)有共同值)或者該列的數(shù)據(jù)類型不支持合適的操作符,以上工作都會(huì)被省略。

對(duì)于大型的表,ANALYZE會(huì)對(duì)表內(nèi)容做隨機(jī)采樣而不是檢查每一行。這允許在很少的時(shí)間內(nèi)完成對(duì)大型表的分析。不過(guò)要注意,這些統(tǒng)計(jì)信息只是近似值,并且即使實(shí)際表內(nèi)容沒(méi)有改變,每次運(yùn)行ANALYZE時(shí)統(tǒng)計(jì)信息都會(huì)有微小地改變。這可能會(huì)導(dǎo)致EXPLAIN顯示的規(guī)劃器估算代價(jià)有小的改變。在很少的情況下,這會(huì)非決定性地導(dǎo)致規(guī)劃器的查詢計(jì)劃選擇在ANALYZE運(yùn)行后改變。為了避免這種情況,可以按照下文所述提高ANALYZE所收集的統(tǒng)計(jì)信息量。

通過(guò)調(diào)整default_statistics_target配置變量可以控制分析量,對(duì)每個(gè)列可以用ALTER TABLE ... ALTER COLUMN ... SET STATISTICS設(shè)置每列的統(tǒng)計(jì)信息目標(biāo)。目標(biāo)值會(huì)設(shè)置最常用值列表中的最大項(xiàng)數(shù)以及直方圖中的最大容器數(shù)。默認(rèn)目標(biāo)值是 100,可以把它調(diào)大或者調(diào)小在規(guī)劃器估計(jì)值精度和ANALYZE花費(fèi)的時(shí)間以及sys_statistic所占空間之間做出平衡。特別地,將統(tǒng)計(jì)信息目標(biāo)設(shè)置為零會(huì)禁用該列的統(tǒng)計(jì)信息收集。在查詢的WHERE、GROUP BY或者ORDER BY子句中從不出現(xiàn)的列上這樣做會(huì)有所幫助,因?yàn)橐?guī)劃器用不上這些列上的統(tǒng)計(jì)信息。

被分析的列中最大的統(tǒng)計(jì)信息目標(biāo)決定了為準(zhǔn)備統(tǒng)計(jì)信息要采樣的表行數(shù)。增加該目標(biāo)會(huì)導(dǎo)致做ANALYZE所需的時(shí)間和空間成比例增加。

ANALYZE所估算的值之一是出現(xiàn)在每個(gè)列中的可區(qū)分值。因?yàn)橹粫?huì)檢查行的一個(gè)子集,即便使用最大的統(tǒng)計(jì)信息目標(biāo),這種估計(jì)有時(shí)也可能很不精確。如果這種不精確導(dǎo)致不好的查詢計(jì)劃,可以手工確定一個(gè)更精確的值并且用LTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...)設(shè)置該值。

如果被分析的表有一個(gè)或者更多子女,ANALYZE將會(huì)收集兩次統(tǒng)計(jì)信息:一次只對(duì)父表的行收集,第二次則在父表及其所有子女表的行上收集。在規(guī)劃需要遍歷整個(gè)繼承樹的查詢時(shí)需要第二個(gè)統(tǒng)計(jì)信息集。不過(guò),在決定是否觸發(fā)表上的自動(dòng)分析時(shí),自動(dòng)清理后臺(tái)進(jìn)程將只考慮父表本身上的插入和更新。如果該表很少被插入或者更新,只有手工運(yùn)行ANALYZE時(shí)才會(huì)把繼承統(tǒng)計(jì)信息更新到最新。

如果任何子表是外部表并且其外部數(shù)據(jù)包裝器不支持ANALYZE,在收集繼承統(tǒng)計(jì)信息時(shí)會(huì)忽略那些子表。

如果被分析的表不完全為空,ANALYZE將不會(huì)為該表記錄新統(tǒng)計(jì)信息。任何現(xiàn)有統(tǒng)計(jì)信息將會(huì)被保留。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容