我对使用 FULL TABLE SCAN 的查询有疑问。
当这个查询在我们的 UAT 环境中运行时,它使用 TABLE ACCESS BY INDEX ROWID,但在 prod 中它使用 FULL TABLE SCAN。UAT 运行得比 PROD 好得多。
我们在 prod 和 uat 中具有相同的表和索引结构。
我已经尝试重建和重新创建索引,但使用了相同的解释计划。
表和索引静态也进行了更新。
你能帮我让这个查询使用 INDEX 访问而不是 FUll 表访问吗?
请参阅下面我们的产品和 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)|