【IT168 技术文档】
DBMS_STATS vs. ANALYZE
基于成本的优化依赖于统计数据,应该统计你的SQL语句访问到的所有表、簇和所有类型的索引,如果你的表大小和数据分布改变得很频繁,那就要定期生成统计数据,要让统计数据反应的是表中数据的真实情况。
SELECT * FROM TEST PARTITION;
这个语句使用了全局查询,没有使用谓词。
SELECT * FROM TEST S WHERE S.AMOUNT_OF_SHIFT > 1000;
这个语句为所有分区使用了一个谓词,但可能也使用了全局查询。
SELECT * FROM TEST PARTITION (SEP2009) S WHERE S.AMOUNT_OF_SHIFT > 1000;
这个语句使用了全局查询,并只为一个分区使用了谓词。
使用DBMS_STATS包收集全局统计数据更有用,因为ANALYZE总是串行的,而DBMS_STATS既可以串行又可以并行,只要可能,DBMS_STATS会使用并行方式收集统计数据,否则,它就调用串行查询或ANALYZE语句,但索引统计数据不能并行收集。
ANALYZE从单个分区收集统计数据,然后从分区统计数据计算出全局统计数据;DBMS_STATS可以为每个分区单独收集统计数据,并且可以为整个表或索引收集全局统计数据。根据被优化的不同SQL语句,优化器可能会选择分区(或子分区)统计,也可能选择全局统计。
CREATE TABLE PARTTAB(
ordid NUMBER,
PARTCOL DATE,
DETAILS NUMBER,
AMOUNT NUMBER)
PARTITION BY RANGE(PARTCOL)
SUBPARTITION BY HASH(DETAILS) SUBPARTITIONS 2
(PARTITION q1 VALUES LESS THAN(TO_DATE('01-04-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE1,
PARTITION q2 VALUES LESS THAN(TO_DATE('01-07-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE2,
PARTITION q3 VALUES LESS THAN(TO_DATE('01-10-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE3,
PARTITION q4 VALUES LESS THAN(TO_DATE('01-12-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE4
);
ordid NUMBER,
PARTCOL DATE,
DETAILS NUMBER,
AMOUNT NUMBER)
PARTITION BY RANGE(PARTCOL)
SUBPARTITION BY HASH(DETAILS) SUBPARTITIONS 2
(PARTITION q1 VALUES LESS THAN(TO_DATE('01-04-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE1,
PARTITION q2 VALUES LESS THAN(TO_DATE('01-07-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE2,
PARTITION q3 VALUES LESS THAN(TO_DATE('01-10-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE3,
PARTITION q4 VALUES LESS THAN(TO_DATE('01-12-2009','DD-MM-YYYY')) TABLESPACE TBLSPCE4
);
一个本地非前缀索引将会与之关联:
CREATE INDEX IDX_PARTTAB ON PARTTAB (ordid) LOCAL;
在开始下面的例子之前,表PARTTAB已经创建完毕。