标签: postgresql

我可以为左外连接提供默认值吗?

假设我有表 a(列 a1)和 b(列 b1 和 b2)并且我执行左外连接

SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Run Code Online (Sandbox Code Playgroud)

然后 b1 和 b2 将为 NULL,其中 a1 的值没有 b1 的匹配值。

我可以为 b2 提供默认值而不是 NULL 吗?需要注意的是COALESCE不会在这里工作,因为我希望默认值来覆盖潜在的NULL在B2那里B1匹配A1的值。

也就是说,将 a 和 b 作为

CREATE TABLE a (a1)
  AS VALUES (1),
            (2),
            (3) ;

CREATE TABLE b (b1,b2)
  AS VALUES (1, 10),
            (3, null) ;


a1     b1 | b2
---    --------
 1      1 | 10
 2      3 | NULL
 3
Run Code Online (Sandbox Code Playgroud)

和 …

postgresql join

33
推荐指数
2
解决办法
7万
查看次数

使用 row_to_json 创建 JSON 时将名称设置为属性

仅对某些列f1, f2, f3...使用row_to_json函数时,是否可以重命名默认名称?

我可以

row_to_json(customers)

回来

{"id_customer":2,"first_name":"bla","last_name":"second_bla"}

但是如果我只想要没有 的名字id_customer,我必须使用

row_to_json(row(first_name, last_name))

然后我得到

{"f1":"bla","f2":"second_bla"}

我想用默认列名或我自己的列名来获得这个结果。我知道我可以创建自己的复合类型并使用

row_to_json(row(first_name, last_name))::my_custom_type

但是在不创建该类型的情况下是否可以在查询中正确执行此操作?

postgresql

32
推荐指数
4
解决办法
3万
查看次数

日期索引优化

我在 PostgreSQL 9.0.8 中有一个很大的对象表(15M+ 行),我想查询过时的字段。

出于可扩展性和并发性的目的,我想将查询除以数百万,并且我想获取具有几天前日期的 updated_at 字段的所有数据。

我已经在 100 万个 ID 上尝试了许多索引和查询,但使用 Heroku 的 Ronin 硬件似乎无法在 100 秒内获得性能。

我正在寻找我尚未尝试使其尽可能高效的建议。

尝试 #1

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE (date(updated_at)) < (date(now())-7) AND id >= 5000001 AND id < 6000001;
 INDEX USED: (date(updated_at),id)
 268578.934 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #2

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE ((date(now()) - (date(updated_at)) > 7)) AND id >= 5000001 AND id < 6000001;
 INDEX USED: primary key
 335555.144 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #3

 EXPLAIN ANALYZE SELECT count(*) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index partitioning postgresql-performance

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

从 postgres 批量删除行的最有效方法

我想知道从 PostgreSQL 中删除大量行的最有效方法是什么,这个过程将是每天重复性任务的一部分,以将数据(插入 + 删除的增量)批量导入表中。可能有数千甚至数百万行要删除。

我有一个主键文件,每行一个。我想到的两个选项与下面的内容一致,但我对 PostgreSQL 的内部结构知之甚少,无法做出最好的明智决定。

  • DELETE使用简单WHERE的主键对文件中的每一行执行查询(或n使用IN()子句分批删除)
  • 使用COPY命令将主键导入到临时表中,然后使用连接从主表中删除

任何建议将不胜感激!

postgresql delete bulk

32
推荐指数
2
解决办法
5万
查看次数

仅备份一个架构并将其还原到另一台服务器上

我有一个名为“A”的数据库,它有两个模式“B”和“C”。

我想在不同的服务器上备份和恢复架构“B”(包括数据)。不知道如何做到这一点,因为我是 Postgres 的新手。

我是否必须在名为“A”的新服务器上创建一个新数据库,然后在其上恢复架构“B”?

请帮助执行必要的命令。

在 Ubuntu 12.04 上运行的 PostgreSQL 9.1

schema postgresql backup postgresql-9.1

32
推荐指数
3
解决办法
9万
查看次数

如何获取用户所属的所有角色(包括继承的角色)?

假设我有两个 Postgresql 数据库组,“authors”和“editors”,以及两个用户,“maxwell”和“ernest”。

create role authors;

create role editors;

create user maxwell;

create user ernest;

grant authors to editors; --editors can do what authors can do

