【发布时间】:2011-02-14 11:56:15
【问题描述】:
select TABLE1.FIELD1,
TABLE1.FIELD2,
TABLE1.FIELD3,
TABLE1.FIELD4,
TABLE1.FIELD5,
TABLE2.FIELD6,
TABLE2.FIELD7
from TABLE1,
TABLE2
where TABLE1.FIELD8 = 'value'
and TABLE2.FIELD6 = TABLE1.FIELD6;
我正在从 2 个不同的表中搜索一些数据。 (Oracle 数据库 - 两个表的 wherefields 索引) 上面的查询需要 500 毫秒才能执行。 当我分别在表格中搜索相同的字段时 它们每个都在不到 20 毫秒的时间内完成。
我可以在 TABLE1 中搜索我需要的数据 (+FIELD6) 然后使用 FIELD6 在 TABLE2 中搜索其余部分。
我的问题是。为什么我加入表格时速度要慢得多。 我做错了吗?
编辑:添加 oracle 的解释计划
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6318 | 586K| 620 |
| 1 | HASH JOIN | | 6318 | 586K| 620 |
| 2 | TABLE ACCESS BY INDEX ROWID| TABLE1 | 6318 | 450K| 2 |
| 3 | INDEX RANGE SCAN | INDEX_TABLE1_FIELD8 | 2527 | | 1 |
| 4 | TABLE ACCESS FULL | TABLE2 | 430K| 9242K| 508 |
----------------------------------------------------------------------------------------
Note: cpu costing is off, 'PLAN_TABLE' is old version
【问题讨论】:
-
您的表中有多少条记录?你试过用 ANSI 连接语法重写吗?
-
您能否展示一下 Oracle 为“解释计划”提供了什么?
-
TABLE1 有 600000 个值 10 个字段,TABLE2 有 5000 个值 500 个字段(请不要对此发表评论,我知道这很糟糕,这不是我的数据库)。 ANSI 连接语法具有相同的结果
-
您应该避免隐式连接,并使用
inner join table2 on (table1.field6 = table2.field6)并在 Where 子句中只保留过滤器。 (不过,与您的问题无关)。
标签: sql performance oracle optimization