标签: postgresql

pl/pgsql:从记录中动态获取列名

您好,我想从记录中动态获取列名。如下面的代码所示,我创建了一个游标,并使用循环通过将每一行提取到记录类型 r1 来处理该游标中的每条记录。在我的表中,我有这些列 [dlq_2000,dlq_2001,...,dlq_2017,dlq_2017]。我还在其顶部创建了一个循环来单独处理每一列。

我面临的问题是动态从 r1 获取字段名称,当我运行代码时收到此错误:

[Err] 错误:记录“r1”没有字段“'dlq_'||counter::text”上下文:SQL 语句“SELECT (r1."'dlq_'||counter::text" = 1 )”

请建议如何解决这个问题。

谢谢你,

CREATE OR REPLACE FUNCTION update()
   RETURNS VOID AS $$
DECLARE 
cur SCROLL CURSOR   FOR select * from my_tbl;
r1 RECORD;
begin
OPEN cur ;
FOR counter IN  2000..2017 LOOP
    r1 := NULL;
    LOOP
        FETCH cur INTO r1;
        EXIT WHEN NOT FOUND;

        IF (r1."'dl_'||counter::text" = 1 ) THEN
            -- do some thing
            RAISE NOTICE 'processing year of : %', counter;
        END IF;     
    END LOOP;
END …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql postgresql-9.3

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

如何优化 PostgreSQL 上大型表的最小/最大查询

如何在 PostgreSQL 中对表进行索引,以便最小/最大查询尽快返回?

我有一个包含几亿行的大表。每行都有一个 source_id 和最后更新记录的日期。我想收集每个 source_id 的一些统计信息,特别是每个 source_id 的最小和最大日期范围。

所以我在我的表上创建了这个索引:

 CREATE INDEX CONCURRENTLY mydata_source_last_updated_date ON mydata (source_id, last_updated_date ASC);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用以下命令查询每个源的最短日期时:

SELECT source_id, MIN(last_updated_date) FROM mydata GROUP BY source_id;
Run Code Online (Sandbox Code Playgroud)

查询大约需要一个小时才能完成。

对于这么大的表,即使有索引,这是否是正常的性能?我怎样才能减少这个查询时间?

postgresql performance optimization postgresql-performance

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

Postgres 索引大小计算

在创建索引之前,有什么方法可以粗略估计索引的大小(在磁盘上)?表和每列的大小是已知的。我对索引特别感兴趣GIN。此外,了解不同索引类型的大小如何彼此相关的任何信息。是否有一个一般的经验法则,比如GIN索引总是大于B-TREE索引?或者它是否太依赖于数据大小和分布?

澄清一下:我不是在寻找工具。我很高兴用手做。

postgresql performance index index-tuning

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

为什么 CITEXT 和 TEXT 之间的比较失败?

正如预期的那样,当进行这样的相等测试时,比较成功:

CREATE TABLE citext_test (
    value citext PRIMARY KEY
);

INSERT INTO citext_test VALUES ('one');
INSERT INTO citext_test VALUES ('two');

SELECT * FROM citext_test WHERE value = 'One';
Run Code Online (Sandbox Code Playgroud)

但是,如果要比较的值是“text”类型,则比较失败:

SELECT * FROM citext_test WHERE value = 'One'::text;
Run Code Online (Sandbox Code Playgroud)

使用 EXPLAIN,第一个示例中的原始值似乎被转换为 CITEXT:

Index Only Scan using citext_test_pkey on citext_test  (cost=0.15..8.17 rows=1 width=32)
  Index Cond: (value = 'One'::citext)
Run Code Online (Sandbox Code Playgroud)

我想与连接表中的 TEXT 列进行比较。我真的需要将这些列转换为 CITEXT 才能进行比较吗?我认为使用 CITEXT 的部分优点是不必记住添加这样的东西(例如 LOWER(some_value));

postgresql citext

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

“ALTER DATABASE mydb SET search_path”和“SET search_path”有什么区别?

PostgreSQL 9.6。我刚刚在飞路迁移中发现了这两个命令,彼此相邻。我觉得它们可能是多余的,但是这些陈述有何不同?有理由同时使用两者吗?如果这是重复的,我们深表歉意;我找不到答案。

postgresql

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

解析 COPY 的二进制格式以访问 tsrange

tsrange 如何以二进制形式存储?

例如创建表

