DBMS_STATS包来对临时表收集统计信息,它们均会提交当前事务。所以如果应用对事务有强一致性的要求,同时在当前事务中在导入数据后又必须得在同一个事务中进行相关的后续业务处理,则可以在后续处理的相关SQL中加入Hint(或者使用SQL Profile/SPM来替换相关SQL的执行计划)以让Oracle走出理想执行计划而不再受统计信息正确与否的干扰;3、94#提到的使用动态采样也是一种方法
2、通过重构表来降低聚簇因子的方法我不常用。在Oracle数据库中,能够降低目标索引的聚簇因子的唯一方法就是对表中数据按照目标索引的索引键值排序后重新存储。这里需要注意的,这种按某一个目标索引的索引键值排序后重新存储表中数据的方法确实可以降低该目标索引的聚簇因子的值,但可能会同时增加该表上存在的其他索引的聚簇因子的值。
表和索引的碎片,在什么时间点整理比较好,对性能改善比较大?
一般来说是这样:如果你在建表空间时指定了uniform size,extent级别的碎片基本上可以说就没有了。如果不是uniform size,你可以将受碎片问题困扰的表和索引迁移到uniform size的表空间(如用在线重定义等手段),迁移的时机应该是选择在系统不那么忙的时候做。
2009532140 发表于 2013-12-13 15:34
你说的范式,这个我知道数据库理论教材中看过..
但实际运用上,我咋感觉基本没人关注这个问题呢?
再者 …
你的感觉不一定是事实。
char是定长的,varchar2是变长的,同样定义一列,如果是用char(10),则存储'0'会占用10个byte;如果是用varchar2(10),则存储'0'只会占用1个byte,你觉是用哪个更省存储空间?
SQL> create table t1(c1 char(10),c2 varchar2(10));
Table created
SQL> insert into t1 values('0','0');
1 row inserted
SQL> commit;
Commit complete
SQL> select lengthb(c1),lengthb(c2) from t1;
LENGTHB(C1) LENGTHB(C2)
———– ———–
10 1
是,长度变化确实有可能会导致行迁移,但不能因此就不用varchar2。实际上,行迁移是在所难免的,我们也不能因噎废食。
|