5年前问题的答案,如何造统计信息

数据变化有规律的前提下,为了减少收集统计信息耗时或避免错过收集窗口,巧妙的办法是复制统计信息

set lin 120
create table sales_range
(salesman_id number(5),
salesman_name varchar2(30),
sales_amount number(10),
sales_date date)
partition by range(sales_date)
(
partition sales_jan2000 values less than(to_date('01/02/2000','dd/mm/yyyy')),
partition sales_feb2000 values less than(to_date('01/03/2000','dd/mm/yyyy')),
partition sales_mar2000 values less than(to_date('01/04/2000','dd/mm/yyyy')),
partition sales_apr2000 values less than(to_date('01/05/2000','dd/mm/yyyy'))
);

create index salesman_id_ix on sales_range (salesman_id) local;

insert into sales_range values(10,'scott',1000,'01-jan-2000');
insert into sales_range values(20,'smith',1200,'01-jan-2000');
insert into sales_range values(30,'allen',1300,'01-jan-2000');
commit;

exec dbms_stats.gather_table_stats(ownname=>'', tabname=> 'sales_range', granularity=>'all');

select count(*) from sales_range partition (sales_jan2000);
select partition_name,num_rows,avg_row_len,blocks,last_analyzed from user_tab_partitions where table_name='SALES_RANGE';
select partition_name, num_rows,leaf_blocks,avg_leaf_blocks_per_key,last_analyzed from  user_ind_partitions where index_name='SALESMAN_ID_IX';

根据需要考虑是否锁定
--exec dbms_stats.unlock_table_stats('','sales_range');
exec dbms_stats.copy_table_stats('','sales_range','sales_jan2000','sales_feb2000',1.01);
--exec dbms_stats.lock_table_stats('','sales_range');

exec dbms_stats.delete_table_stats(ownname=>user,tabname=>'sales_range',partname=>'sales_feb2000',cascade_indexes=>true);

在这里插入图片描述

如果不锁定,后期收集窗口会修改吗?
会的

SALES_FEB2000的实际数据有1条
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值