查看 PostgreSQL 文档,GRANT 命令似乎只授予单个用户或角色。事实上,这似乎不仅仅是 PostgreSQL 的问题。
不可能做类似的事情GRANT SELECT UPDATE ON atable TO mary, bob, sue吗?
对我来说,这似乎是一个重大遗漏,或者有什么历史或实际原因吗?
我有一个约 3.2 亿的行表,我在上面运行以下查询:
UPDATE my_table SET state = TRIM(state)
Run Code Online (Sandbox Code Playgroud)
不用说,这已经运行了 90 多个小时(从星期四下午开始)并且还没有完成。
我想或多或少地知道它到目前为止修改了多少行。有没有办法从正在运行的事务中获取这些信息?
尝试搜索时,我发现如何使用该函数粗略估计将有多少新行添加到表中pgstattuple:
select dead_tuple_count from pgstattuple('my_table');
Run Code Online (Sandbox Code Playgroud)
但这似乎没有显示关于修改了多少行的任何有趣信息。
我阅读了有关postgres bloom的文档,但无法重现相同的结果,请帮助我了解我错过了什么。我的服务器是:
SHOW server_version;
server_version
-------------------------------
10.6 (Debian 10.6-1.pgdg90+1)
dev=# show random_page_cost;
random_page_cost
------------------
4
Run Code Online (Sandbox Code Playgroud)
首先使用与文档中相同的命令创建表:
dev=# CREATE TABLE tbloom AS
SELECT
(random() * 1000000)::int as i1,
(random() * 1000000)::int as i2,
(random() * 1000000)::int as i3,
(random() * 1000000)::int as i4,
(random() * 1000000)::int as i5,
(random() * 1000000)::int as i6
FROM
generate_series(1,10000000);
Run Code Online (Sandbox Code Playgroud)
接下来我创建 btree 索引
dev=# CREATE index btreeidx ON tbloom (i1, i2, i3, i4, i5, i6);
CREATE INDEX
Run Code Online (Sandbox Code Playgroud)
并获得下一个计划:
dev=# EXPLAIN ANALYZE SELECT * FROM …Run Code Online (Sandbox Code Playgroud) tl; dr:处理由 jit 引起的性能下降的最佳方法是什么?
背景:
最近我从 postgres 11 迁移到 12 并注意到,一些查询/程序运行得相当慢。我做了一些研究并测试了不同的配置 - 结果表明 jit 开销超过了它的收益。我看到两种可能的解决方案:
通过运行set jit = off;一次永久禁用所有查询的 jit 。这有帮助,但感觉不自然。(也许是因为更改了默认配置,我没有做太多,因为没有这样的需要。默认值是理智的,需要更改的可能性很小。)这也意味着在运行长查询时放弃可能的性能提升.
在程序开始时禁用 jit 并在结束时启用它。我反对更改配置对并行运行的查询的影响。当然,这会损害日志查询的性能,这些查询会同时运行,但这可能会导致其他可能难以检测的错误。此外,这似乎比第一个解决方案更不正确 - 作为程序的一部分更改配置。
处理这个问题的最好方法是微调配置,这样 jit 就不会被完全丢弃,而且配置也不会在运行时改变。不幸的是,我发现几乎没有任何资源如何,这将是可能的(只有像参数jit_above_cost中的文件,似乎是帮助不大)。
问题:解决此问题的最佳方法是什么?除了运行和测量之外,是否有关于何时禁用 jit 的任何标准?是否可以微调行为(例如,针对特定查询禁用 jit)?
我有这个:
CREATE TABLE people
(
id bigserial,
timestamp timestamptz DEFAULT now() NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE "personal information"
(
id bigserial,
"person id" bigint NOT NULL,
timestamp timestamptz DEFAULT now() NOT NULL,
"data's timestamp" timestamptz,
"field" text NOT NULL,
"value" text,
PRIMARY KEY (id),
FOREIGN KEY ("person id") REFERENCES people (id) ON UPDATE CASCADE ON DELETE CASCADE
);
INSERT INTO people RETURNING id; -- Syntax error.
INSERT INTO people; -- Syntax error.
Run Code Online (Sandbox Code Playgroud)
为什么我的插入失败?事实上,“people”表中的所有列都是自动的:该id列是一个 bigserial,并且该列timestamp …
尽管听起来可能与这个问题有关,但事实并非如此,因为我很喜欢使用 unix 套接字而不是 TCP/IP 套接字。
但是,我无法使用 unix 套接字和带有 pgAdmin4 的 ssh 隧道连接到远程 PostgreSQL 数据库。pgAdmin 总是声称服务器拒绝连接并要求输入密码,这让我感到奇怪。当 sshing 进入服务器并使用 psql 时,可以使用 unix 套接字(/var/run/postgresql)完美地建立连接。是否需要设置任何特殊的东西来允许这样的设置,或者这甚至可能是 pgAdmin 本身的一个错误?我很感激任何解决此问题的想法,而不必求助于远程端的 TCP/IP 连接。
我还从我当前的配置中发布了一些屏幕:
我有一个查询,当一个键冲突时,只有在其他列之一发生更改时才会向上插入 Postgres(以避免不必要的插入和返回的行,但实际上没有任何更改):
INSERT INTO public.test_upsert (some_id, a, b, note)
VALUES
('c', 1, true, 'asdf')
ON CONFLICT (some_id)
DO UPDATE SET
a = excluded.a,
b = excluded.b,
note = excluded.note
WHERE
test_upsert.a IS DISTINCT FROM excluded.a OR
test_upsert.b IS DISTINCT FROM excluded.b OR
test_upsert.note IS DISTINCT FROM excluded.note
RETURNING *;
Run Code Online (Sandbox Code Playgroud)
我的问题是:这个有简写吗?我基本上想在插入的任何列与现有列不同时插入新记录更新行。单独写出每一列会变得非常冗长,尽管它更明确。
对于所有这些查询:
SELECT label FROM personal.storage_disks ORDER BY label ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "C" ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "POSIX" ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "default" ASC;
Run Code Online (Sandbox Code Playgroud)
输出总是:DISK 1, DISK 10, DISK 2, DISK 3, [...]
但是,我想要并期望:DISK 1, DISK 2, DISK 3, [...] DISK 10
我现在没有根据SELECT * FROM pg_collation;......尝试的排序规则,除非我应该使用具有神秘名称的许多非常奇怪的排序规则之一。(我什至尝试了一堆结果相同的方法。)
请注意,我已经阅读了现有的看似相关的 SE 问题以及许多关于 的文章SORT BY,但它们没有帮助,也没有为我清除任何内容。
我正在使用 PostgreSQL 12.4
使用 ssl 运行 postgreSQL 13.2。
我需要从需要连接 URI 的第三方应用程序连接到数据库,但它不起作用。因此,我使用具有相同凭据的两种不同格式测试了与 psql 的连接。一个有效,一个没有。
以下命令将我以 myuser 用户身份登录到 mydb:
# psql -U myuser -d mydb -h 127.0.0.1 -p 5432 -W
Password:
psql (13.2 (Debian 13.2-1.pgdg100+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
mydb=>
Run Code Online (Sandbox Code Playgroud)
但是这个命令失败了:
# psql postgresql://myuser:MYPASSWORD@127.0.0.1:5432/mydb?sslmode=require
psql: error: FATAL: password authentication failed for user "myuser"
Run Code Online (Sandbox Code Playgroud)
我正在使用完全相同的凭据。我已经验证了 10 多次。删除“sslmode=require”并不能解决问题。
我的 pg_hba.conf 文件包含:
host mydb myuser 127.0.0.1/32 password
Run Code Online (Sandbox Code Playgroud)
我把它放在我的 pg_hba.conf 文件的第一行,所以它不会挂在任何其他行上。
我究竟做错了什么?
我们在查询生产数据库中的表时遇到问题。一个文本列将与我们在 where 子句中过滤的字符串相等,但 postgres 不会选择该行。(我们在 postgres 11.11 上)我们的表设置如下:
(PROD)=> \d names;
Table "public.names"
Column | Type | Collation | Nullable | Default
----------------------+-----------------------------+-----------+----------+---------
name | text | | not null |
processed_name | text | | not null |
name_index | integer | | not null |
when_created | timestamp without time zone | | not null |
Indexes:
"names_pkey" PRIMARY KEY, btree (name, processed_name)
"names_name_index_key" UNIQUE CONSTRAINT, btree (name_index)
"ix_names_name" btree (name)
"ix_names_processed_name" btree (processed_name)
Run Code Online (Sandbox Code Playgroud)
当我们处理名称列表时,我们会检查它们是否已经在表中,以防止重复添加和违反主键约束。
然而,在一个名字上,'?????? ????????? ???????',查看名称是否已经存在的查询返回一个空集, …
postgresql ×10
syntax ×2
update ×2
collation ×1
connectivity ×1
index ×1
insert ×1
jit ×1
monitoring ×1
natural-sort ×1
permissions ×1
pgadmin-4 ×1
sorting ×1
string ×1
upsert ×1
users ×1