小编Erw*_*ter的帖子

PostgreSQL 强制所有数据大写

有没有办法强制所有文本数据为大写,而不必重复为每个表编写函数或在客户端执行?

postgresql postgresql-9.4 case-sensitive

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

向 Postgres 数据库添加新的排序规则

我有这些整理:

postgres=# select * from pg_collat​​ion;
  姓名 | collnamespace | 领主| collencoding | 整理 | 类型  
------------+--------------+-----------+--------- -----+-------------+------------
 默认 | 11 | 10 | -1 | |
 C | 11 | 10 | -1 | C | C
 POSIX | 11 | 10 | -1 | POSIX | POSIX
 zh_CN | 11 | 10 | 6 | en_US.utf8 | en_US.utf8
 en_US.utf8 | 11 | 10 | 6 | en_US.utf8 | en_US.utf8
 ucs_basic | 11 | 10 | 6 | C …

postgresql collation localization

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

Postgres 9.4+:JSONB 而不是 EAV

我正在想办法构建一个新的 PostgreSQL 数据库,我很好奇是否可以使用 JSONB 列而不是 EAV 模型来存储实体的属性。这似乎是一种灵活的方式来存储这些东西。

在 EAV 情况下,我将有 3 个表:

materials (mat_id, mat_name, mat_descr)
material_properties (prop_id, prop_name, prop_desc)
material_property_values (mat_id, prop_id, val)
Run Code Online (Sandbox Code Playgroud)

每种材料都可以有一组不同的属性。

有什么原因我不应该只mat_props JSONB在我的materials表中添加一列,并将所有属性存储在那里{"name":"value"}?这样,将属性作为列进行查询将非常简单:

SELECT mat_name, mat_props->'name' as propval FROM materials
Run Code Online (Sandbox Code Playgroud)

而不是连接或子选择。

另外,我是否可以在materials表中添加此列,或者将其保存在单独的表中是否会更高效:

material_properties (mat_id, properties JSONB)
Run Code Online (Sandbox Code Playgroud)

postgresql database-design eav json

6
推荐指数
1
解决办法
2161
查看次数

截断父表但不截断子表

我在 PostgreSQL 9.4 中有一个表,我对其进行了分区,以便对父分区的所有插入实际上都进入其中一个子分区。问题是在创建分区之前,我的父表中已经有数亿行数据。

父级和子级存在于不同的模式中:

家长:public.history_uint
孩子:partitions.history_uint_p2015_mm_dd

这是我创建分区的方式。

TRUNCATE父母如何而不是孩子?

postgresql partitioning truncate postgresql-9.4

6
推荐指数
1
解决办法
1985
查看次数

索引不与表继承一起使用

我有一个带有主表和 2 个子表的 PostgreSQL 9.0.12 数据库。我的表:

CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(15),
    ts timestamp without time zone
);
CREATE INDEX ON test2(ts);

CREATE TABLE test2_20150812 (
    CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);

CREATE TABLE test2_20150811 (
    CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);

CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);
VACUUM FULL ANALYZE;
Run Code Online (Sandbox Code Playgroud)

我的选择查询的解释结果(数据库中没有任何行):

EXPLAIN (ANALYZE, BUFFERS) …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan partitioning inheritance

6
推荐指数
1
解决办法
2123
查看次数

如何记录单个连接或用户或客户端主机的所有 SQL 查询?

有没有办法在 Postgres 9.3.9 中记录单个连接或用户或客户端主机的所有 SQL 查询?

换句话说,我log_statement = all只想要某个用户名或客户端主机名或客户端 IP 或连接 ID。

一种选择是记录所有客户端的 SQL 活动并搜索日志。我希望有更好的方法。

postgresql log postgresql-9.3

6
推荐指数
1
解决办法
2448
查看次数

错误:“临时文件大小超过 temp_file_limit”

我的数据库突然挂在一些连接许多表的查询上,我看到:

temporary file size exceeds temp_file_limit (1025563kB)
Run Code Online (Sandbox Code Playgroud)

可以在此处查看示例查询和查询计划:

https://pastebin.com/wug86Wrr

http://www.sharecsv.com/s/a6333a7f610e049dd81ebcfc19a4c02f/temp_file_limit_exceeded.csv

此查询通常需要不到 100 毫秒,但在达到临时文件大小限制时会挂起。

当我跑步时:

SELECT temp_files AS "Temporary files", temp_bytes AS "Size of temporary files"
FROM pg_stat_database db;
Run Code Online (Sandbox Code Playgroud)

