标签: postgresql-performance

过滤数组 text[] 并按时间戳排序

描述

Linux 上的 PostgreSQL 9.6,tags_tmp表大小~ 30 GB(1000 万行),tags是一个text[]并且只有 6 个值。

tags_tmp(id int, tags text[], maker_date timestamp, value text)
Run Code Online (Sandbox Code Playgroud)
tags_tmp(id int, tags text[], maker_date timestamp, value text)
Run Code Online (Sandbox Code Playgroud)

我需要使用 filter ontagsorder byon检索数据maker_date desc。我可以在两tags & maker_date desc列上创建索引吗?

如果没有,你能提出其他想法吗?

查询示例

select id, tags, maker_date, value
from tags_tmp
where  tags && array['a','b']
order by maker_date desc
limit 5 offset 0
Run Code Online (Sandbox Code Playgroud)

SQL 代码:

create index idx1 on tags_tmp using gin (tags);
create …
Run Code Online (Sandbox Code Playgroud)

postgresql performance order-by index-tuning postgresql-performance

8
推荐指数
1
解决办法
6302
查看次数

用于标识要删除的行的系统列“ctid”是否合法?

我有一个包含数亿行的表,我需要从中删除数据。

现有的索引是最有效的。

但是,我可以使用现有索引通过使用ctid值查找要删除的行:

DELETE FROM calendar_event WHERE ctid IN
(SELECT ctid FROM calendar_event WHERE user_id = 5 LIMIT 100 FOR UPDATE)
Run Code Online (Sandbox Code Playgroud)

ctid在这种情况下依赖 的风险是什么?我最糟糕的情况是删除错误的行。

postgresql performance delete concurrency postgresql-performance

8
推荐指数
1
解决办法
2842
查看次数

使用数百万条 INSERT 语句导入大型 SQL 转储

我需要将一个大.sql文件(解压时为 8.1GB)导入 PostgreSQL。我尝试使用,\i /path/to/file.sql但它太慢了。

如何加快进口?我需要每周导入这些数据。

第一个2000行可以在这里找到,而压缩的1点GB转储可以在这里找到

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.5.3
-- Dumped by pg_dump version 9.5.2

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: rpo; Type: SCHEMA; Schema: -; Owner: -
--
Run Code Online (Sandbox Code Playgroud)

这是我获取数据的唯一途径。完整的文件有大约。38,000,000 行。如何加快导入速度?

postgresql performance import pg-dump postgresql-performance

8
推荐指数
1
解决办法
7787
查看次数

我可以在 timescaledb 中使用 hypertables 来获得更好的插入率吗?

我有一个 PostgreSQL 数据库,我运行了大量的负载。我希望这个负载尽可能快。我已经在使用复制命令等。

我一直在阅读关于timescaledb以及它如何提供改进的插入性能。但是,如果我只关心插入性能,我想知道使用 hypertables 而不是常规表是否有任何缺点?

postgresql performance timescaledb postgresql-performance

8
推荐指数
1
解决办法
1803
查看次数

Postgres中整数列与布尔列的磁盘使用情况

我看到了这个问题Bit vs. Boolean columns

对于 Postgres,我问自己同样的问题:一位整数列是否占用了布尔值列的相同磁盘空间?在大表(约 50 列 x 约 5000 万行)中,哪一个表现最好?我怎样才能找到这个?

postgresql performance database-design optimization disk-space postgresql-performance

8
推荐指数
1
解决办法
1421
查看次数

INSERT ON 冲突不做任何事效率(PostgreSQL)

在 Postgres 中,如果超过 99.9% 的时间记录存在并且没有执行任何操作,则执行 \xe2\x80\x9cINSERT\xe2\x80\xa6 ON CONFLICT DO NOTHING\xe2\x80\x9d 是否效率低下?

\n

例如让\xe2\x80\x99s 说我有一个节点进程,它获取映射到行的 100k 记录,其中 99,980 条已经存在。我可以:

\n
    \n
  • 将它们全部插入,但对唯一性约束违规不执行任何操作
  • \n
  • 插入不存在的查询
  • \n
  • 全选,对\xe2\x80\x9cclient\xe2\x80\x9d这边做去重,然后只插入新的20个
  • \n
\n

