小编Łuk*_*ski的帖子

如何删除配置参数

在 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)

postgresql postgresql-9.6 postgresql-10

6
推荐指数
1
解决办法
2402
查看次数

Postgresql数组&&运算符执行速度低于预期

样本数据

我有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)

postgresql performance postgresql-9.6

5
推荐指数
1
解决办法
783
查看次数

为什么Postgres SQL函数会扫描不应该分区的分区

我偶然发现了我的SQL函数非常奇怪的问题.他们似乎有功能之间不同的执行计划language SQLlanguage 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)

postgresql partitioning

5
推荐指数
1
解决办法
333
查看次数