在 Postgres 中,可以创建您自己的配置参数,例如在会话或事务期间持续存在的“cookie”。
这是这样完成的:
SELECT set_config(setting_name, new_value, is_local)
or
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
Run Code Online (Sandbox Code Playgroud)
本地应该仅在事务期间持续存在,但即使在事务之后它也会影响配置参数 - 而不是所述参数无法识别,它现在将被设置为空字符串。
如何在不重新连接的情况下再次无法识别该参数?
这不起作用:
SELECT set_config('settings.myapp.value', null, true);
RESET settings.myapp.value;
Run Code Online (Sandbox Code Playgroud)
这不会返回 NULL,而是给出空字符串:
SELECT current_setting('settings.myapp.value', true);
Run Code Online (Sandbox Code Playgroud)
我当然可以解决这个问题,但我想知道是否可以以某种方式将配置参数的状态恢复到“仅事务”更改之前的状态。
SELECT nullif(current_setting('settings.myapp.value', true), '');
Run Code Online (Sandbox Code Playgroud) 我有2个表,我需要加入包含整数数组的列.
CREATE TABLE table_array_1 (key1 int, values1 int[]);
CREATE TABLE table_array_2 (key2 int, values2 int[]);
Run Code Online (Sandbox Code Playgroud)
一个表有少量行但数组大小:
DO $function$
DECLARE
i int := 0;
BEGIN
WHILE i < 100 LOOP
INSERT INTO table_array_1 (key1, values1) values(random(1, i), (SELECT array_agg(random(3000000, 4000000)) FROM (SELECT generate_series(1, random(1, 2000))) lp));
i := i + 1;
END LOOP;
END;
$function$
Run Code Online (Sandbox Code Playgroud)
第二个表有更多行,但是数组大小:
DO $function$
DECLARE
i int := 0;
BEGIN
WHILE i < 1000 LOOP
INSERT INTO table_array_2 (key2, values2) values(random(1, i), (SELECT array_agg(random(3000000, 4000000)) FROM …Run Code Online (Sandbox Code Playgroud) 我偶然发现了我的SQL函数非常奇怪的问题.他们似乎有功能之间不同的执行计划language SQL和language plpgsql,但我不能告诉的执行计划设置为SQL版本,因为它需要这样的:Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING.不会让我用EXPLAIN.
至于我为什么知道他们有不同的计划,这是因为SQL版本执行失败,抱怨它不能连接到当前撤下国外服务器之一.使用外部表进行连接,并且该表按日期(列date_col)进行分区,其中一些分区在物理上位于同一服务器上,一些分区位于外部.函数中使用的日期参数确保它只应扫描一个分区,并且该分区位于同一服务器上.这也显示在explain下面使用plain SQL(不在函数中):
Append (cost=2.77..39.52 rows=2 width=36)
CTE ct
-> Result (cost=0.00..0.51 rows=100 width=4)
InitPlan 2 (returns $1)
-> Aggregate (cost=2.25..2.26 rows=1 width=32)
-> CTE Scan on ct (cost=0.00..2.00 rows=100 width=4)
-> Seq Scan on table1 (cost=0.00..0.00 rows=1 width=36)
Filter: ((date_col = '2017-07-30'::date) AND (some_col = ANY ($1)))
-> Seq Scan on …Run Code Online (Sandbox Code Playgroud)