Oracle 执行 SQL 命令时如何将排序限定在子查询内?

2020-12-27 12:32:00 +08:00
 LeeReamond

现有一表,行数为一千万。

内含三列 , 分别代表学生 ID, 插入时间,值

sid(int) ,stime(date), sgrade(int)

该表为 sid 和 stime 的复合索引。

执行如下语句

SELECT * FROM TABLE WHERE SID = 0

得到 5000 条数据,搜索时间 0.2 秒符合预期

然而希望将结果按时间排序时,

SELECT * FROM TABLE WHERE SID = 0 ORDER BY STIME DESC 

执行时间变成 13 秒,显然不符合预期。我推测是因为 oracle 首先对全表进行 order 操作,而后从中取出 sid=0 的部分,导致速度变慢。

于是尝试用子查询:

SELECT * FROM (SELECT * FROM TABLE WHERE SID = 0) ORDER BY STIME DESC 

执行时间 26 秒,不能理解原因

有没有大佬讲一下这个操作怎么实现,感觉 oracle 和 mysql 虽然都用 sql 语言写,但是差很多很多。

我的期望表现是,既然 0.2 秒能取出指定数据,那么再花 0.1 秒时间进行排序是正常的,否则不正常。

谢谢

978 次点击
所在节点    问与答
4 条回复
liprais
2020-12-27 12:43:34 +08:00
你会看执行计划么
ayumilove
2020-12-27 13:26:47 +08:00
Explain Plan +1
LeeReamond
2020-12-27 14:27:24 +08:00
@liprais
@ayumilove
不会,怎么看啊,大佬教教
noyidoit
2020-12-27 18:32:55 +08:00
@LeeReamond 好兄弟,先百度一下,如果看不懂再来问

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX