【发布时间】:2017-11-09 04:15:00
【问题描述】:
我有一个 PostgreSQL 表,全天平均记录约 600 万条记录。由于正在记录记录,因此查询表需要很长时间。有没有办法从该表创建一个流媒体,它将发布新记录?我希望能够在记录更改时将更改流式传输到我的网站。
在 postgres 中查询表需要这么长时间的原因是因为我有大约 550 个同时线程连接执行来自不同来源的插入。每个线程对数据进行特定分析并存储有价值的信息。我使用 Perl 抓取、快速分析和加载数据,但在 Python 中从 postgres 表构建查询。
在加载期间,即使我通过 pgAdmin 通过 SQL 查询(读取查询)表:
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
我会尝试为表建立索引,我知道这会加快查询时间,但不会进行交互(处理来自网络的请求、查询表并返回)。
这是没有写入表时的查询计划结果:
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 个单独的表,以同时减少写入连接的数量。还有什么我可以尝试或测试的吗?
【问题讨论】:
-
为什么在写入的时候查询不到表?你会用这些信息更新问题吗?运行读取查询时会发生什么?你使用的是 Python 还是 Perl?请仅使用与您正在使用的技术相关的标签。
-
感谢您的评论,我正在通过 Perl 写信给 postgres,但试图通过 python 从表中读取。这就是我把它们放在那里的原因。
-
好的,到了。请用“非常慢”的含义以及您希望达到的时间来更新问题。 “不可能”似乎是错误的词,因为您说读取查询正在工作。
-
在大多数情况下:检查两个查询的计划,插入数据的查询和选择它们的查询。有时插入可能很慢,由于一些高级检查,整个机器可能很慢,因此选择也可能很慢。可以通过explain查看查询计划,或者explain analyzepostgresql.org/docs/current/static/sql-explain.html。
-
显示表结构、索引,并尝试在末尾添加
order by something。使用适当的索引,它可以加快速度。
标签: python postgresql perl