oracle 插入-选择时未收集统计信息

92vpleto  于 2023-03-07  发布在  Oracle
关注(0)|答案(1)|浏览(172)

根据信息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 |
--------------------------------------------------------------------------------
vs3odd8k

vs3odd8k1#

首先检查数据库版本是否为12 g或更高版本
然后查看此文档链接

大容量加载的联机统计信息收集

从Oracle Database 12 c开始,数据库可以在以下类型的大容量装载期间自动收集表统计信息:INSERT INTO... SELECT使用直接路径插入到空表中,然后CREATE TABLE AS SELECT
因此,如果在INSERT之前您没有看到收集到的统计信息,并且该表为空,则您很可能
不要使用 * 直接路径插入 *(请参阅APPEND提示)
下面是一个简单数据的演示

select * from v$version;
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

创建表格

create table tab as
select rownum id, 'xxx' pad 
from dual connect by level <= 10000;

select NUM_ROWS from user_tables where table_name = 'TAB';

  NUM_ROWS
----------
     10000

直接插入

drop table tab;
create table tab
(id number,
pad varchar2(10));

insert /*+ APPEND */ into tab
select rownum id, 'xxx' pad 
from dual connect by level <= 10000;
commit;

select NUM_ROWS from user_tables where table_name = 'TAB';

  NUM_ROWS
----------
     10000

插入

但正常插入不产生统计收集!

drop table tab;
create table tab
(id number,
pad varchar2(10));

insert   into tab
select rownum id, 'xxx' pad 
from dual connect by level <= 10000;
commit;

select NUM_ROWS from user_tables where table_name = 'TAB';

  NUM_ROWS
----------

如果您认为自动收集应该发生,但实际上并未发生,请检查此处记录的限制
例如,如果 * 表统计信息被锁定 *,则禁止收集。

相关问题