【问题标题】:Oracle - Inner query takes timeOracle - 内部查询需要时间
【发布时间】:2021-10-06 18:41:35
【问题描述】:

我有两个疑问:

select * from PRE_DETAIL_REPORT a where item = (select item from apple_skus);
select * from PRE_DETAIL_REPORT a where item IN ('100299122');

表:APPLE_SKUS 只有一项:100299122

当我运行第一个查询时,执行需要 2 分钟 当我运行第二个查询时,执行需要 3 秒

可能是什么原因?

【问题讨论】:

  • 查询 1 还必须读取 apple_skus 表。
  • 表格只有一行
  • 对不起,错过了那部分。比较执行计划。
  • 对两者运行解释计划并发布结果
  • PRE_DETAIL_REPORT 是视图吗? APPLE_SKUS 是一张曾经很大但被删除到一行的表 - 如果没有回收该空间,有时单行可能会占用磁盘上的大量空间。运行此查询以查看使用了多少兆字节的磁盘空间来存储那一行数据:select bytes/1024/1024 mb from dba_segments where segment_name = 'APPLE_SKUS'; 要生成解释计划,请运行explain plan for select ...,然后运行select * from table(dbms_xplan.display),对这两个查询,然后编辑问题计划。

标签: sql oracle


【解决方案1】:

你可以这样改写:

select a.* from PRE_DETAIL_REPORT a 
join apple_skus t on t.item = a.item;

【讨论】:

    【解决方案2】:

    这是 sql 查询语法的工作方式

    您在第二个查询中有手动选择值,但在第一种情况下,您再次指定了子查询

    FROM CLAUSE, N THEN SELECT 所以,查询一个表需要 即使只有一条记录,也比硬编码值更多时间

    您可以尝试 EXISTS,因为它使用相关子查询,这样会快得多

        Select * from table  t1 where exists (select  1 from table 
        where 
         Item =t1.item)
    

    【讨论】:

      【解决方案3】:

      差异很可能是由于对 PRE_DETAIL_REPORT 的访问不同;正如前面有人提到的,一个解释计划(或 SQL 监视器报告)会告诉你答案。 但在您提供诊断之前,这只是猜测……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多