如何在PostgreSQL中查询写得很大的表?

时间:2017-06-07 17:12:00

标签: python postgresql perl

我有一个PostgreSQL表,全天平均记录约600万条记录。在记录记录时,查询表需要很长时间。有没有办法从该表创建一个流媒体发布新记录?我希望能够在记录时将更改流式传输到我的网站。

在postgres中查询表需要这么长时间的原因是因为我有〜550个同时进行的线程连接从不同的源执行插入。每个线程都对数据进行特定分析,并存储有价值的信息。我使用Perl抓取,快速分析和加载数据,但是在Python中使用postgres表构建查询。

在加载期间,即使我通过SQL通过pgAdmin:

查询(读取查询)表
select var1, var2, var3 from pg_table 
where filter = 'xyz'

甚至

select * from pg_table limit 100

查询非常慢,这意味着结果需要大约4分钟才能返回。当表没有加载数据时,需要大约3秒钟。

顺便说一句,谢谢你的所有建议。我刚刚在我的桌子上运行了解释分析,因为它正在加载数据。这是查询:

EXPLAIN ANALYZE select count(call_option_symbol) from optionsputnik;

结果如下:

QUERY PLAN
Aggregate  (cost=357092.30..357092.31 rows=1 width=51) (actual time=342775.893..342775.893 rows=1 loops=1)
  ->  Seq Scan on optionsputnik  (cost=0.00..342868.24 rows=5689624 width=51) (actual time=0.025..341802.509 rows=5686946 loops=1)
Planning time: 415.781 ms
Execution time: 342775.974 ms

我将尝试使用表的索引,我知道这将加快查询时间,但不会进行交互(来自Web,查询表和返回的处理请求)。

这是在没有任何内容写入表时的查询计划结果:

QUERY PLAN
Aggregate  (cost=463634.94..463634.95 rows=1 width=0) (actual time=2326.104..2326.104 rows=1 loops=1)
  ->  Seq Scan on optionsputnik  (cost=0.00..445164.95 rows=7387995 width=0) (actual time=0.029..1773.378 rows=7383752 loops=1)
Planning time: 0.045 ms
Execution time: 2326.149 ms

以下是我的表结构:

column_name,data_type,character_maximum_length
load_time,character,30
call_option_symbol,character,50
call_bid,double precision,
call_ask,double precision,
call_bid_ask_size,character,50
call_last,character,50
call_delta,double precision,
call_volume,double precision,
call_open_interest,double precision,
put_bid,double precision,
put_ask,double precision,
put_bid_ask_size,character,50
put_last,character,50
put_delta,double precision,
put_volume,double precision,
put_open_interest,double precision,

我正在考虑尝试将表拆分为n个单独的表,以同时减少写连接数。还有什么我可以尝试或测试的吗?

1 个答案:

答案 0 :(得分:0)

检查您的I / O子系统是否处于压力之下 - 这可以解释所需的时间。

如果使用索引避免顺序扫描,则可以获得一些东西,但这会大大减慢插入速度。

这里没有免费的午餐。

您可以尝试添加足够的RAM以便缓存表,这将大大加快查询速度。