Oracle 分析数据库表行长度的统计信息 使用聚簇的步骤

来源  海量数据解决方案

设置 PCTFREE  0.1

如果允许的情况下,尽量为行长度比较短的表创建聚簇,同时不要将单位聚簇的大小设定的过小。

ANALYZE TABLE   table_name   COMPUTE STATISTICSL;

SELECT  AVG_ROW_LEN FROM USER_TABLES WHERE TABLE_NAME='table_name';

1、创建聚簇

CREATE  CLUSTER sales_cluster (sale_date  varchar2(8)) STORAGE (storage_clurser...) PCTFREE 10 PCTUSED 60 SIZE 20000;

2、创建聚簇索引

CRAETE INDEX sales_cluster_idx ON CLUSTER sales_cluster PCTFREE 2 STORAGE (INITIAL 20K NEXT 10K);

3、为现在使用的表改名字

PNAME sales to sales_copy;

4、在聚簇内部创建表

 CREATE TABLE  sales(

 sale_date varchar2(8) not null,

....

)

CLUSTER sales_cluster (sale_date);

5、向已经创建了的表插入数据

INSERT INTO sales  

SELECT * FROM sales_copy WHERE  sale_date>....

6、删除现有的表,为新创建的表添加所创建的其他索引

DROP TABLE sales_copy;

CREATE INDEX ON sales(...);

       为了确保聚簇被很好的使用而采用的措施也随之变化,为了提高表连接的效率,在为经常执行表连接的表创建聚簇时,基本上都是把连接列作为聚簇键来使用。对于为了提高大范围数据查询的执行速度而创建的单表聚簇,就需要为其采取必要的措施了。

        不要以聚簇键列为先导列来创建组合索引。提高大范围数据查询的效率是我们创建单表聚簇的目标,利用它来提高使用   = 比较数据库查询的执行速度,但是在很多情况下也希望使用它来提高LIke 或 Between 运算的大范围数据查询的执行速度。

       在此情况尽管存在聚簇索引,但是如果仍然以聚簇键列为先导列创建组合索引,则在有些情况下优化器可能不选择使用该聚簇,而选择组合索引。所以,建议不要创建这种类型的索引。

    可以通过固定读取路径的方式来确保聚簇始终被使用  可以使用Hint 来固定执行计划

     SELECT /*+CLUSTER(sales)*/ SUM(count(*)) FROM salses WHERE sale_date BETWEEN  '20150112'   AND '20150120' AND....;

原文地址:https://www.cnblogs.com/liwenchaoCode/p/8327848.html