在大型PostgreSQL表中高效搜索两个值

时间:2018-01-11 13:18:22

标签: postgresql where-in

我有一个大的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的好用。

提前感谢您的任何建议。

0 个答案:

没有答案