我目前正在使用redshift。我试图执行一个查询,从一个名为 id
的 VARCHAR 列中计算一个名为 id_number
(数据类型 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
的位置如何促成执行时间的差异?
您的两个查询完全不同。
第一个必须对整个表进行排序以获取rank()
,然后发出结果的前 10000 行(没有强制实施特定的排序(。
第二个选择10000行(没有强制实施特定的排序(,然后对这些行进行排序以计算rank()
。
如果表明显大于 10000 行,则必须对所有表进行排序的第一个查询要慢得多也就不足为奇了。
查看EXPLAIN (ANALYZE, BUFFERS)
输出以更好地理解这一点。