SQL调优问题

时间:2010-12-01 07:24:48

标签: sql oracle performance

我有一个问题:

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 |
-----------------------------------------------------------------------------------------------------

好吗?我想不是,但我期待更好的结果......你有什么想法吗?

3 个答案:

答案 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添加索引