我有两个表:以下相同的结构和BAL1 BAL2:大表格和UNION表演
CREATE TABLE bal1
( ts timestamp without timezone,
bid double precision,
ask double precision
CONSTRAINT bal1_pkey PRIMARY KEY (ts)
);
CREATE TABLE bal2
( ts timestamp without timezone,
bid double precision,
ask double precision
CONSTRAINT bal2_pkey PRIMARY KEY (ts)
);
“ts”的列是主键。
注意:bal1 & bal2每个有15,000,000行。
我想请求2个表的联合,按时间戳排序。 所以我执行:
SELECT t.ts, t.bid, t.ask
FROM
((SELECT ts, bid, ask FROM bal1 ORDER BY ts ASC)
union
(SELECT ts, bid, ask FROM bal2 ORDER BY ts ASC)) t
ORDER BY t.ts ASC
但这请求采用无限的时间来返回数据:〜10分钟一个核i7,6GB 7200 T/M的磁盘。 我希望添加“ORDER BY”子句将有助于数据库引擎...但它没有。
问题:如何让事情变得更快?你认为问题来自:
- 表结构不适合UNION选择种类?
- 从sql请求?
- 从db本身? Postgres适合这种用法吗?使用Oracle或MySql更好吗?
我毫不犹豫地把所有的数据放在一张表中,而productid integer
列代表了product1和product2。 的SQL请求比可能是:
SELECT productid, ts, bid, ask
FROM bal
WHERE productid=1 or productid=2
ORDER BY ts ASC
这种修改是耗时的我,所以我想你以这种方式commiting之前建议。
最后一件事:我计划增加更多的产品(3,4,5等),因此请求应该能够尽管几个UNION块蛮快的回应...
为什么您需要查询返回3000万行数据? – mustaccio 2014-11-05 16:09:05
对db中可用的整个历史数据运行backtest。数据本身永远不会在内存中同时完全加载。 sql-return-set将被流式传输。 – norisknofun 2014-11-05 16:12:32
嗯,下面是你要做的:*获得一些明智的光盘,*获得一些合理的RAM,*摆脱联盟,因为他们滥用关系模型,*意识到你需要一个教训。联合和顺序将所有结果转储到临时数据库空间。你的硬盘吓坏了,并且必须预定所有的结果。 – TomTom 2014-11-05 16:47:56