【发布时间】:2016-11-27 13:39:40
【问题描述】:
我将一些股票数据存储在 Postgres 9.5 数据库中,我的表具有以下格式,主键为(日期时间、符号):
symbol (varchar[30]),
datetime (timestamptz),
value (double precision)
现在,我的一些较大的表超过 8000 万行,因此,一些查询比我想要的要慢一些。我 99% 的查询涉及获取特定交易品种一天的数据,例如:
SELECT * from "prices"
WHERE symbol = 'AAPl' AND datetime between '2016-07-22 9:30' AND '2016-07-22 16:30'
平均一天我会插入 250k 行,但在某些高峰日,它可能会高达 500k 行。这是美国市场开放的 6.5 小时以上
我正在阅读分区并考虑每月进行一次(平均每月 20 个交易日,每个分区应该有 5 到 1000 万行)
我在数据库方面没有经验,到目前为止我所设置的只是新手的工作。当我考虑编写自动分区脚本时,他们似乎有某种类型的查询在搜索以查看分区是否存在。以下内容来自位于 https://blog.engineyard.com/2013/scaling-postgresql-performance-table-partitioning
的更长的函数PERFORM 1
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND c.relname = _tablename
AND n.nspname = 'myschema';
我真的不想每天检查一个表是否存在 250k 到 500k 次,所以我想我可以每月运行一个 cron 作业来创建表,然后不必费心检查?
我也在想,也许我应该将我的所有数据插入一个临时表,然后在下午 4:30 收市后运行一个 cron 作业,因为一旦收市后就没有数据被插入。我的想法是我的 cron 作业会清空临时表并将所有内容放入正确的分区中。
这值得吗?我应该研究分片吗?数据库服务器是一个 i7 6 核处理器,具有 64 gig 的内存和存储在 SSD 驱动器上的数据。我可以在同一台服务器上启动更多 postgres 实例,但我无法访问更多服务器,因此 postgres 实例必须位于同一台服务器上。
另外,当我在这里时,我应该在我的表上设置索引以使我的上述查询更快吗?
谢谢!
【问题讨论】:
-
那么提供的慢查询的
EXPLAIN ANALYZE是什么? -
先尝试一些不同的索引。多列索引可以很好地工作。在你的情况下,我认为(日期时间,符号)是最有效的,但你也应该尝试相反的方式。我猜你的用例会导致一个表中的数据主要按日期时间字段的顺序排列,我在日期时间上显示一个 BRIN 索引可能非常有效。 postgresql.org/docs/9.5/static/brin-intro.html
标签: database postgresql postgresql-performance