标签: postgresql

为什么 Postgres UPDATE 需要 39 小时?

我有一个包含约 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)

postgresql

20
推荐指数
2
解决办法
3万
查看次数

在 Postgresql 查询中有效地选择多个连续范围的开始和结束

我在一个表中有大约 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)

postgresql query

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

我应该使用 PostgreSQL 位串吗?

我最近一直在学习bit string数据类型,我很好奇:

  1. 这个文档页面的底部有一句话:

    ...加上 5 或 8 个字节的开销,具体取决于字符串的长度

  2. 在其他语言(如 PHP、Java、C#、C++ 等)中,如何通过 Npgsql、ODBC 等驱动程序处理位字符串?

对于问题 #1,使用 smallint 或 bigint 将提高存储效率,并且可能会提供性能提升,因为在任何地方都支持整数。大多数编程语言都可以轻松处理整数的位操作。如果是这样,那么引入位串数据类型的意义何在?是否仅适用于需要大量位掩码的情况?位域索引可能吗?我对 PostgreSQL 中如何进行位域索引比较好奇。

对于#2,我很困惑,不仅仅是好奇。例如,如果我将工作日位掩码存储在 bit(7) 字段中,一天一位,最低位代表星期一。然后我在 PHP 和 C++ 中查询该值。我会得到什么?文档说我会有一个位串,但是位串不是我可以直接使用的 - 就像整数一样。那么在这种情况下,我应该放弃位域吗?

任何人都可以详细说明为什么以及何时应该使用一点或一点变化?

postgresql

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

PostgreSQL:我可以在负载下运行的实时数据库上执行 pg_start_backup() 吗?

我们建立的复制已中断(在停机期间“请求的 WAL 段已被删除”)我们不能轻易地再次停止主服务器。

我们可以吗

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ 主人对奴隶,
  3. pg_stop_backup()

...而master postgresql 仍处于满负荷状态?(或者会pg_start_backup()导致

  • 表锁,
  • I/O 块,
  • 不一致,
  • 火警,
  • 数据库响应缓慢

换句话说,会不会pg_start_backup()影响我们的申请?

postgresql replication

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

PostgreSQL 的最佳云平台

目前,在我们的项目中,我们为 PostgreSQL 数据库使用专用服务器。

理论上,我们可以在一些云平台上运行任何东西。但是,PostgreSQL 配置与硬件配置严格相关。我们正在寻找的是具有原生 PostgreSQL 支持的云解决方案。

以下是所需功能的列表:

  • 根据所选资源自动调整数据库配置
  • 开箱即用的复制设置

那么这样的服务有哪些选择和最佳选择呢?

postgresql cloud

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

Postgres中旧记录的自动老化(删除)

Postgres 是否有任何功能来支持老化的旧记录?

我想使用 Postgres 进行日志记录,作为一种队列,其中超过两周的记录(日志事件)会被自动删除。

postgresql delete queue

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

CHAR 与 VARCHAR (Postgres) 的索引性能

在这个答案(/sf/ask/36230561/)中,一个评论引起了我的注意:

还要记住,在进行索引比较时,CHAR 和 VARCHAR 之间通常存在很大差异

这是否适用/仍然适用于 Postgres?

我发现 Oracle 上的页面声称这CHAR或多或少是 for 的别名VARCHAR,因此索引性能是相同的,但我在 Postgres 上没有发现任何明确的内容。

postgresql performance varchar

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

带有 NULL 值的 PostgreSQL UPSERT 问题

我在 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 null upsert unique-constraint postgresql-9.5

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

CREATE TABLE AS vs SELECT INTO

PostgreSQL 支持CREATE TABLE ASSELECT INTO我什么时候同时使用两者?

CREATE TABLE AS -- 根据查询结果定义一个新表

CREATE TABLE AS创建一个表并用SELECT命令计算的数据填充它。表列具有与输出列关联的名称和数据类型SELECT(除了您可以通过提供新列名的显式列表来覆盖列名)。

CREATE TABLE AS与创建视图有些相似,但实际上完全不同:它创建一个新表并仅对查询求值一次以填充新表。新表不会跟踪对查询源表的后续更改。相反,SELECT每当查询时,视图都会重新评估其定义语句。

进而。

SELECT INTO -- 根据查询结果定义一个新表

SELECT INTO创建一个新表并用查询计算的数据填充它。数据不会返回给客户端,因为它是普通的SELECT. 新表的列的名称和数据类型与SELECT.

postgresql ctas

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

Postgres 侦听/通知为消息队列

有什么方法可以使用 Postgres 的监听/通知功能将消息传递到频道,并且只有一个监听器使用该消息?

这样做的目的是我有多个“工人”应用程序都在收听同一个 Postgres 频道。但我只希望通过通知渠道收到的每条消息完成一次工作。

如果侦听/通知不是 Postgres 中的正确功能,我应该使用单独的功能吗?

理想情况下,我希望在不使用任何其他扩展的情况下执行此操作。

postgresql event-notification queue

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