sql - Oracle SQL查询查询稍有改动导致结果返回时间差异大

标签 sql oracle

H 我试图弄清楚为什么两个相似但略有不同的 SQL 查询在运行它们所花费的时间之间存在如此大的差异。 我将不胜感激根据以下两个示例和报告的时间提供的信息。

第一个查询如下,运行大约需要 115 - 154 秒。

SELECT * FROM 
(
    SELECT a.*, ROWNUM rnum 
    FROM 
    (
        SELECT ERR_ID, ERR_CREATED_BY,TO_CHAR(ERR_CREATED_DATE, 'DD/MM/YYYY H24:MI'),  
               ERR_SOURCE, ERR_DETAIL  
        FROM tdsys_errors  err   
        WHERE ERR_SOURCE = 'Online Transaction'  
        ORDER BY ERR_ID DESC 
    ) a 
    WHERE ROWNUM <= 25
) 
WHERE rnum > 0;

第二个查询在“ORDER BY ERR_ID DESC” block 的位置上有轻微的变化,运行大约需要 0.07 秒

SELECT * FROM 
(
    SELECT a.*, ROWNUM rnum 
    FROM 
    (
        SELECT ERR_ID, ERR_CREATED_BY,TO_CHAR(ERR_CREATED_DATE, 'DD/MM/YYYY H24:MI'),  
               ERR_SOURCE, ERR_DETAIL  
        FROM tdsys_errors  err   
        WHERE ERR_SOURCE = 'Online Transaction'    
    ) a 
    WHERE ROWNUM <= 25
) 
WHERE rnum > 0
ORDER BY ERR_ID DESC;

我猜第二个查询是在结果到达之后排序的,而第一个查询试图一次完成所有操作。 这是我想知道的 SQL 最佳实践案例吗?为什么会有这样的差异?

谢谢

最佳答案

您自己的总结是正确的,第一个查询按 err_id 对来自 tdsys_errors 的行进行排序,获取其中的前 25 个行,然后返回这些行。第二个查询只输出 25 行(不保证顺序),然​​后对这 25 行随机排序。

关于sql - Oracle SQL查询查询稍有改动导致结果返回时间差异大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10231423/

相关文章:

MySQL 在 EAV 表中按值排序?

sql - LIKE '%' 的全文搜索等效项是什么?

MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY

php - 取决于用户 ID

java - 使用 Spring Boot 在两个或多个 (Oracle) 数据库上使用多个存储过程?

sql - 在 C 中将字符串作为 SQL 查询执行

c# - 在 C# 中获取数据库表名

sql - db2 sql 脚本文件

sql - Oracle SQL 查询按组获取剩余金额

oracle - 如何为 oracle 选择查询计时