我看到频繁引用WITH查询(公共表表达式,或 CTE)充当优化栅栏,服务器不允许将过滤器下推到 CTE 查询中,将公共表达式从 CTE 中拉出等。它经常被声称成为 SQL 标准要求的行为。
CTE绝对是PostgreSQL 中的优化栅栏……但这是标准要求的,还是实际上只是实现细节?
例如,这些邮件列表帖子声称或建议它是标准的:
在评论中提到它之后,我被问到它的指定位置 - 在查看了 SQL:2008 的唯一草案后,我可以访问我并没有太多运气找到它。
我还没有深入研究标准,所以我希望有人提出建议:标准实际上是否需要PostgreSQL中CTE的优化围栏?如果是这样,它在哪里指定?还是 Pg 邮件列表上的陈述有误?
另见todo list上的线程CTE优化围栏?.
有人可以解释VACUUMPostgreSQL 中这些类型之间的区别吗?
我阅读了文档,但它只是说FULL锁定表并FREEZE“冻结”元组。我认为那是一样的。我错了吗?
我有这个 SQL:
CREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
INSERT INTO test(data) VALUES
('{"parent":null,"children":[2,3]}'),
('{"parent":1, "children":[4,5]}'),
('{"parent":1, "children":[]}'),
('{"parent":2, "children":[]}'),
('{"parent":2, "children":[]}');
Run Code Online (Sandbox Code Playgroud)
那会给:
id | data
----+--------------------------------------
1 | {"parent": null, "children": [2, 3]}
2 | {"parent": 1, "children": [4, 5]}
3 | {"parent": 1, "children": []}
4 | {"parent": 2, "children": []}
5 | {"parent": 2, "children": []}
Run Code Online (Sandbox Code Playgroud)
当进行正常的一对多时,它会显示如下内容:
SELECT *
FROM test x1
LEFT JOIN test x2
ON x1.id = (x2.data->>'parent')::INT;
id | data | id | …Run Code Online (Sandbox Code Playgroud) 假设我们有一个包含四列(a,b,c,d)相同数据类型的表。
是否可以选择列中数据中的所有不同值并将它们作为单个列返回,或者我是否必须创建一个函数来实现这一点?
postgresql performance postgresql-9.4 distinct postgresql-performance
在跨越 18 个月内跨越 1,000 多个实体的交易数据库中,我想运行一个查询,将每个可能的 30 天期间entity_id按其交易金额的总和和该 30 天内的交易计数进行分组,并且以我可以查询的方式返回数据。经过大量测试,这段代码完成了我想要的大部分内容:
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb;
Run Code Online (Sandbox Code Playgroud)
我将在更大的查询中使用类似的结构:
SELECT * FROM (
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND …Run Code Online (Sandbox Code Playgroud) 我有一个系统,我无法控制某些表的设计(通过 Slony-I 复制),所以我有一系列我们称之为“影子表”的东西,我从复制的表中提取一些信息,并将其存储在我需要的处理形式中,同时剥离我想忽略的记录。
现在,在设置新副本后,我运行更新并将值设置回自身(例如,UPDATE tablename SET field=field)以强制运行触发器,但有些表有数百万条记录,并且还在增长,可能需要 30 分钟. (然后还有真空)。
有没有更好的方法来触发它,或者有什么方法可以编写一个函数,使其可以处理传入的输入或NEW取决于调用上下文?我不愿意保留两个不同的功能,因为我已经看到太多次更新一个而不是另一个。
我正在使用 Ubuntu Server 10.10 并且我已经使用apt-get install postgresql. 我想使用内置sha1()功能,但似乎必须先安装pgcrypto。但我不知道如何安装它。
没有pgcrypto,如果我尝试使用安装它apt-get install pgcrypto,我不找到以任何文件pgcrypto在我的系统(我想find / -name "pgcrypto*")。
如何安装 pgcrypto 以便我可以digest('word-to-hash','sha1')在我的数据库查询中使用该函数?
更新:我正在努力在另一台 Ubuntu 机器上安装 pgcrypto。使用sudo apt-get install postgresql-contrib-8.4如何将软件包安装到我当前的 PostgreSQL 数据库后安装软件包?
如何在 PostgreSQL 中将字符串转换为双精度?
我试过类似的东西:
update points set latitude2 = cast(latitude as double) ;
Run Code Online (Sandbox Code Playgroud)
其中纬度是一个字符串,纬度2是一个双精度值。我只是无法让它工作。
在 PostgreSQL 文档中,据说整数数据类型可以存储在两字节、四字节或八字节的空间中。我的数据库中表的一列包含一个一字节整数值,我希望它以一字节数据类型存储。
postgresql ×10
aggregate ×1
datatypes ×1
distinct ×1
installation ×1
join ×1
json ×1
optimization ×1
performance ×1
pgcrypto ×1
plpgsql ×1
sql-standard ×1
storage ×1
trigger ×1
vacuum ×1