我懂了:

Temporary files  Size of temporary files
---
22550            10651900248
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?


我能够解决更多问题。假设用户列出他们可以说 2 种语言 - 查询运行正常。然后他们编辑自己的个人资料,表示自己懂得 20 种语言。查询最终超出temp_file_limit并挂起。

postgresql configuration

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

为 UPDATE 写入的 TOAST 行是否不会更改 TOASTable 列?

想象一下,我在 Postgres 13 中有一个像这样的表:

CREATE TABLE public.people (
    id integer PRIMARY KEY,
    full_name character varying(255),
    bio text
);
Run Code Online (Sandbox Code Playgroud)

然后,我插入一行包含足够字符的行,以便将简介写入 TOAST 表:

# insert into people values (1, 'joe user', (SELECT array_to_string(ARRAY(SELECT chr((65 + round(random() * 25)) :: integer) FROM generate_series(1,4000)), '')));
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)

最后,我更新该行而不更改 TOAST 列:

# update people set full_name='jane user' where id=1;
UPDATE 1
Run Code Online (Sandbox Code Playgroud)

是否UPDATE更改关联 TOAST 表中的任何行(或根本需要任何写入)?

上下文:我正在处理一些每秒有数千个事务的数据库表,并且观察到服务器上的写入负载非常高。我想知道UPDATETOAST 中具有较大值但 TOAST 值本身大部分不变的元组是否会增加写入负载并且值得优化。

postgresql storage update

6
推荐指数
1
解决办法
741
查看次数

为 WHERE 和 ORDER BY 创建多列索引

我正在尝试创建一个同时在 WHERE 和 ORDER BY 子句中使用的索引。阅读 Postgres 14 文档(11.4.索引和 ORDER BY - https://www.postgresql.org/docs/14/indexes-ordering.html)让我相信:

除了简单地查找查询要返回的行之外,索引还可以按特定的排序顺序传递它们。这允许遵守查询的 ORDER BY 规范,而无需单独的排序步骤。

哇,听起来棒极了,我们来试试吧!我创建了一个测试表,一个包含 WHERE 和 ORDER BY 列的索引,并用数据填充它:

DROP TABLE IF EXISTS testdata;
CREATE TABLE testdata
(
    question_id   TEXT        NOT NULL UNIQUE PRIMARY KEY,
    answerer_id   TEXT        NOT NULL,
    question_date TIMESTAMPTZ NOT NULL,
    answer_date   TIMESTAMPTZ NOT NULL
);

DROP INDEX IF EXISTS idx1;
CREATE INDEX idx1 ON testdata (answerer_id, answer_date, question_date);

TRUNCATE testdata;
INSERT INTO testdata(question_id, answerer_id, question_date, answer_date)
SELECT CONCAT('question_', LPAD(i::TEXT, 4, '0')),
       CONCAT('answerer_', …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan

6
推荐指数
1
解决办法
1225
查看次数

COUNT(1) OVER (PARTITION BY NULL) 的性能损失

在我的应用程序服务器中,我想使用LIMIT和对数据集进行分页OFFSET,并另外将数据集的总数返回给用户。

而不是对数据库进行两次远程调用:

select count(1) as total_count from foo;
select c1 from foo;
Run Code Online (Sandbox Code Playgroud)

我认为在单个数据库调用中完成此操作会更明智:

select c1, count(1) over (partition by null) from foo;
Run Code Online (Sandbox Code Playgroud)

但是,与不使用窗口函数相比,添加此窗口函数会导致执行时间长一个数量级。

我觉得这很令人惊讶,因为类似的时间select count(1) from foo只需要两倍的时间select c1 from foo。然而,将其转换为窗口函数会导致性能下降。

此外,使用以下使用子查询的替代方案非常快:

select c1, (select count(1) from foo) as total_count from foo;
Run Code Online (Sandbox Code Playgroud)

我本来期望 postgresql 能够优化partition by null

我在 Oracle 中尝试过这一点,发现了类似的性能损失。

如何解释为什么这里会出现性能损失?对于核心 postgresql 开发人员来说,进行更改以优化这一点是否相对容易,甚至值得,例如通过将 PARTITION BY NULL 的窗口函数转换为子查询?


设置:

drop table foo;
create table foo (c1 int);

insert into foo
select i from …
Run Code Online (Sandbox Code Playgroud)

postgresql count window-functions postgresql-performance postgresql-13

6
推荐指数
1
解决办法
4772
查看次数