【发布时间】:2013-06-30 19:02:45
【问题描述】:
我对使用全表扫描的查询有疑问。
当这个查询在我们的 UAT 环境中运行时,它使用一个 TABLE ACCESS BY INDEX ROWID,但是在 prod 它使用全表扫描。 UAT 比 PROD 运行得更好。
我们在 prod 和 uat 中有相同的表和索引结构。
我已经尝试重建和重新创建索引,但使用了相同的解释计划。
表和索引的静态数据也更新了。
你能帮我让这个查询使用 INDEX 访问而不是 FUll 表访问吗?
请看下面我们的prod和uat的解释计划。
解释计划产品 ==================================================== ==================== SQL> 解释计划 选择 ASV_ODC_BRANCH.CODE、ASV_ODC_BRANCH.DESCRIPTION、ASV_ODC_BRANCH.BRSTN、DEB.VIEW_DORMANT.ACCTNO 作为 DORMANT_ACCT, DEB.VIEW_DORMANT.SHORTNAME 作为 DORMANT_NAME,DEB.VIEW_DORMANT.OPID_ENTRY,DEB.CUSTOMER.CUSTOMERNO, DEB.CUSTOMER.TIME_STAMP_ENTRY FROM ASV_ODC_BRANCH、DEB.VIEW_DORMANT、DEB.CUSTOMER WHERE trim(ASV_ODC_BRANCH.CODE) = decode(SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 3, 1) || SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 7, 1), '29', SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 4, 3), SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 3, 3)) 和 DEB.VIEW_DORMANT.ACCTNO = DEB.CUSTOMER.CUSTOMERNO AND (DEB.VIEW_DORMANT.ACCTNO = :Xacct) ORDER BY ASV_ODC_BRANCH.CODE, DORMANT_ACCT; 解释。 计划表输出 |身份证 |操作 |姓名 |行 |字节 |成本 (%CPU)| | 0 |选择声明 | | 3 | 489 | 3601 (2)| | 1 |排序方式 | | 3 | 489 | 3601 (2)| | 2 |哈希连接 | | 3 | 489 | 3600 (2)| | 3 |合并加入笛卡尔| | 1 | 90 | 3595 (2)| | 4 |嵌套循环 | | 1 | 66 | 3592 (2)| | 5 | **表访问已满** |帐户 | 1 | 56 | 3590 (2)| | 6 |按索引 ROWID 访问表|扩展1 | 1 | 10 | 2 (0)| | 7 |索引唯一扫描 | PKEXT10 | 1 | | 1 (0)| | 8 |缓冲区排序 | | 1 | 24 | 3593 (2)| | 9 |按索引 ROWID 访问表|客户 | 1 | 24 | 3 (0)| | 10 |索引范围扫描 | UXCUST1 | 1 | | 2 (0)| | 11 |表访问完全 | ASV_ODC_BRANCH |第334章24382 | 5 (0)| **解释计划 UAT** ==================================================== ===================================== SQL> 解释计划 选择 ASV_ODC_BRANCH.CODE、ASV_ODC_BRANCH.DESCRIPTION、ASV_ODC_BRANCH.BRSTN、DEB.VIEW_DORMANT.ACCTNO 作为 DORMANT_ACCT, DEB.VIEW_DORMANT.SHORTNAME 作为 DORMANT_NAME,DEB.VIEW_DORMANT.OPID_ENTRY,DEB.CUSTOMER.CUSTOMERNO, DEB.CUSTOMER.TIME_STAMP_ENTRY FROM ASV_ODC_BRANCH、DEB.VIEW_DORMANT、DEB.CUSTOMER WHERE trim(ASV_ODC_BRANCH.CODE) = decode(SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 3, 1) || SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 7, 1), '29', SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 4, 3), SUBSTR(DEB.VIEW_DORMANT.ACCTNO, 3, 3)) 和 DEB.VIEW_DORMANT.ACCTNO = DEB.CUSTOMER.CUSTOMERNO AND (DEB.VIEW_DORMANT.ACCTNO = :Xacct) ORDER BY ASV_ODC_BRANCH.CODE, DORMANT_ACCT; 解释。 SQL> / PLAN_TABLE_OUTPUT |身份证 |操作 |姓名 |行 |字节 |成本 (%CPU)| | 0 |选择声明 | | 5 | 5930 | 19 (11)| | 1 |排序方式 | | 5 | 5930 | 19 (11)| | 2 |哈希连接 | | 5 | 5930 | 18(6)| | 3 |合并加入笛卡尔| | 2 | 2220 | 12 (0)| | 4 |嵌套循环 | | 1 | 1085 | 9 (0)| | 5 | **按索引 ROWID 访问表**|帐户 | 1 | 57 | 7 (0)| | 6 |索引跳过扫描 | UXACCT2 | 1 | | 6 (0)| | 7 |按索引 ROWID 访问表|扩展1 | 1 | 1028 | 2 (0)| | 8 |索引唯一扫描 | PKEXT10 | 1 | | 1 (0)| | 9 |缓冲区排序 | | 1 | 25 | 10 (0)| | 10 |按索引 ROWID 访问表|客户 | 1 | 25 | 3 (0)| | 11 |索引范围扫描 | UXCUST1 | 1 | | 2 (0)| | 12 |表访问完全 | ASV_ODC_BRANCH | 336 | 25536 | 5 (0)|【问题讨论】:
-
一个数据库如何使用全表扫描而另一个没有,这是个问题,我们该如何改进它
标签: performance oracle indexing