我目前正在使用红移。我试图执行查询以从名为id_number
的VARCHAR列计算名为id
(数据类型为INTEGER)的列,以使用id_number
代替id
加速进一步查询。
这是我尝试的第一个查询:
select rank() over (order by id) id_number, id, sid1 ,sid2
from table
limit 10000
但是,注意到这个查询花了很长时间,我尝试了下一个查询:
with A as(
select id, sid1, sid2
from table
limit 10000
)
select rank() over (order by id) id_number, id, sid1 ,sid2
from A
一闪而过。
第二个查询如何花费更少的时间执行,而两个查询似乎完全相同?
如果是limit 10000
的位置,那么limit
的位置如何影响执行时间的差异?
答案 0 :(得分:2)
你的两个问题完全不同。
第一个必须对整个表进行排序以获取rank()
,然后发出结果的前10000行(没有强制执行特定排序)。
第二个选择10000行(没有强制执行特定排序),然后对它们进行排序以计算rank()
。
如果表明显大于10000行,那么第一个必须对其进行排序的查询要慢得多就不足为奇了。
查看EXPLAIN (ANALYZE, BUFFERS)
输出以更好地理解这一点。