我有这个问题:
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与我在这里展示的其他两种方法相比表现不佳时
这些是查询计划,我还有其他不受外表影响的查询,一旦找到它们我也将它们放在这里