我有一个大的PostgreSQL表(350毫米行),看起来像下面的结构(数据类型是:日期,文本,文本,文本)。这个例子叫test_table:
date symbol value created_time
1996-02-12 symbol1 101.2 1515614976548
1996-02-13 symbol1 100.5 1515614976548
1996-02-16 symbol1 102 1515614976548
1996-02-12 symbol2 200 1515614976700
1996-02-13 symbol2 202 1515614976700
1996-02-16 symbol2 205 1515614976700
查询此表时,我的目标是检索与特定符号和created_time匹配的所有这4列(因此查找每行使用两个值)。
我目前的查询如下:
select *
from "ts.global.bbg__price.none"
where (symbol, created_time) in (values ('symbol1','1515614976548'), ('symbol2','1515614976700'), ('symbol3','1515614976750'))
目前,我在表格上有一个带符号和创建时间的索引。
以下是查询规划器:
Nested Loop (cost=0.64..1323.84 rows=1300 width=33) (actual time=5.394..233.821 rows=14499 loops=1)
Buffers: shared hit=79 read=132
-> HashAggregate (cost=0.07..0.11 rows=4 width=64) (actual time=0.009..0.011 rows=4 loops=1)
Group Key: "*VALUES*".column1, "*VALUES*".column2
-> Values Scan on "*VALUES*" (cost=0.00..0.05 rows=4 width=64) (actual time=0.004..0.004 rows=4 loops=1)
-> Index Scan using "ts.global.bbg__price.none_idx" on "ts.global.bbg__price.none" (cost=0.57..330.12 rows=81 width=33) (actual time=5.772..57.933 rows=3625 loops=4)
Index Cond: ((symbol = "*VALUES*".column1) AND (created_time = "*VALUES*".column2))
Buffers: shared hit=79 read=132
Planning time: 8.095 ms
Execution time: 234.521 ms
由于我对使用PostgreSQL很陌生,我想看看是否有一种更好的方法来查询/使用索引以这种方式检索数据(我将经常在每个符号检索大约4,000行,并且在10和一次200个符号)和2)鉴于我的表格会变得非常大,因为我以不可变的方式存储所有内容(有重复的值和日期)这不是对postgres的好用。
提前感谢您的任何建议。