【发布时间】:2012-05-08 03:27:33
【问题描述】:
我有这个查询,我想通过添加适当的索引来提高它的性能。
DELETE FROM MYTAB1 WHERE MYID1 IN (SELECT MYID2 FROM MYTAB2);
我不熟悉索引的语法和它们所需的设置类型。请提供相同的。这里的主要问题是 MYTAB1 有数百万条记录,因此查询需要很多时间。但是,MYTAB2 只有 1000 条记录。 MYID1 是 MYTAB1 的主键
我已尝试创建索引:
CREATE INDEX IDX_TAB1_ID1 ON MYTAB1(MYID1);
它对查询的性能没有太大影响。
我运行了解释计划并得到了这个:
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)|
------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 63977 | 11M| | 62216 (2)|
| 1 | DELETE | MYTAB1 | | | | |
| 2 | HASH JOIN RIGHT SEMI| | 63977 | 11M| 7688K| 62216 (2)|
| 3 | TABLE ACCESS FULL | MYTAB2 | 437K| 2561K| | 1189 (2)|
| 4 | TABLE ACCESS FULL | MYTAB1 | 3761K| 678M| | 24718 (4)|
------------------------------------------------------------------------------------
【问题讨论】:
-
那么请阅读文档,创建索引非常简单。回答“告诉我所有关于索引及其设置”的问题需要一本不那么短的书。
-
运行这个:EXPLAIN PLAN FOR DELETE FROM MYTAB1 WHERE MYID1 IN (SELECT MYID2 FROM MYTAB2);然后:从表中选择*(DBMS_XPLAN.DISPLAY);发布结果
-
我已编辑问题以包含查询计划
-
据此,MYTAB2 有 437,000 行。
-
啊,但优化器正在读取不同的统计数据。如果此表具有高度可变的行数,则使用 DBMS_Stats 包 i) 删除表统计信息和 ii) 锁定表统计信息。优化器将调用动态采样来计算查询执行时的行数,然后应该生成更好的执行计划。
标签: database oracle indexing query-performance