sql - 慢 WHERE IN 查询结束

标签 sql postgresql where-in

我的表test_table中的示例数据:

date           symbol      value      created_time
2010-01-09     symbol1     101        3847474847
2010-01-10     symbol1     102        3847474847
2010-01-10     symbol1     102.5      3847475500
2010-01-10     symbol2     204        3847474847
2010-01-11     symbol1     109        3847474847
2010-01-12     symbol1     105        3847474847
2010-01-12     symbol2     206        3847474847

下面是我当前在一个包含大约 3k 个唯一符号和大约 1100 万行的表上使用的查询。它仍然需要一段时间(超过80%的查询时间花费在最后的子查询扫描上(我认为这是查询末尾的WHERE IN子句。有什么办法可以加快这部分的速度(想象一下)我在 WHERE IN 查找中有很多符号)。

select date, symbol, value, created_time
from (select *,
    rank() over (partition by date, symbol order by created_time desc) as rownum
  from test_table) x
where rownum = 1 and symbol in ('symbol1', 'symbol2', 'symbol5', ...)

下面是 EXPLAIN ANALYZE 输出(如果有帮助的话)。

QUERY PLAN
Subquery Scan on x  (cost=281573.35..282473.76 rows=129 width=37) (actual time=2874.389..3037.008 rows=32393 loops=1)
  Filter: (x.rownum = 1)
  Rows Removed by Filter: 183
  ->  WindowAgg  (cost=281573.35..282152.19 rows=25726 width=37) (actual time=2874.363..2980.848 rows=32576 loops=1)
        ->  Sort  (cost=281573.35..281637.67 rows=25726 width=37) (actual time=2874.340..2901.443 rows=32576 loops=1)
              Sort Key: "test_table".date, "test_table".symbol, "test_table".created_time DESC
              Sort Method: quicksort  Memory: 3314kB
              ->  Seq Scan on "test_table"  (cost=0.00..279688.80 rows=25726 width=37) (actual time=118.338..2693.767 rows=32576 loops=1)
                    Filter: (symbol = ANY ('{symbol5,symbol8,symbol15,symbol98,symbol43,symbol908}'::text[]))
                    Rows Removed by Filter: 10649132
Planning time: 0.999 ms
Execution time: 3064.496 ms

最佳答案

尝试使用distinct on来代替:

select distinct on (symbol, date) date, symbol, value, created_time
from test_table
where symbol in ('symbol1', 'symbol2', 'symbol5', ...)
order by symbol, date, created_time desc;

对于此查询,您需要在 test_table(symbol, date,created_time desc) 上建立索引。

关于sql - 慢 WHERE IN 查询结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41864446/

相关文章:

postgresql - 不使用索引的大表上的postgres全文搜索查询

sql - PostgreSQL:如何对未包含列的联合查询进行排序?

MySQL SELECT WHERE IN LIST 和 NOT IN LIST 在同一个 SQL

sql - Postgresql:是否可以判断在哪一列中找到了搜索字符串?

mysql - SQL - 是否可以替换 uuid 主键中的值?

php - mysqli bind_param 没有将字符串设置为空

mysql - SQL 语法错误 - 创建新数据库

postgresql - Azure PostgreSQL - 如何创建管理员用户

java - 如何编写 MySql 选择查询,其中 id 不在列表中,可以为空

mysql - 无需日复一日地检测日期重叠