V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

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

  •  
  •   LeeReamond · 2020-12-27 12:32:00 +08:00 · 973 次点击
    这是一个创建于 1425 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    内含三列 , 分别代表学生 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 秒时间进行排序是正常的,否则不正常。

    谢谢

    4 条回复    2020-12-27 18:32:55 +08:00
    liprais
        1
    liprais  
       2020-12-27 12:43:34 +08:00 via iPhone
    你会看执行计划么
    ayumilove
        2
    ayumilove  
       2020-12-27 13:26:47 +08:00
    Explain Plan +1
    LeeReamond
        3
    LeeReamond  
    OP
       2020-12-27 14:27:24 +08:00
    @liprais
    @ayumilove
    不会,怎么看啊,大佬教教
    noyidoit
        4
    noyidoit  
       2020-12-27 18:32:55 +08:00 via iPhone
    @LeeReamond 好兄弟,先百度一下,如果看不懂再来问
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1103 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:53 · PVG 06:53 · LAX 14:53 · JFK 17:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.