【问题标题】:nested query with two tables take more than 20 minutes包含两个表的嵌套查询需要 20 多分钟
【发布时间】:2022-06-16 23:07:05
【问题描述】:

这是我们的查询,执行该 SQL 需要 1229.206 秒(返回 8310286 行):

SELECT t_01.object_uid FROM HashTable t_01 WHERE t_01.object_uid 
IN (SELECT t_02.puid  FROM ObjectTable t_02 WHERE 
(t_02.arev_category IN (48,40)))

计划哈希值:1560846306

------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name              | E-Rows |E-Bytes| Cost (%CPU)|
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                   |        |       |   780K(100)|
|   1 |  NESTED LOOPS SEMI                   |                   |   7764K|   244M|   780K  (1)|
|   2 |   INDEX FULL SCAN                    | PIHashTable       |   7764K|   111M|  4073   (1)|
|*  3 |   TABLE ACCESS BY INDEX ROWID BATCHED| ObjectTable       |    290M|  4986M|     1   (0)|
|*  4 |    INDEX RANGE SCAN                  | PIOBJECTTABLE     |      1 |       |     1   (0)|
------------------------------------------------------------------------------------------------

table HashTable has 51154 blocks, last analyzed 2022/04/19 with 7764715 rows
    index PIHashTable on HashTable (OBJECT_UID)  last analyzed 2022/04/19 over 7764715 rows
table ObjectTable has 3327616 blocks, last analyzed 2022/05/02 with 290473386 rows
    index PIPPOM_OBJECT on ObjectTable (PUID)  last analyzed 2022/05/02 over 290473386 rows
    

Table ObjectTable 包含 290M 行,Hashtable 包含 7M 行

还是优化一下?

【问题讨论】:

    标签: sql


    【解决方案1】:

    返回 8M+ 行很可能需要一段时间。您应该实现分页而不是一次返回所有行。看起来你正在使用 Oracle,所以试试这个:

    select *
    from (
        SELECT t_01.object_uid, row_number() over(order by t_01.object_uid) r
        FROM HashTable t_01 
        WHERE t_01.object_uid IN (
            SELECT t_02.puid  FROM ObjectTable t_02 WHERE (t_02.arev_category IN (48,40))
        )
    )
    where r between 1 and 1000;
    

    然后你可以得到第 1 - 1000 行,然后是 1001 - 2000 等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多