标签: postgresql

使用 postgreSQL 触发器获取唯一更新的字段?

有没有办法使用可以从记录中获取唯一更新字段的触发器?我只是在测试审计跟踪日志,因此它可以在更新时将字段名称与其其他信息一起保存。我不想使用 IF 语句,因为我的表中可能有 200 多个字段。

postgresql audit

4
推荐指数
1
解决办法
2524
查看次数

在一段时间内生成一系列月份

我想在特定时间段内生成一系列月份。

我试过了:

select  GENERATE_SERIES( '06/25/2016'::DATE, '12/15/2016'::DATE, '1 month' )
Run Code Online (Sandbox Code Playgroud)

它返回:

select  GENERATE_SERIES( '06/25/2016'::DATE, '12/15/2016'::DATE, '1 month' )
Run Code Online (Sandbox Code Playgroud)

结束日期有问题。我想要的结果如下:

"generate_series"
"2016-06-25 00:00:00-06"
"2016-07-25 00:00:00-06"
"2016-08-25 00:00:00-06"
"2016-09-25 00:00:00-06"
"2016-10-25 00:00:00-06"
"2016-11-25 00:00:00-07"
Run Code Online (Sandbox Code Playgroud)

我正在使用 PostgreSQL。

postgresql datetime

4
推荐指数
1
解决办法
7035
查看次数

postgresql:如何知道函数何时被修改

场景:有人在 PostgreSQL 数据库中创建了一个名为“foo”的函数。接下来,有人修改了函数“foo”的内部工作原理。

问题:PostgreSQL 是否提供了一种方法来知道谁修改了函数“foo”以及何时修改了“foo”?

postgresql

4
推荐指数
1
解决办法
739
查看次数

即使存在正确的索引,聚合列也会导致全表扫描

我有一个查询,我想从 date_ added 列排序的表数据集中获取前几行。排序依据的列被索引,所以这个表的基本版本非常快:

SELECT datasets.id FROM datasets ORDER BY date_added LIMIT 25
Run Code Online (Sandbox Code Playgroud)

"Limit  (cost=0.28..6.48 rows=25 width=12) (actual time=0.040..0.092 rows=25 loops=1)"
"  ->  Index Scan using datasets_date_added_idx2 on datasets  (cost=0.28..1244.19 rows=5016 width=12) (actual time=0.037..0.086 rows=25 loops=1)"
"Planning time: 0.484 ms"
"Execution time: 0.139 ms"
Run Code Online (Sandbox Code Playgroud)

但是一旦我使查询变得更复杂,我就会遇到问题。我想加入另一个表示多对多关系的表,并将结果聚合在一个数组列中。为此,我需要添加一个 GROUP BY id 子句:

SELECT datasets.id FROM datasets GROUP BY datasets.id ORDER BY date_added LIMIT 25
Run Code Online (Sandbox Code Playgroud)

"Limit  (cost=551.41..551.47 rows=25 width=12) (actual time=9.926..9.931 rows=25 loops=1)"
"  ->  Sort  (cost=551.41..563.95 rows=5016 width=12) (actual time=9.924..9.926 rows=25 loops=1)"
" …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization postgresql-9.5 query-performance

4
推荐指数
1
解决办法
1046
查看次数

将 current_setting('the_setting') 的结果赋给 PL/pgSQL 中的一个变量

我有一个函数,我需要获取一个配置参数并将其分配给我稍后将在函数中使用的变量。问题是当配置参数不被识别(因为它还不存在)时,函数就会死亡。我想评估是否可以分配变量,如果不能为其设置空值。

这是我尝试过的:

   DECLARE
      conf_param text;
      num integer;

   BEGIN
      SELECT current_setting('the_setting') INTO conf_param;
         -- here is where dies when the_setting is not recognized!
      IF FOUND THEN
         num := conf_param::integer;
      ELSE
         num := NULL;
      END IF;
      -- more stuff
Run Code Online (Sandbox Code Playgroud)

我不确定我使用Found的方式是否需要。

postgresql parameter plpgsql

4
推荐指数
1
解决办法
3860
查看次数

Postgres 计划中的“结果”节点和“附加”节点中实际发生了什么?

我有一个表(postgres 9.6),它按日期划分为大约 70 个子表。

EXPLAIN下面的输出被截断,因为它的大部分是每个子表的相同位图索引/堆扫描(这里是完整的详细输出)。我感兴趣的部分是树顶部附近的AppendResult节点。

  1. 从我能够收集到的(例如这里和其他地方),Append只是所有子查询的总和。事实上,它需要比这长约 3.5 秒。多余的从哪里来?
  2. I can only find the one reference to Resultwhich states当您的查询选择某个常量值时,将使用此操作。此节点大约需要 7 秒,但查询未选择常量值。

如果可能的话,我很想节省这 10 秒,但我实际上并不知道这些节点在做什么,所以我不知道该尝试什么。

EXPLAIN ANALYZE 输出:

  ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
  ?                                                                                      QUERY PLAN                                                                                       ?
  ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
  ? HashAggregate  (cost=4459946.40..4473566.96 rows=1089645 width=64) (actual time=26289.308..26419.989 rows=190112 loops=1)                                                             ?
  ?   Group Key: frontend_prescription.processing_date, frontend_prescription.pct_id, substr((frontend_prescription.presentation_code)::text, 1, 9)                                       ?
  ?   Buffers: shared hit=172527                                                                                                                                                          ?
  ?   ->  Result  (cost=0.00..4296499.68 rows=10896448 width=60) …
