根据信息here,我希望在Oracle中对新表执行Insert-Select操作期间自动收集统计信息,但是,在执行insert-Select操作后,我没有看到任何表级统计信息。
我已经将参数***_optimizer_gather_stats_on_load***设置为 TRUE。
根据要求(这只适用于新表),我创建了一个新表。在插入-选择操作之前没有行,在插入-选择操作之后有500行。
我还漏掉了什么吗?
更新:这是我的数据库版本
select banner from v$version;
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
下面是正在创建的目标表:
create table test(id number, a number, b number);
下面是我的插入语句:
insert /*+ APPEND */ into test select id, a, b from duptab;
下面是我的参数值:
NAME TYPE VALUE
------------------------------------ ----------- -------
_optimizer_gather_stats_on_load boolean TRUE
仍未收集统计信息:
SQL> select NUM_ROWS from user_tables where table_name = 'TEST';
NUM_ROWS
----------
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
计划是这样的
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 17 | 663 | 3 (0)| 00:00:01 |
| 1 | LOAD AS SELECT | TEST | | | | |
| 2 | MAT_VIEW ACCESS FULL| DUPTAB | 17 | 663 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
1条答案
按热度按时间vs3odd8k1#
首先检查数据库版本是否为12 g或更高版本
然后查看此文档链接
大容量加载的联机统计信息收集
从Oracle Database 12 c开始,数据库可以在以下类型的大容量装载期间自动收集表统计信息:INSERT INTO... SELECT使用直接路径插入到空表中,然后CREATE TABLE AS SELECT
因此,如果在
INSERT
之前您没有看到收集到的统计信息,并且该表为空,则您很可能不要使用 * 直接路径插入 *(请参阅
APPEND
提示)下面是一个简单数据的演示
创建表格
直接插入
插入
但正常插入不产生统计收集!
如果您认为自动收集应该发生,但实际上并未发生,请检查此处记录的限制
例如,如果 * 表统计信息被锁定 *,则禁止收集。