我有一个问题:
select count(1) CNT
from file_load_params a
where a.doc_type = (select b.doc_type
from file_load_header b
where b.indicator = 'XELFASI')
order by a.line_no
解释计划是:
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 7 | | |
|* 2 | TABLE ACCESS FULL | FILE_LOAD_PARAMS | 15 | 105 | 2 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| FILE_LOAD_HEADER | 1 | 12 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | FILE_LOAD_HEADER_UK | 1 | | 0 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------
我认为我可以优化此查询并编写此查询:
select count(1) CNT
from file_load_params a,file_load_header b
where b.indicator = 'XELFASI'
and a.doc_type = b.doc_type
order by a.line_no
其解释计划是:
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 19 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 19 | | |
| 2 | NESTED LOOPS | | 15 | 285 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| FILE_LOAD_HEADER | 1 | 12 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | FILE_LOAD_HEADER_UK | 1 | | 0 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | FILE_LOAD_PARAMS | 15 | 105 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------
好吗?我想不是,但我期待更好的结果......你有什么想法吗?
答案 0 :(得分:3)
根据解释计划,这些似乎是微小的表格,查询的成本可以忽略不计。它们需要运行多长时间以及运行它们需要多快?
但删除ORDER BY。由于您选择单行COUNT聚合,因此毫无意义。
答案 1 :(得分:2)
我从您的解释计划中看到的一种可能的优化是
TABLE ACCESS FULL | FILE_LOAD_PARAMS
这似乎表明表file_load_params
可能没有doc_type
上的任何索引
如果是这种情况,您可以为doc_type
添加索引吗?如果您已有索引,可以发布file_load_params
答案 2 :(得分:1)
两个查询的结果不一样。 IN运算符自动也将DISTINCT应用于内部查询。在这种情况下,它可能不是您加入的密钥(如果是,则将其设为唯一密钥),因此无法进行优化。
至于优化查询,然后像InSane所说,在Doc_Type
FILE_LOAD_PARAMS
添加索引