我将大型双精度向量(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)) ,向量长度也会增长。这使得像下面这样的查询(我们在数组中选择了许多单独的值)非常非常慢(分钟 …
在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 索引来进行连接和相等表达式等?
我遇到过这样的情况:Pg 总是更喜欢对具有大约 70M 行的表进行顺序扫描。(索引扫描非常适合该查询,我已经通过设置enable_seq_scan = off确认了这一点,速度提高了200倍)
所以,为了帮助 Pg 更好地理解我的数据,我执行了这个
ALTER TABLE tablename ALTER COLUMN columnname SET STATISTICS 1000;
不幸的是,这需要更新独占锁来锁定整个表(锁太多)。
我正在 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
我正在使用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) 我正在尝试找到与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) 我有一个问题,感觉它需要花费更多的时间.这仅适用于给定参数集的第一个查询,因此在缓存时没有问题.
我不确定会发生什么,但是,考虑到设置和设置,我希望有人可以对几个问题有所了解,并提供一些有关如何加快查询速度的见解.该表格相当大,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
我正在使用PostgreSQL数据库进行实时项目。其中,我有一张有 8 列的表。该表包含数百万行,因此为了从表中更快地进行搜索,我想删除该表中的旧条目并将其存储到另一个新表中。
为此,我知道一种方法:
但是时间太长,效率不高。
所以我想知道在 postgresql 数据库中执行此操作的最佳方法是什么?
Postgresql 版本:9.4.2.
大约行数:8000000
我想移动行:2000000
我在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
我正在使用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) postgresql ×10
sql ×4
indexing ×2
performance ×2
arrays ×1
b-tree ×1
bigdata ×1
gwt-gin ×1
trigram ×1