grant editors to maxwell; --maxwell is an editor

grant authors to ernest; --ernest is an author
Run Code Online (Sandbox Code Playgroud)

我想编写一个高性能函数,它返回 maxwell 所属的角色列表(最好是他们的 oid),如下所示:

create or replace function get_all_roles() returns oid[] ...
Run Code Online (Sandbox Code Playgroud)

它应该返回 maxwell、authors 和 editors(但不是 ernest)的 oid。

但是当有继承时,我不知道该怎么做。

postgresql role access-control users postgresql-9.3

32
推荐指数
4
解决办法
7万
查看次数

不允许超级用户登录

我使用以下命令创建了一个超级用户门户

create role portal with superuser password 'portal'
Run Code Online (Sandbox Code Playgroud)

当我尝试使用门户用户登录 postgres 时,我在 Rails 中收到以下错误。

FATAL:  role "portal" is not permitted to log in
Run Code Online (Sandbox Code Playgroud)

我无法理解正在发生的事情。

当然,我可以使用 login 命令更改用户以启用门户用户登录。我想了解为什么超级用户无法登录。

postgresql

32
推荐指数
2
解决办法
5万
查看次数

为什么我的 PostgreSQL ORDER BY 不区分大小写?

我在 Debian 上运行 Postgres 9.4.4,我得到以下ORDER BY行为:

veure_test=# show LC_COLLATE;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
 regexp_split_to_table 
-----------------------
 a
 A
 b
 c
 Capacitor
 CD
 d
 D
(8 rows)
Run Code Online (Sandbox Code Playgroud)

并且uname -a

Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

但是,在我的 iMac 上,使用 Postgres 9.3.4,我得到以下信息:

veure_test=# show LC_COLLATE;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' …
Run Code Online (Sandbox Code Playgroud)

postgresql collation

32
推荐指数
1
解决办法
2万
查看次数

如何最好地在 PostgreSQL 中存储时间戳?

我正在研究 PostgreSQL 数据库设计,我想知道如何最好地存储时间戳。

假设

不同时区的用户将使用数据库执行所有 CRUD 功能。

我查看了 2 个选项:

  • timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')

  • bigint NOT NULL DEFAULT

因为timestamp我会发送一个字符串来表示 INSERT 时刻的确切(UTC)时间戳。

因为bigint我会存储完全相同的东西,但以数字格式存储。(时区问题是在将毫秒移交给服务器之前处理的,因此总是以 UTC 为单位的毫秒。)

存储 a 的一个主要优点bigint可能是它更容易存储和检索,因为传递正确格式的时间戳比简单的数字(自 Unix Epoc 以来的毫秒)更复杂。

我的问题是哪种方法可以实现最灵活的设计,以及每种方法可能存在哪些缺陷。

postgresql datatypes timestamp utc-time timezone

32
推荐指数
2
解决办法
5万
查看次数

带索引的 JSONB 与 hstore

我试图决定数据库设计,在这个阶段尽可能少的假设(关于 web 应用程序的实际发展)。

作为第一步,了解 JOINS 是昂贵的,我正在考虑少量的整体表,而不是大量的规范化较小的表。第二点,我在使用 hstore 与常规表与 JSONB(使用 GiST 索引)之间感到困惑。

AFAIK(请随时纠正):

  1. 通常,在 Postgres 中,已知 hstore 的性能优于其他数据类型。来自 FOSDEM PGDAY 的这个演讲有一些有趣的统计数据(在幻灯片的后半部分)。 https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf

  2. hstore 的一个优势是快速索引(GiN 或 GiST)。但是,使用 JSONB,GiN 和 GiST 索引也可以应用于 JSON 数据。

  3. 来自第二象限的专业人士的这篇博客说“此时可能值得在所有新应用程序中用 jsonb 替换 hstore 使用”(滚动到最后):http ://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary -jsonhstore-dynamic-columns/

所以我想决定以下几点:

  1. 对于数据的主要(结构化)部分:它应该放在几个关系表中(相对较大,有很多列),还是应该是使用 hstore 的多个键值存储?
  2. 对于临时(用户贡献/非结构化)数据,它应该是 JSON 还是 hstore 中的临时键值存储(键存储在主要关系表之一中)?

postgresql database-design

32
推荐指数
1
解决办法
2万
查看次数