Run Code Online (Sandbox Code Playgroud)

postgresql explain postgresql-9.6

4
推荐指数
1
解决办法
1044
查看次数

PostgreSQL 范围边界上的外键

是否可以在 PostgreSQL 9.6 中对范围(在我的情况下为整数)的下限和上限应用外键约束?

目前我将下限和上限保留在两列中,但希望将它们统一到一个范围列中,同时保留外键引用。

例子

我有一个包含会话列表的表,例如:

CREATE TABLE sessions (
    session_id    SERIAL      PRIMARY KEY,
    session_start TIMESTAMPTZ NOT NULL,
    description   TEXT
);
Run Code Online (Sandbox Code Playgroud)

然后是这些会议的组表,目前表示为:

CREATE TABLE session_groups (
    group_id      SERIAL  PRIMARY KEY,
    first_session INTEGER NOT NULL UNIQUE,
    last_session  INTEGER NOT NULL UNIQUE,
    description   TEXT,

    FOREIGN KEY (first_session)
                REFERENCES sessions (session_id)
                ON UPDATE CASCADE
                ON DELETE RESTRICT,
    FOREIGN KEY (last_session)
                REFERENCES sessions (session_id)
                ON UPDATE CASCADE
                ON DELETE RESTRICT,

    CONSTRAINT last_session_after_first
         CHECK (last_session >= first_session)
);
Run Code Online (Sandbox Code Playgroud)

我想要什么:

CREATE TABLE session_groups (
    group_id …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key range-types postgresql-9.6

4
推荐指数
1
解决办法
831
查看次数

为 Postgresql 后端设置临时文件的位置 (9.3.10)

是否可以为 Postgresql 后端(9.3.10 版)设置临时文件创建的位置?

这是我的场景:我的 Postgresql 数据库驻留在带有 Ubuntu 14.04 操作系统的专用 VM 中。我的 VM 带有由我的基础架构提供商提供的200GB 临时高性能 SSD 存储,用于应用程序和进程的短期存储。这是它的样子:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       221G  9.9G  200G   5% /mnt
Run Code Online (Sandbox Code Playgroud)

我的磁盘空间不足,必须运行一些分析查询,由于临时文件的创建,这些查询可能使我的磁盘已满。

除了采取删除日志条目以释放更多空间或temp_file_limit在 postgresql conf 中设置等措施外,我还想知道是否可以设置临时文件的位置。毕竟,我有 220GB 可用于这些场景,所以一定要好好利用它们(交换空间也在这里设置)。

由于我是一名新手 DBA,因此我可以通过一个说明性示例来说明如何进行设置。

postgresql disk-space postgresql-9.3

4
推荐指数
2
解决办法
9504
查看次数

为什么 JSON 元素在不是文本时返回文本?

当我尝试使用一个 JSON 元素访问时,->>'elementName'我得到了一个text类型。

SELECT pg_typeof(x1->>'a'), jsonb_typeof(x2)
FROM ( VALUES
  ('{"a":5}'::jsonb, '5'::jsonb)
) AS t(x1,x2);

 pg_typeof | jsonb_typeof 
-----------+--------------
 text      | number
(1 row)
Run Code Online (Sandbox Code Playgroud)

但是,jsonb表示它将数字映射到数字类型......

将文本 JSON 输入转换为 jsonb 时,RFC 7159 描述的原始类型有效地映射到本机 PostgreSQL 类型,如表 8-23 所示。

这是从文档中复制的表格,

表 8-23。JSON 原始类型和对应的 PostgreSQL 类型

JSON primitive type     PostgreSQL type  Notes
string                  text             \u0000 is disallowed, as are non-ASCII Unicode escapes if database encoding is not UTF8
number                  numeric          NaN and infinity values are disallowed
boolean                 boolean …
Run Code Online (Sandbox Code Playgroud)

postgresql datatypes database-internals json operator

4
推荐指数
1
解决办法
1780
查看次数

来自 Postgres 更新监视器的连接超时错误 (postgres 9.6)

我在 Windows 10 上运行 PostgreSQL 9.6

它似乎有一个更新监视器,它不使用有关 Windows 委托代理的任何信息(我们有一个公司代理)。它也不查看环境变量 HTTP_PROXY 或 HTTPS_PROXY(我已将其设置为通过 CNTLM 为我们的公司防火墙添加凭据)。这对于 NPM 和 GIT 等需要通过我们的传出防火墙的程序很有用。

因此,我每 10 或几分钟收到以下消息,作为从名为的程序弹出的消息:

"D:\Program Files (x86)\postgresql\updatemonitor\bin\UpdManager.exe" --execute  "D:\Program Files\PostgreSQL\9.6\bin\stackbuilder.exe"
Run Code Online (Sandbox Code Playgroud)

该消息非常具有欺骗性,但我找到了该程序,它是上面列出的程序。

在此处输入图片说明

postgresql enterprisedb

4
推荐指数
2
解决办法
4860
查看次数