有没有办法强制所有文本数据为大写,而不必重复为每个表编写函数或在客户端执行?
我有这些整理:
postgres=# select * from pg_collation; 姓名 | 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 数据库,我很好奇是否可以使用 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 9.4 中有一个表,我对其进行了分区,以便对父分区的所有插入实际上都进入其中一个子分区。问题是在创建分区之前,我的父表中已经有数亿行数据。
父级和子级存在于不同的模式中:
家长:public.history_uint
孩子:partitions.history_uint_p2015_mm_dd
TRUNCATE父母如何而不是孩子?
我有一个带有主表和 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) 有没有办法在 Postgres 9.3.9 中记录单个连接或用户或客户端主机的所有 SQL 查询?
换句话说,我log_statement = all只想要某个用户名或客户端主机名或客户端 IP 或连接 ID。
一种选择是记录所有客户端的 SQL 活动并搜索日志。我希望有更好的方法。
我的数据库突然挂在一些连接许多表的查询上,我看到:
temporary file size exceeds temp_file_limit (1025563kB)
Run Code Online (Sandbox Code Playgroud)
可以在此处查看示例查询和查询计划:
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并挂起。
想象一下,我在 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 值本身大部分不变的元组是否会增加写入负载并且值得优化。
我正在尝试创建一个同时在 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) 在我的应用程序服务器中,我想使用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
postgresql ×10
index ×2
partitioning ×2
collation ×1
count ×1
eav ×1
inheritance ×1
json ×1
localization ×1
log ×1
storage ×1
truncate ×1
update ×1