有效果的網(wǎng)站排名網(wǎng)絡(luò)營銷學(xué)校
數(shù)據(jù)庫表參數(shù)
- default_reloptions 函數(shù)
- 案例
聲明:本文的部分內(nèi)容參考了他人的文章。在編寫過程中,我們尊重他人的知識(shí)產(chǎn)權(quán)和學(xué)術(shù)成果,力求遵循合理使用原則,并在適用的情況下注明引用來源。
本文主要參考了《PostgresSQL數(shù)據(jù)庫內(nèi)核分析》一書,OpenGauss1.1.0 的開源代碼和《OpenGauss數(shù)據(jù)庫源碼解析》一書以及OpenGauss社區(qū)學(xué)習(xí)文檔
default_reloptions 函數(shù)
??default_reloptions 函數(shù)是一個(gè)選項(xiàng)解析器,用于處理與數(shù)據(jù)庫關(guān)系(表或視圖)相關(guān)的選項(xiàng)。它接受一個(gè)包含關(guān)系選項(xiàng)的參數(shù),然后解析和驗(yàn)證這些選項(xiàng),將它們存儲(chǔ)在一個(gè)特定的數(shù)據(jù)結(jié)構(gòu)中(StdRdOptions)。這個(gè)函數(shù)的主要目的是允許用戶或數(shù)據(jù)庫管理員通過選項(xiàng)來自定義和配置關(guān)系的各種屬性和行為,例如填充因子、自動(dòng)化清理策略、安全性設(shè)置等。它是數(shù)據(jù)庫系統(tǒng)中對關(guān)系配置的重要組成部分,以實(shí)現(xiàn)更好的性能和行為控制。
??default_reloptions 函數(shù)的作用是接收傳入的關(guān)系選項(xiàng)(以二進(jìn)制形式表示),然后將這些選項(xiàng)解析和驗(yàn)證,最后將它們存儲(chǔ)在一個(gè)特定的數(shù)據(jù)結(jié)構(gòu)(StdRdOptions)中,以便在數(shù)據(jù)庫系統(tǒng)中配置和管理關(guān)系的各種屬性和行為,如填充因子、自動(dòng)化清理策略、安全性設(shè)置等。這個(gè)函數(shù)允許數(shù)據(jù)庫管理員或應(yīng)用程序開發(fā)人員根據(jù)需要自定義和配置關(guān)系的行為和性能特性。
??default_reloptions 函數(shù)源碼如下所示:(路徑:src/gausskernel/storage/access/common/reloptions.cpp
)
/* * 為使用StdRdOptions的任何內(nèi)容(例如fillfactor和autovacuum)提供選項(xiàng)解析器* reloptions:傳入的關(guān)系選項(xiàng),以二進(jìn)制形式表示* validate:指示是否進(jìn)行驗(yàn)證的標(biāo)志* kind:關(guān)系選項(xiàng)的類型,通常是RELOPT_KIND_HEAP或RELOPT_KIND_TOAST*/
bytea *default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
{relopt_value *options = NULL; // 存儲(chǔ)解析后的選項(xiàng)值的數(shù)組StdRdOptions *rdopts = NULL; // 存儲(chǔ)最終結(jié)果的數(shù)據(jù)結(jié)構(gòu)int numoptions; // 選項(xiàng)數(shù)量static const relopt_parse_elt tab[] = {// 定義選項(xiàng)名稱、類型和存儲(chǔ)位置的映射數(shù)組// 每個(gè)元素包括選項(xiàng)名稱、數(shù)據(jù)類型和在StdRdOptions結(jié)構(gòu)中的偏移量// 用于將選項(xiàng)值解析到對應(yīng)的字段中// 更多選項(xiàng)可以在這里添加{ "fillfactor", RELOPT_TYPE_INT, offsetof(StdRdOptions, fillfactor) },{ "autovacuum_enabled", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, enabled) },{ "autovacuum_vacuum_threshold", RELOPT_TYPE_INT,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, vacuum_threshold) },{ "autovacuum_analyze_threshold", RELOPT_TYPE_INT,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, analyze_threshold) },{ "autovacuum_vacuum_cost_delay", RELOPT_TYPE_INT,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, vacuum_cost_delay) },{ "autovacuum_vacuum_cost_limit", RELOPT_TYPE_INT,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, vacuum_cost_limit) },{ "autovacuum_freeze_min_age", RELOPT_TYPE_INT64,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, freeze_min_age) },{ "autovacuum_freeze_max_age", RELOPT_TYPE_INT64,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, freeze_max_age) },{ "autovacuum_freeze_table_age", RELOPT_TYPE_INT64,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, freeze_table_age) },{ "autovacuum_vacuum_scale_factor", RELOPT_TYPE_REAL,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, vacuum_scale_factor) },{ "autovacuum_analyze_scale_factor", RELOPT_TYPE_REAL,offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, analyze_scale_factor) },{ "security_barrier", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, security_barrier) },{ "enable_rowsecurity", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, enable_rowsecurity) },{ "force_rowsecurity", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, force_rowsecurity) },{ "enable_tsdb_delta", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, enable_tsdb_delta) },{ "tsdb_deltamerge_interval", RELOPT_TYPE_INT, offsetof(StdRdOptions, tsdb_deltamerge_interval) },{ "tsdb_deltamerge_threshold", RELOPT_TYPE_INT, offsetof(StdRdOptions, tsdb_deltamerge_threshold) },{ "tsdb_deltainsert_threshold", RELOPT_TYPE_INT, offsetof(StdRdOptions, tsdb_deltainsert_threshold) },{ "max_batchrow", RELOPT_TYPE_INT, offsetof(StdRdOptions, max_batch_rows) },{ "deltarow_threshold", RELOPT_TYPE_INT, offsetof(StdRdOptions, delta_rows_threshold) },{ "partial_cluster_rows", RELOPT_TYPE_INT, offsetof(StdRdOptions, partial_cluster_rows) },{ "internal_mask", RELOPT_TYPE_INT, offsetof(StdRdOptions, internalMask) },{ "orientation", RELOPT_TYPE_STRING, offsetof(StdRdOptions, orientation) },{ "compression", RELOPT_TYPE_STRING, offsetof(StdRdOptions, compression) },{"table_access_method", RELOPT_TYPE_STRING, offsetof(StdRdOptions, table_access_method)},{ "ttl", RELOPT_TYPE_STRING, offsetof(StdRdOptions, ttl) },{ "period", RELOPT_TYPE_STRING, offsetof(StdRdOptions, period) },{ "string_optimize", RELOPT_TYPE_STRING, offsetof(StdRdOptions, string_optimize) },{ "partition_interval", RELOPT_TYPE_STRING, offsetof(StdRdOptions, partition_interval) },{ "time_column", RELOPT_TYPE_STRING, offsetof(StdRdOptions, time_column) },{ "ttl_interval", RELOPT_TYPE_STRING, offsetof(StdRdOptions, ttl_interval) },{ "gather_interval", RELOPT_TYPE_STRING, offsetof(StdRdOptions, gather_interval) },{ "version", RELOPT_TYPE_STRING, offsetof(StdRdOptions, version) },{ "compresslevel", RELOPT_TYPE_INT, offsetof(StdRdOptions, compresslevel) },{ "ignore_enable_hadoop_env", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, ignore_enable_hadoop_env) },{ "append_mode", RELOPT_TYPE_STRING, offsetof(StdRdOptions, append_mode) },{ "merge_list", RELOPT_TYPE_STRING, offsetof(StdRdOptions, merge_list) },{ "rel_cn_oid", RELOPT_TYPE_INT, offsetof(StdRdOptions, rel_cn_oid) },{ "append_mode_internal", RELOPT_TYPE_INT, offsetof(StdRdOptions, append_mode_internal) },{ "start_ctid_internal", RELOPT_TYPE_STRING, offsetof(StdRdOptions, start_ctid_internal) },{ "end_ctid_internal", RELOPT_TYPE_STRING, offsetof(StdRdOptions, end_ctid_internal) },{ "user_catalog_table", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, user_catalog_table) },{ "hashbucket", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, hashbucket) },{ "primarynode", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, primarynode) },{ "on_commit_delete_rows", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, on_commit_delete_rows)},{ "wait_clean_gpi", RELOPT_TYPE_STRING, offsetof(StdRdOptions, wait_clean_gpi)}};// 解析傳入的關(guān)系選項(xiàng),將其存儲(chǔ)在options數(shù)組中,并返回選項(xiàng)數(shù)量options = parseRelOptions(reloptions, validate, kind, &numoptions);/* if none set, we're done */// 如果沒有設(shè)置任何選項(xiàng),則返回NULLif (numoptions == 0)return NULL;// 為rdopts分配內(nèi)存,根據(jù)StdRdOptions結(jié)構(gòu)的大小以及選項(xiàng)數(shù)量rdopts = (StdRdOptions *)allocateReloptStruct(sizeof(StdRdOptions), options, numoptions);// 使用解析后的選項(xiàng)填充rdopts結(jié)構(gòu),將選項(xiàng)值分配到對應(yīng)的字段中fillRelOptions((void *)rdopts, sizeof(StdRdOptions), options, numoptions, validate, tab, lengthof(tab));// 釋放options數(shù)組中的字符串值的內(nèi)存for (int i = 0; i < numoptions; i++) {if (options[i].gen->type == RELOPT_TYPE_STRING && options[i].isset)pfree(options[i].values.string_val);}pfree(options);// 返回結(jié)果,以bytea類型的數(shù)據(jù)返回StdRdOptions結(jié)構(gòu)return (bytea *)rdopts;
}
??其中,表(或關(guān)系)的選項(xiàng)的配置如下表所示:
參 數(shù) | 含 義 |
---|---|
fillfactor | 設(shè)置表的填充因子,用于指定在表的數(shù)據(jù)頁中保留多少空間,以便將來插入新行。 |
autovacuum_enabled | 一個(gè)布爾值,指定是否啟用了自動(dòng)化清理和分析。 |
autovacuum_vacuum_threshold | 自動(dòng)清理操作的觸發(fā)閾值,當(dāng)表中的行數(shù)超過此閾值時(shí),將執(zhí)行自動(dòng)清理操作。 |
autovacuum_analyze_threshold | 自動(dòng)分析操作的觸發(fā)閾值,當(dāng)表中的行數(shù)超過此閾值時(shí),將執(zhí)行自動(dòng)分析操作。 |
autovacuum_vacuum_cost_delay | 自動(dòng)清理操作的成本延遲,以控制其執(zhí)行速度。 |
autovacuum_vacuum_cost_limit | 自動(dòng)清理操作的成本限制,以控制資源消耗。 |
autovacuum_freeze_min_age | 觸發(fā)自動(dòng)凍結(jié)的最小年齡,用于維護(hù)事務(wù)ID凍結(jié)的表。 |
autovacuum_freeze_max_age | 觸發(fā)自動(dòng)凍結(jié)的最大年齡,用于維護(hù)事務(wù)ID凍結(jié)的表。 |
autovacuum_freeze_table_age | 自動(dòng)凍結(jié)表的年齡,用于維護(hù)事務(wù)ID凍結(jié)的表。 |
autovacuum_vacuum_scale_factor | 自動(dòng)清理的比例因子。 |
autovacuum_analyze_scale_factor | 自動(dòng)分析的比例因子。 |
security_barrier | 一個(gè)布爾值,指定是否啟用了安全屏障。 |
enable_rowsecurity | 一個(gè)布爾值,指定是否啟用了行級安全性。 |
force_rowsecurity | 一個(gè)布爾值,指定是否強(qiáng)制啟用了行級安全性。 |
enable_tsdb_delta | 一個(gè)布爾值,指定是否啟用了時(shí)序數(shù)據(jù)庫(TSDB)的增量數(shù)據(jù)存儲(chǔ)。 |
tsdb_deltamerge_interval | TSDB增量數(shù)據(jù)合并的時(shí)間間隔。 |
tsdb_deltamerge_threshold | TSDB增量數(shù)據(jù)合并的閾值。 |
tsdb_deltainsert_threshold | TSDB增量數(shù)據(jù)插入的閾值。 |
max_batchrow | 最大批量行數(shù)。 |
deltarow_threshold | 增量行的閾值。 |
partial_cluster_rows | 部分聚集行的數(shù)量。 |
internal_mask | 內(nèi)部掩碼。 |
orientation | 表的方向。 |
compression | 數(shù)據(jù)的壓縮方式。 |
table_access_method | 表的訪問方法。 |
ttl | 表的生存時(shí)間。 |
period | 表的周期。 |
string_optimize | 字符串優(yōu)化。 |
partition_interval | 分區(qū)間隔。 |
time_column | 時(shí)間列。 |
ttl_interval | 生存時(shí)間間隔。 |
gather_interval | 聚集間隔。 |
version | 版本。 |
compresslevel | 壓縮級別。 |
ignore_enable_hadoop_env | 是否忽略啟用Hadoop環(huán)境。 |
append_mode | 附加模式。 |
merge_list | 合并列表。 |
rel_cn_oid | 關(guān)系CN OID。 |
append_mode_internal | 內(nèi)部附加模式。 |
start_ctid_internal | 內(nèi)部起始CTID。 |
end_ctid_internal | 內(nèi)部結(jié)束CTID。 |
user_catalog_table | 是否為用戶目錄表。 |
hashbucket | 是否為哈希桶。 |
primarynode | 是否為主節(jié)點(diǎn)。 |
on_commit_delete_rows | 提交時(shí)刪除行。 |
wait_clean_gpi | 等待清理GPI。 |
??這些選項(xiàng)配置了表的各種屬性和行為,以滿足特定的數(shù)據(jù)庫需求。
案例
??接下來,我們通過幾個(gè)案例來觀察其中的幾個(gè)代表參數(shù)的實(shí)際作用,來了解一下這些參數(shù)的意義。具體案例如下:
1. 創(chuàng)建存儲(chǔ)表,執(zhí)行以下 SQL 語句:
CREATE TABLE test_table (id serial PRIMARY KEY,name text
) WITH (fillfactor = 70, -- 設(shè)置填充因子autovacuum_enabled = true, -- 啟用自動(dòng)清理和分析autovacuum_vacuum_threshold = 1000, -- 自動(dòng)清理觸發(fā)閾值autovacuum_analyze_threshold = 500, -- 自動(dòng)分析觸發(fā)閾值autovacuum_vacuum_cost_delay = 10, -- 自動(dòng)清理成本延遲autovacuum_vacuum_cost_limit = 1000, -- 自動(dòng)清理成本限制compression = 'lz4' -- 數(shù)據(jù)壓縮方式
);postgres=# \d+ test_tableTable "public.test_table"Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+---------------------------------------------------------+----------+--------------+-------------id | integer | not null default nextval('test_table_id_seq'::regclass) | plain | |name | text | | extended | |
Has OIDs: no
Options: orientation=column, autovacuum_enabled=true, autovacuum_analyze_threshold=500, compression=low
2. 插入一些示例數(shù)據(jù)到列存儲(chǔ)表中:
DO $$
DECLAREcounter INT := 1;
BEGINFOR counter IN 1..1500 LOOPINSERT INTO test_table (name) VALUES ('Item ' || counter);END LOOP;
END $$;postgres=# select * from test_table;id | name
------+-----------1 | Item 12 | Item 23 | Item 34 | Item 45 | Item 56 | Item 67 | Item 78 | Item 89 | Item 910 | Item 1011 | Item 1112 | Item 1213 | Item 1314 | Item 1415 | Item 1516 | Item 1617 | Item 1718 | Item 1819 | Item 1920 | Item 2021 | Item 2122 | Item 2223 | Item 2324 | Item 2425 | Item 2526 | Item 2627 | Item 2728 | Item 2829 | Item 2930 | Item 3031 | Item 3132 | Item 3233 | Item 3334 | Item 3435 | Item 3536 | Item 3637 | Item 3738 | Item 3839 | Item 39
--More--
3. 執(zhí)行自動(dòng)分析并查看統(tǒng)計(jì)信息:
SELECT schemaname,relname,last_vacuum,last_autovacuum,last_analyze,last_autoanalyze,vacuum_count,autovacuum_count,analyze_count,autoanalyze_count
FROM pg_stat_all_tables
WHERE relname = 'test_table';schemaname | relname | last_vacuum | last_autovacuum | last_analyze | last_autoanalyze | vacuum_count | autovacuum_count | anal
yze_count | autoanalyze_count
------------+------------+-------------+-----------------+-------------------------------+-------------------------------+--------------+------------------+-----
----------+-------------------public | test_table | | | 2023-10-07 11:32:20.377228+08 | 2023-10-07 11:32:20.377228+08 | 0 | 0 |1 | 1
(1 row)
??可以看到,當(dāng)表中的數(shù)據(jù)量達(dá)到自動(dòng)分觸發(fā)閾值時(shí) autovacuum_analyze_threshold ,則會(huì)執(zhí)行自動(dòng)分析 autoanalyze。
4. 執(zhí)行自動(dòng)清理:
??在PostgreSQL數(shù)據(jù)庫中,自動(dòng)觸發(fā)autovacuum_vacuum_threshold選項(xiàng)所定義的自動(dòng)清理(autovacuum)操作通常由數(shù)據(jù)庫自身的內(nèi)部機(jī)制控制。autovacuum_vacuum_threshold是一個(gè)配置選項(xiàng),它定義了當(dāng)表中的行數(shù)達(dá)到指定閾值時(shí),自動(dòng)觸發(fā)VACUUM操作的條件。
要觸發(fā)自動(dòng)清理,需要滿足以下條件:
- 表的行數(shù)超過了autovacuum_vacuum_threshold所定義的閾值。
- 自動(dòng)清理(autovacuum)進(jìn)程處于活動(dòng)狀態(tài),通常是后臺(tái)運(yùn)行的自動(dòng)清理進(jìn)程。
??自動(dòng)清理進(jìn)程會(huì)定期檢查表的狀態(tài)并根據(jù)一系列配置選項(xiàng)來決定是否執(zhí)行VACUUM操作。autovacuum_vacuum_threshold只是其中之一。其他配置選項(xiàng)還包括autovacuum_analyze_threshold、autovacuum_freeze_max_age等,它們影響了自動(dòng)清理的行為。
??需要注意的是,autovacuum進(jìn)程通常會(huì)在數(shù)據(jù)庫空閑時(shí)執(zhí)行自動(dòng)清理操作,以避免干擾正在進(jìn)行的活動(dòng)查詢和事務(wù)。此外,autovacuum的行為也可以通過其他配置選項(xiàng)進(jìn)行微調(diào),以滿足特定應(yīng)用場景的需求。
??總之,要觸發(fā)autovacuum_vacuum_threshold自動(dòng)清理,需要確保表的行數(shù)達(dá)到了指定閾值,并確保autovacuum進(jìn)程處于活動(dòng)狀態(tài),它會(huì)自動(dòng)監(jiān)測并執(zhí)行相應(yīng)的清理操作。
SELECT schemaname,relname,last_vacuum,last_autovacuum,last_analyze,last_autoanalyze,vacuum_count,autovacuum_count,analyze_count,autoanalyze_count
FROM pg_stat_all_tables
WHERE relname = 'test_table';schemaname | relname | last_vacuum | last_autovacuum | last_analyze | last_autoanalyze | vacuum_count | autov
acuum_count | analyze_count | autoanalyze_count
------------+------------+-------------------------------+-----------------+-------------------------------+-------------------------------+--------------+------
------------+---------------+-------------------public | test_table | 2023-10-07 15:35:41.430136+08 |2023-10-07 15:35:41.430136+08| 2023-10-07 15:32:22.660942+08 | 2023-10-07 15:32:22.660942+08 | 1 |0 | 2 | 2
(1 row)
??這里不一一列舉表(或關(guān)系)的選項(xiàng)的配置的案例,如需要詳細(xì)了解可以查詢相關(guān)手冊。