91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL如何初始定義及初始化

發布時間:2021-10-21 10:43:22 來源:億速云 閱讀:430 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關PostgreSQL如何初始定義及初始化,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

配置參數(或者叫GUC變量,grand unified configuration)常見的就是出現在 postgresql.conf 中的設置項,更多信息可查看文檔 19. Server Configuration ,我主要講他們在代碼中是如何設置和發揮作用。

主要講不同類型的初始定義。

1、不同類型對應的結構體

除了前篇提到的通用結構體,每個類型都有自己的定義,例如布爾型:

struct config_bool
{
	struct config_generic gen;
	/* constant fields, must be set correctly in initial value: */
	bool	   *variable;
	bool		boot_val;
	GucBoolCheckHook check_hook;
	GucBoolAssignHook assign_hook;
	GucShowHook show_hook;
	/* variable fields, initialized at runtime: */
	bool		reset_val;
	void	   *reset_extra;
};

所有類型結構體的第一個成員都是名為gen的 config_generic 結構體,再比如整型:

struct config_int
{
	struct config_generic gen;
	/* constant fields, must be set correctly in initial value: */
...

這樣的代碼設計在PG里隨處可見,可以理解為類似C++的繼承,在使用過程中可以根據gen成員的值知道一個結構體指針實際對應的類型,比如:

	struct config_generic *conf;
...
	conf = guc_variables[varnum];
...
	/* now get the type specific attributes */
	switch (conf->vartype)
	{
		case PGC_BOOL:
			{
				struct config_bool *lconf = (struct config_bool *) conf;
...
				/* boot_val */
				values[12] = pstrdup(lconf->boot_val ? "on" : "off");
...

讀到一個 config_generic 結構體成員 vartype 是 PGC_BOOL,既可以知道它實際指向的是一個 config_bool 類型結構體。

2、配置參數初始定義(src/backend/utils/misc/guc.c

布爾型配置參數定義為結構體數組 ConfigureNamesBool:

static struct config_bool ConfigureNamesBool[] =
{
	{
		{"enable_seqscan", PGC_USERSET, QUERY_TUNING_METHOD,
			gettext_noop("Enables the planner's use of sequential-scan plans."),
			NULL
		},
		&enable_seqscan,
		true,
		NULL, NULL, NULL
	},
...

第一部分是 gen 成員定義,分別是上篇提到的:配置參數名、所處上下文、分類、短描述、長描述,它們的值分別為:enable_seqscan、PGC_USERSET(允許普通用戶設置)、QUERY_TUNING_METHOD(Query Tuning / Planner Method Configuration)、等等。

其他類型也都各有自己的定義數組:

static struct config_int ConfigureNamesInt[] =
static struct config_real ConfigureNamesReal[] =

等等,不再贅述。

每個參數都有一個成員boot_val,啟動時的初始值,它的類型跟參數一致,比如config_bool中是bool,而config_int中是int。上例中 enable_seqscan 的初始值是 true,這個值跟postgresql.conf中的默認值一致。

3、啟動時的類型初始化

函數 build_guc_variables()

	for (i = 0; ConfigureNamesInt[i].gen.name; i++)
	{
		struct config_int *conf = &ConfigureNamesInt[i];

		conf->gen.vartype = PGC_INT;
		num_vars++;
	}

在這里賦予參數類型,每個數組容納不同類型參數,不需要在定義時挨個指定,只定義前幾個成員的值即可。

所有不同類型的參數指針放在同一個數組中,并按名字排序。

4、啟動時的值初始化

類型初始化函數在 InitializeGUCOptions() 中調用,隨后馬上為每個參數調用 InitializeOneGUCOption

以字符串參數為例

				if (conf->boot_val != NULL)
					newval = guc_strdup(FATAL, conf->boot_val);
				else
					newval = NULL;

				if (!call_string_check_hook(conf, &newval, &extra,
											PGC_S_DEFAULT, LOG))
					elog(FATAL, "failed to initialize %s to \"%s\"",
						 conf->gen.name, newval ? newval : "");
				if (conf->assign_hook)
					conf->assign_hook(newval, extra);
				*conf->variable = conf->reset_val = newval;
				conf->gen.extra = conf->reset_extra = extra;

這里很簡單,就是以 boot_val 初始化其他成員。

大家肯定注意到結構體里還有三個hook的定義,這里用到了兩個,有興趣可以自行了解。

5、環境變量對配置的影響

見函數 InitializeGUCOptionsFromEnvironment,這里不再展開,回頭跟SET命令或者配置文件的讀取一起講。

上邊是數據庫進程啟動時(包括后端進程的啟動)配置參數初始化,寫得很粗,可能有遺漏。

上述就是小編為大家分享的PostgreSQL如何初始定義及初始化了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富顺县| 万山特区| 涿鹿县| 罗源县| 江西省| 包头市| 湾仔区| 邹平县| 宜黄县| 舟曲县| 松滋市| 绥江县| 包头市| 武穴市| 宾川县| 巴林左旗| 武陟县| 林周县| 垣曲县| 柘荣县| 南充市| 通海县| 白朗县| 荔波县| 日喀则市| 万盛区| 崇信县| 喜德县| 英吉沙县| 绥德县| 翼城县| 金华市| 黄骅市| 巴马| 会东县| 龙海市| 黄浦区| 伊春市| 巨鹿县| 莱西市| 凌海市|