假设我有表 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)
和 …
仅对某些列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 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
我想知道从 PostgreSQL 中删除大量行的最有效方法是什么,这个过程将是每天重复性任务的一部分,以将数据(插入 + 删除的增量)批量导入表中。可能有数千甚至数百万行要删除。
我有一个主键文件,每行一个。我想到的两个选项与下面的内容一致,但我对 PostgreSQL 的内部结构知之甚少,无法做出最好的明智决定。
DELETE使用简单WHERE的主键对文件中的每一行执行查询(或n使用IN()子句分批删除)COPY命令将主键导入到临时表中,然后使用连接从主表中删除任何建议将不胜感激!
我有一个名为“A”的数据库,它有两个模式“B”和“C”。
我想在不同的服务器上备份和恢复架构“B”(包括数据)。不知道如何做到这一点,因为我是 Postgres 的新手。
我是否必须在名为“A”的新服务器上创建一个新数据库,然后在其上恢复架构“B”?
请帮助执行必要的命令。
在 Ubuntu 12.04 上运行的 PostgreSQL 9.1
假设我有两个 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。
但是当有继承时,我不知道该怎么做。
我使用以下命令创建了一个超级用户门户
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 命令更改用户以启用门户用户登录。我想了解为什么超级用户无法登录。
我在 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 数据库设计,我想知道如何最好地存储时间戳。
不同时区的用户将使用数据库执行所有 CRUD 功能。
我查看了 2 个选项:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
因为timestamp我会发送一个字符串来表示 INSERT 时刻的确切(UTC)时间戳。
因为bigint我会存储完全相同的东西,但以数字格式存储。(时区问题是在将毫秒移交给服务器之前处理的,因此总是以 UTC 为单位的毫秒。)
存储 a 的一个主要优点bigint可能是它更容易存储和检索,因为传递正确格式的时间戳比简单的数字(自 Unix Epoc 以来的毫秒)更复杂。
我的问题是哪种方法可以实现最灵活的设计,以及每种方法可能存在哪些缺陷。
我试图决定数据库设计,在这个阶段尽可能少的假设(关于 web 应用程序的实际发展)。
作为第一步,了解 JOINS 是昂贵的,我正在考虑少量的整体表,而不是大量的规范化较小的表。第二点,我在使用 hstore 与常规表与 JSONB(使用 GiST 索引)之间感到困惑。
AFAIK(请随时纠正):
通常,在 Postgres 中,已知 hstore 的性能优于其他数据类型。来自 FOSDEM PGDAY 的这个演讲有一些有趣的统计数据(在幻灯片的后半部分)。 https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf
hstore 的一个优势是快速索引(GiN 或 GiST)。但是,使用 JSONB,GiN 和 GiST 索引也可以应用于 JSON 数据。
来自第二象限的专业人士的这篇博客说“此时可能值得在所有新应用程序中用 jsonb 替换 hstore 使用”(滚动到最后):http ://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary -jsonhstore-dynamic-columns/
所以我想决定以下几点: