今天在群里面看到一个消息。提问是这样的 他认为oracle 10g很痛苦,随着数据量的变化,sql的执行计划在不停的改变,导致同一个存储过程,时间点不同,执行效率就不同.
他的问题是有没有好的方法让执行计划不改变,个人认为是锁定统计信息。
如何锁定统计信息,下面来分布说明:
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'LBAS',
tabname => 'dw_crm_day_user',
estimate_percent => 20,
method_opt => 'for all columns size auto',
no_invalidate => FALSE,
degree => 4,
granularity => 'ALL',
cascade => TRUE);
END;
/
他的问题是有没有好的方法让执行计划不改变,个人认为是锁定统计信息。
如何锁定统计信息,下面来分布说明:
1. 首先收集统计信息:
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'LBAS',
tabname => 'DW_BO_ORDER',
estimate_percent => 20,
method_opt => 'for all columns size auto',
no_invalidate => FALSE,
degree => 4,
granularity => 'ALL',
cascade => TRUE);
END;
/
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'LBAS',
tabname => 'dw_crm_day_user',
estimate_percent => 20,
method_opt => 'for all columns size auto',
no_invalidate => FALSE,
degree => 4,
granularity => 'ALL',
cascade => TRUE);
END;
/
2. 查看如下语句的执行计划
SELECT *
FROM DW_BO_ORDER A,
DW_CRM_DAY_USER B
WHERE A.PROD_ID = B.PROD_ID AND
STATUS_CD = 'C' AND
BO_ORDER_TYPE = 2;
FROM DW_BO_ORDER A,
DW_CRM_DAY_USER B
WHERE A.PROD_ID = B.PROD_ID AND
STATUS_CD = 'C' AND
BO_ORDER_TYPE = 2;
3. 使用dbms_stats锁定状态统计信息
4. 查看统计信息
6 rows selected
统计信息被锁定
5. 如果想修改执行计划,就解锁统计信息从新收集