Postgres表现不佳“in-clause”

时间:2016-04-08 08:26:40

标签: postgresql query-performance postgresql-performance in-clause

我有这个问题:

with serie as (
select to_char(kj, 'yyyymmdd')::numeric
from generate_series('2016-02-06 01:56:00','2016-02-06 23:57:00', '1 day'::interval) kj
              )
select col1,col2,col3
from foreign_table
where  col3 in (select * from serie) -- from CTE serie here is only one number 20160216

它的性能很差,外表有col3的索引。

但如果我手动从CTE系列写入值,它会快速执行

select col1,col2,col3
from foreign_table
where  col3 in (20160216,20160217)

我放了一个值,只是为了表明它可以快速运行多个值

如果我将“=”写入第一个查询而不是“in”,它也会执行快速

with serie as (
select to_char(kj, 'yyyymmdd')::numeric
from generate_series('2016-02-06 01:56:00','2016-02-06 23:57:00', '1 day'::interval) kj
              )
select col1,col2,col3
from foreign_table
where  col3 = (select * from serie) -- I can write "=" in this case because I have just one number returned from CTE

(我正在使用Postgres 9.5.1)

与手动编写这些值或使用“=”相比,为什么Postgres与CTE相比表现不佳。我显然不能手动编写值,因为我需要这个查询通用,我不能把它放在那里“=”因为我在这里也需要它。

这里有什么想法吗?

btw:这不是唯一一种情况,当in-clause与我在这里展示的其他两种方法相比表现不佳时

这些是查询计划,我还有其他不受外表影响的查询,一旦找到它们我也将它们放在这里

http://i.imgur.com/zeiXwwW.png

0 个答案:

没有答案