来源 海量数据解决方案
设置 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....;