【问题标题】:How to query a write-heavy table in PostgreSQL?如何在 PostgreSQL 中查询写入量大的表?
【发布时间】: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


【解决方案1】:

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

如果您通过使用索引避免顺序扫描,您可以获得一些好处,但这会大大减慢插入速度。

这里没有免费的午餐。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多