CREATE TABLE public.test (t tsrange);
INSERT INTO test VALUES ('[2010-01-01 14:30, 2010-01-01 15:30)');
INSERT INTO test VALUES ('[2011-01-01 14:31, 2015-11-01 15:30)');
INSERT INTO test VALUES ('[2017-01-01 14:31, 2018-11-01 15:30)');
COPY test TO '/tmp/pgcopy' WITH (FORMAT binary);
COPY test TO '/tmp/pgcopy.csv' WITH (FORMAT csv);
Run Code Online (Sandbox Code Playgroud)

它输出:

 cat /tmp/pgcopy.csv                                                                                                                                                                                                  
"[""2010-01-01 14:30:00"",""2010-01-01 15:30:00"")"
"[""2011-01-01 14:31:00"",""2015-11-01 15:30:00"")"
"[""2017-01-01 14:31:00"",""2018-11-01 15:30:00"")"


hexdump -C /tmp/pgcopy
00000000  50 47 43 4f 50 59 0a ff  0d 0a 00 00 00 00 00 00  |PGCOPY..........|
00000010 …
Run Code Online (Sandbox Code Playgroud)

postgresql dump date-format fields copy

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

Postgres GROUP BY id 直接适用于表,但不适用于相同的视图

假设我有两张桌子。其中一个以一对多关系引用另一个:

CREATE TABLE t (
  id SERIAL PRIMARY KEY
, name text
);

INSERT INTO t (name) VALUES ('one'), ('two'), ('three');

CREATE TABLE y (
  id SERIAL PRIMARY KEY
, tid INTEGER REFERENCES t
, amount INTEGER
);

INSERT INTO y (tid, amount) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 1),
(3, 1);
Run Code Online (Sandbox Code Playgroud)

我可以从这些表中查询数据,以获得与 和t上设置的特定条件匹配的行:ty

SELECT row_to_json(t.*) as "t_nogroup" FROM t
JOIN y ON t.id = y.tid
WHERE t.id = 1
AND y.amount > 1; …
Run Code Online (Sandbox Code Playgroud)

postgresql view

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

检查两个表是否具有相同的结构(兼容)

我想知道是否有一种既定的方法来测试两个 PostgreSQL 表/关系是否具有相同的结构。换句话说,如何测试它们是否彼此兼容,因为我可以对它们执行诸如UNION ALL和 之类的集合操作?EXCEPT

我在 DBA.SE 和其他地方搜索,只能找到有关查找两个表的内容是否不同的问题(例如,检查两个表在 PostgreSQL 中是否具有相同的内容),或者当兼容性已知时(例如,比较两个表)具有相同的结构,但成员数量不同)。但我有兴趣检查表结构的兼容性。

我使用的是 PostgreSQL 10.3,但符合标准的方式当然更好。

postgresql metadata union

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

对具有连续开始日期和结束日期的记录进行分组 -Postgresql

我们正在迁移到新的记录管理系统,我正在解决数据迁移的问题。源数据和目标数据都在Postgresql中

在源数据库中,对于同一供应商的每个授权代码以及该授权的开始和结束日期,我们有多个行。

+----------+---------------+------------+-----------+
|  Vendor  | Authorization | Start Date | End Date  | 
+----------+---------------+------------+-----------+
| Vendor 1 | #####         | 1/1/2017   | 2/28/2017 | 
| Vendor 1 | #####         | 3/1/2017   | 4/15/2017 |
| Vendor 2 | #####         | 4/16/2017  | 5/31/2017 |
| Vendor 2 | #####         | 6/1/2017   | 7/12/2017 | 
| Vendor 1 | #####         | 7/13/2017  | 9/30/2017 |
+----------+---------------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)

在目标数据库中,我们有给定时间的活动供应商关系的记录,以及开始日期和结束日期。(Auth # 开始和结束日期单独跟踪)迁移后,前面列出的示例应如下所示。

+----------+------------+-----------+
|  Vendor  | Start Date | End Date  |
+----------+------------+-----------+ …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.6

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

使用端口范围连接到 Postgres

我是 postgres 的新手,我想将它与 postGIS 一起使用。一切都很完美。我使用的默认端口是 5432。我想知道是否可以使用多个端口(即 5430-5431-5432-5433 ...等)或范围(即 5430-5)连接到数据库。这背后的原因是我试图从不同来源获得多个更新,并且我不希望使用同一端口遇到瓶颈。

postgresql

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