我有一个包含约 210 万行的 Postgres 表。我对其进行了以下更新:
WITH stops AS (
SELECT id,
rank() OVER (ORDER BY offense_timestamp,
defendant_dl,
offense_street_number,
offense_street_name) AS stop
FROM consistent.master
WHERE citing_jurisdiction=1
)
UPDATE consistent.master
SET arrest_id=stops.stop
FROM stops
WHERE master.id = stops.id;
Run Code Online (Sandbox Code Playgroud)
这个查询运行了 39 个小时。我在一个 4(物理)核心 i7 Q720 笔记本电脑处理器上运行它,有足够的内存,绝大多数时间没有其他东西运行。没有硬盘空间限制。该表最近已被清空、分析和重新索引。
在查询运行的整个过程中,至少在初始WITH完成之后,CPU 使用率通常很低,并且 HDD 使用 100%。硬盘的使用非常用力,以至于任何其他应用程序的运行速度都比正常情况慢得多。
笔记本电脑的电源设置为高性能(Windows 7 x64)。
这是解释:
Update on master (cost=822243.22..1021456.89 rows=2060910 width=312)
CTE stops
-> WindowAgg (cost=529826.95..581349.70 rows=2060910 width=33)
-> Sort (cost=529826.95..534979.23 rows=2060910 width=33)
Sort Key: consistent.master.offense_timestamp, consistent.master.defendant_dl, consistent.master.offense_street_number, consistent.master.offense_street_name …Run Code Online (Sandbox Code Playgroud) 我在一个表中有大约 10 亿行数据,其中有一个名称和一个 1-288 范围内的整数。对于给定的name,每个int都是唯一的,并且并非该范围内的每个可能的整数都存在——因此存在间隙。
此查询生成一个示例案例:
--what I have:
SELECT *
FROM ( VALUES ('foo', 2),
('foo', 3),
('foo', 4),
('foo', 10),
('foo', 11),
('foo', 13),
('bar', 1),
('bar', 2),
('bar', 3)
) AS baz ("name", "int")
Run Code Online (Sandbox Code Playgroud)
我想为每个名称和连续整数序列生成一个查找表。每个这样的行将包含:
name -- name列的值
start -- 连续序列中的第一个整数
end --连续序列中的最后一个值
span -- end - start + 1
此查询为上述示例生成示例输出:
--what I need:
SELECT *
FROM ( VALUES ('foo', 2, 4, 3),
('foo', 10, 11, 2),
('foo', 13, 13, 1),
('bar', …Run Code Online (Sandbox Code Playgroud) 我最近一直在学习bit string数据类型,我很好奇:
在这个文档页面的底部有一句话:
...加上 5 或 8 个字节的开销,具体取决于字符串的长度
在其他语言(如 PHP、Java、C#、C++ 等)中,如何通过 Npgsql、ODBC 等驱动程序处理位字符串?
对于问题 #1,使用 smallint 或 bigint 将提高存储效率,并且可能会提供性能提升,因为在任何地方都支持整数。大多数编程语言都可以轻松处理整数的位操作。如果是这样,那么引入位串数据类型的意义何在?是否仅适用于需要大量位掩码的情况?位域索引可能吗?我对 PostgreSQL 中如何进行位域索引比较好奇。
对于#2,我很困惑,不仅仅是好奇。例如,如果我将工作日位掩码存储在 bit(7) 字段中,一天一位,最低位代表星期一。然后我在 PHP 和 C++ 中查询该值。我会得到什么?文档说我会有一个位串,但是位串不是我可以直接使用的 - 就像整数一样。那么在这种情况下,我应该放弃位域吗?
任何人都可以详细说明为什么以及何时应该使用一点或一点变化?
我们建立的复制已中断(在停机期间“请求的 WAL 段已被删除”)我们不能轻易地再次停止主服务器。
我们可以吗
pg_start_backup(),rsync ${PGDATA}/ 主人对奴隶, pg_stop_backup()...而master postgresql 仍处于满负荷状态?(或者会pg_start_backup()导致
换句话说,会不会pg_start_backup()影响我们的申请?
目前,在我们的项目中,我们为 PostgreSQL 数据库使用专用服务器。
理论上,我们可以在一些云平台上运行任何东西。但是,PostgreSQL 配置与硬件配置严格相关。我们正在寻找的是具有原生 PostgreSQL 支持的云解决方案。
以下是所需功能的列表:
那么这样的服务有哪些选择和最佳选择呢?
Postgres 是否有任何功能来支持老化的旧记录?
我想使用 Postgres 进行日志记录,作为一种队列,其中超过两周的记录(日志事件)会被自动删除。
在这个答案(/sf/ask/36230561/)中,一个评论引起了我的注意:
还要记住,在进行索引比较时,CHAR 和 VARCHAR 之间通常存在很大差异
这是否适用/仍然适用于 Postgres?
我发现 Oracle 上的页面声称这CHAR或多或少是 for 的别名VARCHAR,因此索引性能是相同的,但我在 Postgres 上没有发现任何明确的内容。
我在 Postgres 9.5 中使用新的 UPSERT 功能时遇到问题
我有一个表,用于从另一个表聚合数据。复合键由 20 列组成,其中 10 列可以为空。下面我创建了我遇到的问题的较小版本,特别是 NULL 值。
CREATE TABLE public.test_upsert (
upsert_id serial,
name character varying(32) NOT NULL,
status integer NOT NULL,
test_field text,
identifier character varying(255),
count integer,
CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id),
CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field)
);
Run Code Online (Sandbox Code Playgroud)
根据需要运行此查询(首先插入,然后插入只会增加计数):
INSERT INTO test_upsert as tu(name,status,test_field,identifier, count)
VALUES ('shaun',1,'test value','ident', 1)
ON CONFLICT (name,status,test_field) DO UPDATE set count = tu.count + 1
where tu.name = 'shaun' AND tu.status = 1 AND tu.test_field = …Run Code Online (Sandbox Code Playgroud) PostgreSQL 支持CREATE TABLE AS,SELECT INTO我什么时候同时使用两者?
CREATE TABLE AS-- 根据查询结果定义一个新表
CREATE TABLE AS创建一个表并用SELECT命令计算的数据填充它。表列具有与输出列关联的名称和数据类型SELECT(除了您可以通过提供新列名的显式列表来覆盖列名)。
CREATE TABLE AS与创建视图有些相似,但实际上完全不同:它创建一个新表并仅对查询求值一次以填充新表。新表不会跟踪对查询源表的后续更改。相反,SELECT每当查询时,视图都会重新评估其定义语句。
进而。
SELECT INTO-- 根据查询结果定义一个新表
SELECT INTO创建一个新表并用查询计算的数据填充它。数据不会返回给客户端,因为它是普通的SELECT. 新表的列的名称和数据类型与SELECT.
有什么方法可以使用 Postgres 的监听/通知功能将消息传递到频道,并且只有一个监听器使用该消息?
这样做的目的是我有多个“工人”应用程序都在收听同一个 Postgres 频道。但我只希望通过通知渠道收到的每条消息完成一次工作。
如果侦听/通知不是 Postgres 中的正确功能,我应该使用单独的功能吗?
理想情况下,我希望在不使用任何其他扩展的情况下执行此操作。
postgresql ×10
queue ×2
cloud ×1
ctas ×1
delete ×1
null ×1
performance ×1
query ×1
replication ×1
upsert ×1
varchar ×1