问题描述
嗨,
有没有一种方法可以在运行SQL时禁用统计信息。
不幸的是,当所有统计信息都从所涉及的表中删除时,我们的SQL运行速度很快。
但是我们需要收集统计数据以使其他查询有效地工作。
问题: 有没有办法在运行特定的SQL/查询时禁用/忽略对象的统计信息 (即使它们存在)?我们有什么暗示吗
对此一无所知?
谢谢
Apraim
有没有一种方法可以在运行SQL时禁用统计信息。
不幸的是,当所有统计信息都从所涉及的表中删除时,我们的SQL运行速度很快。
但是我们需要收集统计数据以使其他查询有效地工作。
问题: 有没有办法在运行特定的SQL/查询时禁用/忽略对象的统计信息 (即使它们存在)?我们有什么暗示吗
对此一无所知?
谢谢
Apraim
专家解答
不,但最有可能发生的是动态采样正在启动。例如。
因此,也许可以考虑在查询中添加 “dynamic_sampling(n)” 提示,并为有问题的SQL增加 “n” 级别
SQL> create table t as select * from dba_objects;
Table created.
SQL>
SQL> exec dbms_stats.delete_table_stats('','T');
PL/SQL procedure successfully completed.
SQL>
SQL> select max(object_id)
2 from t
3 where owner = 'SYS';
MAX(OBJECT_ID)
--------------
91248
SQL>
SQL> select * from dbms_xplan.display_cursor();
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------
SQL_ID b6dm0gh1kx8t2, child number 0
-------------------------------------
select max(object_id) from t where owner = 'SYS'
Plan hash value: 2966233522
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 442 (100)| |
| 1 | SORT AGGREGATE | | 1 | 79 | | |
|* 2 | TABLE ACCESS FULL| T | 54095 | 4173K| 442 (1)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OWNER"='SYS')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
因此,也许可以考虑在查询中添加 “dynamic_sampling(n)” 提示,并为有问题的SQL增加 “n” 级别
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




