Sql 两个结果相同的查询执行时间相差很大?

Sql 两个结果相同的查询执行时间相差很大?,sql,amazon-redshift,Sql,Amazon Redshift,我目前正在使用红移。我试图执行一个查询,从名为id的VARCHAR列中计算一个名为id\u number(数据类型整数)的列,以使用id\u number而不是id加快进一步的查询 以下是我尝试的第一个查询: select rank() over (order by id) id_number, id, sid1 ,sid2 from table limit 10000 但是,注意到此查询花费了相当长的时间,我尝试了下一个查询: with A as( select id, sid1, sid

我目前正在使用红移。我试图执行一个查询,从名为
id
的VARCHAR列中计算一个名为
id\u number
(数据类型整数)的列,以使用
id\u 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)
输出以更好地理解这一点。

表实际有多少行?在第一个查询中,对整个表执行rank(),然后对其进行限制。在第二种情况下,将其限制在一个简单的select上,然后调用rank()。在第二种情况下,在调用rank()之前切断结果。
在第二种情况下,将其限制在一个简单的select上,然后调用rank()。在第二种情况下,在调用rank()之前切断结果。
它们的意思不一样吗,在调用rank()之前限制(切断)?据我所知,限制是在
选择之后应用的。。。从
,在第一种情况下是在作为选择的一部分执行秩之后。在第二种情况下,
选择。。。from
是有限的,并且在结果上调用秩。如果我错了,请让我知道。。。