`

Oracle分区键与分区本地索引

阅读更多

关于全局索引和本地索引的优缺点,分别应该在什么情况下使用,这方面的资料很多,本文不作讨论。本文讨论一种特殊情况,即建立在分区键之上的本地索引。9i也算是很老的Oracle版本了,只是很多系统包括很多大型的核心的系统都在用,因此本文介绍建立在分区键列上的本地索引存在的问题。下面是一些测试: 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1   1   SQL> create table t1 ( a int, b varchar2(300)) partition by range(a)  
2   2  (  
3   3   partition p01 values less than (1000),  
4   4   partition p02 values less than (2000),  
5   5   partition p03 values less than (3000),  
6   6   partition p04 values less than (4000),  
7   7   partition p05 values less than (5000),  
8   8   partition p06 values less than (6000),  
9   9   partition p07 values less than (7000),  
10 10   partition p08 values less than (8000),  
11 11   partition p09 values less than (9000),  
12 12   partition p10 values less than (10000),  
13 13   partition p11 values less than (11000),  
14 14   partition p12 values less than (12000),  
15 15   partition p13 values less than (13000),  
16 16   partition p14 values less than (14000),  
17 17   partition p15 values less than (15000),  
18 18   partition p16 values less than (16000),  
19 19   partition p17 values less than (17000),  
20 20   partition p18 values less than (18000),  
21 21   partition p19 values less than (19000),  
22 22   partition p20 values less than (20000)  
23 23  )  
24 24  /  
25   
26 表已创建。  
27   
28 SQL> insert into t1 select rownum,lpad('x',200,'x') from dual connect by rownum<20000;  
29   
30 已创建19999行。  
31   
32 SQL> commit;  
33   
34 提交完成。  
35   
36 SQL> insert /*+ append */ into t1 select * from t1;  
37   
38 已创建19999行。  
39   
40 SQL> commit;  
41   
42 提交完成。  
43   
44 SQL> insert /*+ append */ into t1 select * from t1;  
45   
46 已创建39998行。  
47   
48 SQL> commit;  
49   
50 提交完成。  
51   
52 SQL> insert /*+ append */ into t1 select * from t1;  
53   
54 已创建79996行。  
55   
56 SQL> commit;  
57   
58 提交完成。  
59   
60 SQL> insert /*+ append */ into t1 select * from t1;  
61   
62 已创建159992行。  
63   
64 SQL> commit;  
65   
66 提交完成。  
67   
68 SQL> insert /*+ append */ into t1 select * from t1;  
69   
70 已创建319984行。  
71   
72 SQL> commit;  
73   
74 提交完成。

 

  首先建立一个测试范围分区表,分区键列是”a”,共20个分区,在这个测试表中生成约64万行数据。下面在列a上建本地索引并收集统计信息: 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1 SQL> create index t1_idx on t1(a) local;  
2   
3 索引已创建。  
4   
5 SQL> exec dbms_stats.gather_table_stats(user,'T1',  
6     method_opt=>'for all columns size 1',cascade=>true);  
7   
8 PL/SQL 过程已成功完成。  
9 SQL> @sosi  
10   
11 Please enter Name of Table Owner (Null = TEST):  
12 Please enter Table Name to show Statistics for: t1  
13   
14 ***********  
15 Table Level  
16 ***********  
17   
18 Table                   Number                 Empty  
19 Name                   of Rows   Blocks       Blocks  
20 --------------- -------------- -------- ------------  
21 T1                     639,968   18,880            0  
22   
23 Column                    Column                       Distinct            Number       Number  
24 Name                      Details                        Values   Density Buckets        Nulls  
25 ------------------------- ------------------------ ------------ --------- ------- ------------  
26 A                         NUMBER(22)                     19,999   .000050       1            0  
27 B                         VARCHAR2(300)                       1  1.000000       1            0  
28   
29                               B  
30 Index                      Tree     Leaf       Distinct         Number      Cluster  
31 Name            Unique    Level     Blks           Keys        of Rows       Factor  
32 --------------- --------- ----- -------- -------------- -------------- ------------  
33 T1_IDX          NONUNIQUE     1    1,390         19,999        639,968      639,968  
34   
35 Index           Column                     Col Column  
36 Name            Name                       Pos Details  
37 --------------- ------------------------- ---- ------------------------  
38 T1_IDX          A                            1 NUMBER(22)  
39   
40 ***************  
41 Partition Level  
42 ***************  
43   
44   Part Partition               Number                 Empty  
45    Pos Name                   of Rows   Blocks       Blocks  
46 ------ --------------- -------------- -------- ------------  
47      1 P01                     31,968      944            0  
48      2 P02                     32,000      944            0  
49      3 P03                     32,000      944            0  
50      4 P04                     32,000      944            0  
51      5 P05                     32,000      944            0  
52      6 P06                     32,000      944            0  
53      7 P07                     32,000      944            0  
54      8 P08                     32,000      944            0  
55      9 P09                     32,000      944            0  
56     10 P10                     32,000      944            0  
57     11 P11                     32,000      944            0  
58     12 P12                     32,000      944            0  
59     13 P13                     32,000      944            0  
60     14 P14                     32,000      944            0  
61     15 P15                     32,000      944            0  
62     16 P16                     32,000      944            0  
63     17 P17                     32,000      944            0  
64     18 P18                     32,000      944            0  
65     19 P19                     32,000      944            0  
66     20 P20                     32,000      944            0  
67                                     B  
68 Index           Partition        Tree     Leaf       Distinct         Number  
69 Name            Name            Level     Blks           Keys        of Rows  
70 --------------- --------------- ----- -------- -------------- --------------  
71 T1_IDX          P01                 1       67            999         31,968  
72 T1_IDX          P02                 1       67          1,000         32,000  
73 T1_IDX          P03                 1       67          1,000         32,000  
74 T1_IDX          P04                 1       67          1,000         32,000  
75 T1_IDX          P05                 1       67          1,000         32,000  
76 T1_IDX          P06                 1       67          1,000         32,000  
77 T1_IDX          P07                 1       67          1,000         32,000  
78 T1_IDX          P08                 1       67          1,000         32,000  
79 T1_IDX          P09                 1       67          1,000         32,000  
80 T1_IDX          P10                 1       67          1,000         32,000  
81 T1_IDX          P11                 1       72          1,000         32,000  
82 T1_IDX          P12                 1       72          1,000         32,000  
83 T1_IDX          P13                 1       72          1,000         32,000  
84 T1_IDX          P14                 1       72          1,000         32,000  
85 T1_IDX          P15                 1       72          1,000         32,000  
86 T1_IDX          P16                 1       72          1,000         32,000  
87 T1_IDX          P17                 1       72          1,000         32,000  
88 T1_IDX          P18                 1       72          1,000         32,000  
89 T1_IDX          P19                 1       72          1,000         32,000  
90 T1_IDX          P20                 1       72          1,000         32,000  

 


  下面执行查询:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1 SQL> set arraysize 1000  
2 SQL> set autot traceonly  
3 SQL> select * from t1 where a=1000;  
4   
5 已选择32行。  
6   
7 Execution Plan  
8 ----------------------------------------------------------  
9    0      SELECT STATEMENT Optimizer=CHOOSE (Cost=33 Card=32 Bytes=652  
10           8)  
<span st
分享到:
评论

相关推荐

    分区索引,本地索引,全局索引的区别

    ### 分区索引—本地索引与全局索引的区别 #### 一、Oracle分区索引概念及分类 在Oracle数据库中,分区索引是针对分区表的一种特殊索引类型,它可以显著提高对于大规模数据集的查询性能。根据索引是否与表的分区...

    oracle索引与分区索引介绍

    Oracle 索引与分区索引介绍 Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建...

    oracle分区表分区索引.docx

    Oracle 分区表分区索引详解 Oracle 分区表分区索引是 Oracle 数据库中的一种重要机制,它可以提高数据的存储和查询效率。下面将详细介绍 Oracle 分区表分区索引的类型、分类、创建方法和维护方式。 一、分区表和...

    ORACLE分区与索引

    针对分区表,Oracle 提供了分区索引,它允许索引与分区策略相结合。例如,可以创建局部索引,每个分区都有自己的索引,或者创建全局索引,覆盖所有分区。局部索引通常在查询性能上有优势,而全局索引则适用于跨分区...

    Oracle 分区表 分区索引

    ### Oracle 分区表与分区索引详解 #### 一、Oracle分区概述 在Oracle数据库中,分区技术是一种非常有效的管理大型表和索引的方法。通过将一个大的表或索引分成多个较小的部分(分区),可以显著提高查询性能,并...

    Oracle分区表及分区索引

    Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...

    深入学习分区表及分区索引(详解oracle分区).docx

    以下是对Oracle分区表和分区索引的深入解析: 1. **何时使用分区**: - 当表的数据量超过2GB时,分区有助于避免32位操作系统下的文件大小限制,同时减少大规模数据的备份时间。 - 对于包含历史数据的表,如按月份...

    Oracle 分区表 分区索引 索引分区详解

    虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

    oracle分区与索引

    ### Oracle 分区与索引详解 #### 一、Oracle 分区概述 在Oracle数据库中,分区是一种物理数据组织技术,它将一个大的表或索引分成多个较小的部分,每个部分都可以独立管理。通过分区,可以显著提高查询性能,简化...

    深入oracle分区索引的详解

    局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样。2.如果局部索引的索引列以分区键开头,则称为前缀局部索引。3.如果局部索引的列不是以...

    Oracle表分区和索引分区

    ### Oracle表分区与索引分区详解 #### 一、Oracle表分区概述 Oracle表分区是一种高级数据组织技术,主要用于提高大型表(特别是TB级别的数据仓库)的管理效率和查询性能。自Oracle 8版本起,引入了分区特性,通过...

    Oracle分区表和分区索引在VLDB中的研究.pdf

    "Oracle分区表和分区索引在VLDB中的研究" 本文研究了Oracle分区表和分区索引在VLDB(Very Large Databases)中的应用。分区表和分区索引是数据库管理中的关键技术之一,是VLDB中一个重要的性能提升机制。通过分析一...

    Oracle分区技术介绍

    Oracle分区技术是一种数据库管理系统(DBMS)特性,用于将大型表和索引分割成更小、更易管理和处理的部分,从而提升查询性能和数据管理效率。这种技术特别适用于数据仓库和决策支持系统(DSS),因为这些系统通常...

    深入学习分区表及分区索引(详解oracle分区.docx

    分区索引与表分区相对应,而全局索引则跨越所有分区。非分区表可以拥有分区或非分区索引,但分区表必须至少有一个分区键,最多可包含16个列,这些列可以是可为空的。 在应用分区时,重要的是保持分区的逻辑一致性,...

    Oracle分区表详解

    Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。通过将一个大型的表或者索引分割成多个较小且可管理的部分,分区技术能够显著提升数据库的性能、可用性和可维护性。 ##### 分区的作用: 1. **...

    Oracle分区表培训

    分区索引示例.sql"探讨了与分区相关的索引策略。在分区表上创建索引可以进一步提升查询效率,因为索引也可以被分区。全局索引覆盖所有分区,而局部索引仅针对单个或一组分区。选择哪种类型的索引取决于查询模式和...

Global site tag (gtag.js) - Google Analytics