暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 执行SQL时忽略统计信息

ASKTOM 2020-06-14
472

问题描述

嗨,

有没有一种方法可以在运行SQL时禁用统计信息。

不幸的是,当所有统计信息都从所涉及的表中删除时,我们的SQL运行速度很快。
但是我们需要收集统计数据以使其他查询有效地工作。

问题: 有没有办法在运行特定的SQL/查询时禁用/忽略对象的统计信息 (即使它们存在)?我们有什么暗示吗
对此一无所知?

谢谢
Apraim

专家解答

不,但最有可能发生的是动态采样正在启动。例如。

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论