第一种方法是最简单的,但我想知道它对于 Postgres 来说是否效率太低。我读到它在这样的 \xe2\x80\x9cdo Nothing\xe2\x80\x9d 情况下增加序列号,但是如果我跳过使用序列并使用我的唯一字段作为主(字符串)键,那可以吗? ?

\n

postgresql postgresql-performance

8
推荐指数
1
解决办法
4201
查看次数

postgres; 索引会自动重新索引新数据吗?

如果我在 Postgres 表中有一堆行,然后创建一个索引,如果在创建后插入新数据行,索引是否会自动更新?

或者说,REINDEX 是仅在一些罕见的情况下需要,还是在添加新数据时才需要?

postgresql performance postgresql-performance

7
推荐指数
1
解决办法
5953
查看次数

100k DDL 语句上的 Postgres 事务 OOM

我们在 PostgreSQL 的单个事务中执行大约 100k DDL 语句。在执行过程中,各个 Postgres 连接的内存使用量逐渐增加,一旦它无法获得更多内存(在 3GB 内存上从 10MB 使用量增加到 2.2GB),OOM 杀手用 9 命中它,导致 Postgres 进入恢复模式.

BEGIN;

CREATE SCHEMA schema_1;
-- create table stmts - 714
-- alter table add pkey stmts - 714
-- alter table add constraint fkey stmts - 34
-- alter table add unique constraint stmts - 2
-- alter table alter column set default stmts - 9161
-- alter table alter column set not null stmts - 2405
-- alter table add check …
Run Code Online (Sandbox Code Playgroud)

postgresql performance transaction ddl postgresql-9.6 postgresql-performance

7
推荐指数
1
解决办法
347
查看次数

当 PostgreSQL 的“类别”太多时,我应该使用枚举吗?

问题

我计划将包含更多 1000 万条记录的 CSV 加载到 PostgreSQL v12.1,其中一列具有“分类”值,因此为其创建枚举类型似乎是一个不错的选择,但它包含 208 个类别。

最短的字段为 2,最长的字段为 11 个字符。所有字段的平均值为 2.4。字符编码是 UTF8,但所有字符都是 ASCII

问题:

我应该使用enumeratedvarchar哪种类型?

附加信息

我丢弃char是因为官方 PostgreSQL 文档说明了有关charvarchartext 的以下内容

提示:这三种类型之间没有性能差异,除了使用空白填充类型时增加了存储空间,以及在存储到长度受限列时需要额外的一些 CPU 周期来检查长度。虽然 character(n) 在其他一些数据库系统中具有性能优势,但在 PostgreSQL 中没有这样的优势;事实上 character(n) 通常是三个中最慢的,因为它有额外的存储成本。在大多数情况下,应改用文本或字符变化。

PostgreSQL 中的枚举值在磁盘上占用4 个字节(请参阅 8.7.4. 实现细节)。考虑到这一点和使用enum类型的2.4 平均字符串长度会导致磁盘使用率略高(PostgreSQL 中的短字符串需要一个额外的字节磁盘空间)。我仍然有一种直觉,即使用 enum 是更好的选择,因为它的实现使许多针对它的操作更快。

postgresql performance import postgresql-performance

7
推荐指数
2
解决办法
2577
查看次数

加速索引扫描向后查询

我的应用程序正在执行以下 psql 查询,并且运行速度非常慢:

SELECT COUNT(*) 
FROM (
  SELECT 1 AS one 
  FROM "large_table" 
  WHERE "large_table"."user_id" = 123 
  ORDER BY "large_table"."id" desc 
  LIMIT 1 OFFSET 30
) subquery_for_count;
Run Code Online (Sandbox Code Playgroud)

当我将 更改ORDER BY为时ASC,它的运行速度快了 100 倍。我在 id 上有默认的主键索引,并且我已经尝试按降序顺序为 id 添加附加索引,但这似乎没有什么区别。

当我运行解释分析时,我发现它在慢速查询 ( ) 上使用向后索引扫描desc。我尝试手动禁用会话的索引扫描,发现查询运行时间为 40 秒,而不是 2 分钟,这是一个显着的改进。

知道如何在按 DESC 排序时尝试提高此查询的速度吗?我读过,对于 b 树索引,无论排序顺序如何,它通常应该为您提供相同的性能,但情况似乎并非如此。

postgresql index index-tuning postgresql-performance

7
推荐指数
2
解决办法
4820
查看次数