PostgreSQL CREATE STATISTICS

2021-09-09 12:00 更新

CREATE STATISTICS — 定義擴(kuò)展統(tǒng)計

大綱

CREATE STATISTICS [ IF NOT EXISTS ] statistics_name
    [ ( statistics_kind [, ... ] ) ]
    ON column_name, column_name [, ...]
    FROM table_name

描述

CREATE STATISTICS將創(chuàng)建一個新的擴(kuò)展統(tǒng)計對象, 追蹤指定表、外部表或物化視圖的數(shù)據(jù)。該統(tǒng)計對象將在當(dāng)前數(shù)據(jù)庫中創(chuàng)建, 被發(fā)出該命令的用戶所有。

如果給定了模式名(比如,CREATE STATISTICS myschema.mystat ...), 那么在給定的模式中創(chuàng)建統(tǒng)計對象。否則在當(dāng)前模式中創(chuàng)建。 統(tǒng)計對象的名稱必須與相同模式中的任何其他統(tǒng)計對象不同。

參數(shù)

IF NOT EXISTS

如果具有相同名稱的統(tǒng)計對象已經(jīng)存在,不會拋出一個錯誤,只會發(fā)出一個提示。 請注意,這里只考慮統(tǒng)計對象的名稱,不考慮其定義細(xì)節(jié)。

statistics_name

要創(chuàng)建的統(tǒng)計對象的名稱(可以有模式限定)。

statistics_kind

在此統(tǒng)計對象中計算的統(tǒng)計種類。目前支持的種類是啟用n-distinct統(tǒng)計的 ndistinct,啟用功能依賴性統(tǒng)計的dependencies,以及啟用最常見的值列表的mcv。 如果省略該子句,則統(tǒng)計對象中將包含所有支持的統(tǒng)計類型。 有關(guān)更多信息,請參閱第 14.2.2 節(jié)第 70.2 節(jié)。

column_name

被計算的統(tǒng)計信息包含的表格列的名稱。至少必須給出兩個列名,列名的順序可以忽略。

table_name

包含計算統(tǒng)計信息的列的表的名稱(可以是模式限定的)。

注意

你必須是表的所有者才能創(chuàng)建讀取它的統(tǒng)計對象。不過,一旦創(chuàng)建, 統(tǒng)計對象的所有權(quán)與基礎(chǔ)表無關(guān)。

示例

用兩個功能相關(guān)的列創(chuàng)建表t1, 即第一列中的值的信息足以確定另一列中的值。然后, 在這些列上構(gòu)建函數(shù)依賴關(guān)系統(tǒng)計信息:

CREATE TABLE t1 (
    a   int,
    b   int
);

INSERT INTO t1 SELECT i/100, i/500
                 FROM generate_series(1,1000000) s(i);

ANALYZE t1;

-- 匹配行的數(shù)量將被大大低估:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;

ANALYZE t1;

-- 現(xiàn)在行計數(shù)估計會更準(zhǔn)確:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

如果沒有函數(shù)依賴性統(tǒng)計,規(guī)劃器會認(rèn)為兩個WHERE條件是獨立的, 并且會將它們的選擇性乘以一起,以致得到太小的行數(shù)估計。 通過這樣的統(tǒng)計,規(guī)劃器認(rèn)識到WHERE條件是多余的,并且不會低估行數(shù)。

創(chuàng)建表t2與兩個完全相關(guān)的列(包含相同的數(shù)據(jù)),并且在這些列上創(chuàng)建一個MCV列表:

CREATE TABLE t2 (
    a   int,
    b   int
);

INSERT INTO t2 SELECT mod(i,100), mod(i,100)
                 FROM generate_series(1,1000000) s(i);

CREATE STATISTICS s2 (mcv) ON a, b FROM t2;

ANALYZE t2;

-- valid combination (found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1);

-- invalid combination (not found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2);

MCV列表為計劃器提供了關(guān)于表中普遍出現(xiàn)的特定值的更詳細(xì)的信息,以及表中未顯示的值組合的選擇性上限,允許它在這兩種情況下產(chǎn)生更好的估計值。

兼容性

SQL標(biāo)準(zhǔn)中沒有CREATE STATISTICS命令。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號