标签: postgresql-performance

提高 PostgreSQL 数组查询的性能

我将大型双精度向量(140 万个值)存储在 PostgreSQL 表中。该表的创建语句如下。

CREATE TABLE analysis.expression
(
  celfile_name character varying NOT NULL,
  core double precision[],
  extended double precision[],
  "full" double precision[],
  probeset double precision[],
  CONSTRAINT expression_pkey PRIMARY KEY (celfile_name)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE analysis.expression ALTER COLUMN core SET STORAGE EXTERNAL;
ALTER TABLE analysis.expression ALTER COLUMN extended SET STORAGE EXTERNAL;
ALTER TABLE analysis.expression ALTER COLUMN "full" SET STORAGE EXTERNAL;
ALTER TABLE analysis.expression ALTER COLUMN probeset SET STORAGE EXTERNAL;
Run Code Online (Sandbox Code Playgroud)

该表中的每个条目仅写入一次,并且可能以随机索引多次读取。PostgreSQL 似乎对于查找的扩展性不太好,因为即使将 STORAGE 设置为 EXTERNAL (O(n)) ,向量长度也会增长。这使得像下面这样的查询(我们在数组中选择了许多单独的值)非常非常慢(分钟 …

sql arrays postgresql bigdata postgresql-performance

5
推荐指数
1
解决办法
3866
查看次数

Postgresql BTREE_GIN 索引带有 gin_trgm_ops 选项?

https://www.postgresql.org/docs/current/static/pgtrgm.html上,解释了如何使用带有 gin_trgm_ops 选项的特殊 GIN 索引来提高 trigram 相似性运算符的性能。

CREATE INDEX trgm_idx ON test_trgm USING GIN (t gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)

也有人说:

这些索引不支持相等或简单的比较运算符,因此您可能还需要常规 B 树索引。

然而,还有 BTREE_GIN 扩展,它应该允许 GIN 索引用作 BTREE 索引的替代品。https://www.postgresql.org/docs/current/static/btree-gin.html

我的问题是:如果我安装 BTREE_GIN 扩展,pg_trgm GIN 索引(带有 gin_trgm_ops 选项)可以用作 BTREE 索引的替代品吗?它是否结合了 BTREE_GIN 和 trigram GIN 索引的属性,或者仍然需要额外的 BTREE 索引来进行连接和相等表达式等?

postgresql gwt-gin b-tree postgresql-performance trigram

5
推荐指数
1
解决办法
2656
查看次数

更改表集统计信息需要表锁

我遇到过这样的情况:Pg 总是更喜欢对具有大约 70M 行的表进行顺序扫描。(索引扫描非常适合该查询,我已经通过设置enable_seq_scan = off确认了这一点,速度提高了200倍)

所以,为了帮助 Pg 更好地理解我的数据,我执行了这个

ALTER TABLE tablename ALTER COLUMN columnname SET STATISTICS 1000;

不幸的是,这需要更新独占锁来锁定整个表(锁太多)。

  1. 有没有办法避免锁定该语句?
  2. 该表的数据分片是基于主键范围进行的,因此我希望 Pg 能够更好地理解我的 Pk,以便它知道哪个 User 拥有大数据。如果我也增加PrimaryKey列的统计信息会有用吗?

postgresql postgresql-performance

5
推荐指数
1
解决办法
4442
查看次数

为什么 postgres 进行表扫描而不是使用我的索引?

我正在 Postgres 中使用 HackerNews 数据集。大约有 1700 万行,其中大约 1450 万行是评论,大约 250 万行是故事。有一个名为“rbanffy”的非常活跃的用户,他提交了 25,000 条文章,大约有相等的分裂故事/评论。“by”和“type”都有单独的索引。

我有一个疑问:

SELECT *
FROM "hn_items"
WHERE by = 'rbanffy'
and type = 'story'
ORDER BY id DESC
LIMIT 20 OFFSET 0
Run Code Online (Sandbox Code Playgroud)

运行速度很快(它使用“by”索引)。如果我将类型更改为“评论”,那么速度会非常慢。从解释来看,它不使用任何索引并进行扫描。

Limit  (cost=0.56..56948.32 rows=20 width=1937)
  ->  Index Scan using hn_items_pkey on hn_items  (cost=0.56..45823012.32 rows=16093 width=1937)
        Filter: (((by)::text = 'rbanffy'::text) AND ((type)::text = 'comment'::text))
Run Code Online (Sandbox Code Playgroud)

如果我将查询更改为 has type||''='comment',那么它将使用“by”索引并快速执行。

为什么会发生这种情况?我从/sf/answers/21687011/了解到,必须进行这样的黑客攻击意味着出现了问题。但我不知道是什么。

编辑:
这是 type='story' 的解释

Limit  (cost=72553.07..72553.12 rows=20 width=1255)
  ->  Sort  (cost=72553.07..72561.25 rows=3271 width=1255)
        Sort Key: id …
Run Code Online (Sandbox Code Playgroud)

postgresql indexing sql-execution-plan postgresql-performance

5
推荐指数
1
解决办法
1167
查看次数

带有datetime的WHERE子句的索引等

我正在使用Postgres 9.1并且查询速度非常慢.

查询:

Explain Analyze SELECT COUNT(DISTINCT email) FROM "invites" WHERE (
 created_at < '2012-10-10 21:08:05.259200'
 AND invite_method = 'email' 
 AND accept_count = 0 
 AND reminded_count < 3 
 AND (last_reminded_at IS NULL OR last_reminded_at < '2012-10-10 21:08:05.261483'))
Run Code Online (Sandbox Code Playgroud)

结果:

Aggregate  (cost=19828.24..19828.25 rows=1 width=21) (actual time=11395.903..11395.903 rows=1 loops=1)
  ->  Seq Scan on invites  (cost=0.00..18970.57 rows=343068 width=21) (actual time=0.036..353.121 rows=337143 loops=1)
        Filter: ((created_at < '2012-10-10 21:08:05.2592'::timestamp without time zone) AND (reminded_count < 3) AND ((last_reminded_at IS NULL) OR (last_reminded_at < '2012-10-10 21:08:05.261483'::timestamp without …
Run Code Online (Sandbox Code Playgroud)

sql postgresql indexing performance postgresql-performance

4
推荐指数
2
解决办法
325
查看次数

PostgreSQL窗口函数:通过比较分区

我正在尝试找到与PostgreSQL查询中的WINDOW函数中的PARTITION BY子句中的当前行进行比较的方法.

想象一下,我在这5个元素的以下查询中有一个短列表(在实际情况中,我有数千甚至数百万行).我试图获取每一行,下一个不同元素(事件列)的id,以及前一个不同元素的id.

WITH events AS(
  SELECT 1 as id, 12 as event, '2014-03-19 08:00:00'::timestamp as date
  UNION SELECT 2 as id, 12 as event, '2014-03-19 08:30:00'::timestamp as date
  UNION SELECT 3 as id, 13 as event, '2014-03-19 09:00:00'::timestamp as date
  UNION SELECT 4 as id, 13 as event, '2014-03-19 09:30:00'::timestamp as date
  UNION SELECT 5 as id, 12 as event, '2014-03-19 10:00:00'::timestamp as date
)
SELECT lag(id)  over w as previous_different, event
     , lead(id) over w as next_different
FROM …
Run Code Online (Sandbox Code Playgroud)

sql postgresql window-functions postgresql-performance

4
推荐指数
1
解决办法
6937
查看次数

在大桌面上的第一次查询调用非常缓慢

我有一个问题,感觉它需要花费更多的时间.这仅适用于给定参数集的第一个查询,因此在缓存时没有问题.

我不确定会发生什么,但是,考虑到设置和设置,我希望有人可以对几个问题有所了解,并提供一些有关如何加快查询速度的见解.该表格相当大,Postgres估计其中大约155963000(14 GB).

询问

    select ts, sum(amp) as total_amp, sum(230 * factor) as wh
    from data_cbm_aggregation_15_min
    where virtual_id in (1818) and ts between '2015-02-01 00:00:00' and '2015-03-31 23:59:59'
    and deleted is null
    group by ts
    order by ts
Run Code Online (Sandbox Code Playgroud)

当我开始研究这个查询时花了大约15秒,经过一些更改后我已经达到了大约10秒,这对于像这样的简单查询似乎仍然很长.下面是结果explain analyze: http://explain.depesz.com/s/97V1.请注意GroupAggregate返回相同行数的原因是此示例仅virtual_id使用了一行,但可能会有更多行.

表和索引

正在查询的表,它每15分钟插入一次值

CREATE TABLE data_cbm_aggregation_15_min (
  virtual_id integer NOT NULL,
  ts timestamp without time zone NOT NULL,
  amp real,
  recs smallint,
  min_amp real,
  max_amp real,
  deleted boolean,
  factor real DEFAULT 0.25,
  min_amp_ts …
Run Code Online (Sandbox Code Playgroud)

postgresql configuration query-optimization postgresql-9.2 postgresql-performance

4
推荐指数
1
解决办法
1202
查看次数

使用 postgres 将大量行从一个表移动到另一个新表的有效方法

我正在使用PostgreSQL数据库进行实时项目。其中,我有一张有 8 列的表。该表包含数百万行,因此为了从表中更快地进行搜索,我想删除该表中的旧条目并将其存储到另一个新表中。

为此,我知道一种方法:

  • 首先选择一些行
  • 创建新表
  • 将此行存储在该表中
  • 比从主表中删除。

但是时间太长,效率不高。

所以我想知道在 postgresql 数据库中执行此操作的最佳方法是什么?

Postgresql 版本:9.4.2.
大约行数:8000000
我想移动行:2000000

postgresql postgresql-performance

4
推荐指数
1
解决办法
2682
查看次数

为什么搜索词的细微变化会使查询变慢?

我在PostgreSQL(9.5.1)中有以下查询:

select e.id, (select count(id) from imgitem ii where ii.tabid = e.id and ii.tab = 'esp') as imgs,
 e.ano, e.mes, e.dia, cast(cast(e.ano as varchar(4))||'-'||right('0'||cast(e.mes as varchar(2)),2)||'-'|| right('0'||cast(e.dia as varchar(2)),2) as varchar(10)) as data,
 pl.pltag, e.inpa, e.det, d.ano anodet, coalesce(p.abrev,'')||' ('||coalesce(p.prenome,'')||')' determinador, d.tax, coalesce(v.val,v.valf)||' '||vu.unit as altura,
 coalesce(v1.val,v1.valf)||' '||vu1.unit as DAP, d.fam, tf.nome família, d.gen, tg.nome gênero, d.sp, ts.nome espécie, d.inf, e.loc, l.nome localidade, e.lat, e.lon
from esp e
left join det d on e.det = d.id
left join tax tf …
Run Code Online (Sandbox Code Playgroud)

postgresql performance pattern-matching query-performance postgresql-performance

4
推荐指数
1
解决办法
218
查看次数

使用嵌套循环 - PostgreSQL提高SQL查询的性能

我正在使用PostgreSQL,我的SQL查询有一个奇怪的问题.取决于我正在使用的日期参数.我的请求没有做同样的操作.

这是我的工作查询:

SELECT DISTINCT app.id_application 
FROM stat sj
LEFT OUTER JOIN groupe gp ON gp.id_groupe = sj.id_groupe 
LEFT OUTER JOIN application app ON app.id_application = gp.id_application 
WHERE date_stat >= '2016/3/01' 
AND date_stat <= '2016/3/31' 
AND ( date_stat = date_gen-1 or (date_gen = '2016/04/01' AND date_stat = '2016/3/31')) 
AND app.id_application IS NOT NULL 
Run Code Online (Sandbox Code Playgroud)

这个查询需要大约2个secondes(这对我来说是好的,因为我有很多行).当我为此查询运行EXPLAIN ANALYZE时,我有:

HashAggregate  (cost=375486.95..375493.62 rows=667 width=4) (actual time=2320.541..2320.656 rows=442 loops=1)
    ->  Hash Join  (cost=254.02..375478.99 rows=3186 width=4) (actual time=6.144..2271.984 rows=263274 loops=1)
    Hash Cond: (gp.id_application = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql postgresql-performance

4
推荐指数
1
解决办法
9730
查看次数