- 浏览: 337686 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
hufangxian:
估计面试官都被你的回答搞晕了。
抽象类和接口的理解 -
alvin198761:
需要了解多态和设计模式,了解一些框架的原理,你就知道这东东真正 ...
抽象类和接口的理解 -
sangei:
谢谢楼上提醒,希望慢慢能有所进步。
抽象类和接口的理解 -
jackra:
书背的不错可以看看设计模式如何使用抽象类
抽象类和接口的理解 -
ptsd:
lag(column_x,number1,XX)用来返回当前数 ...
【转】oracle的LAG和LEAD分析函数
总结自ORACLE官方在线帮助文档。
ORACLE 为构建数据仓库提供了4种类型的分区方法:Range Partition ,Hash Partition ,List Partition,Composite Partition.
下面我分别对这四种分区方法的概念,他们的使用场景,以及各种分区方法做一个性能比较。
一:概念
1:Range Partitioning
这是最常用的一种分区方法,基于COLUMN的值范围做分区,最常见的是基于时间字段的数据的范围的分区,比如:对于SALE表,可以对销售时间按照月份做一个Range Partitioning。这种分区在数据仓库里用的比较多,以下是CREATE STATMENT
CREATE TABLE sales_range
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE)
COMPRESS
PARTITION BY RANGE(sales_date)
(PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY')),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY')),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY')),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY')));
对于COMPRESS关键字的理解,将在后续的压缩分区讲到
下面我分别对这四种分区方法的概念,他们的使用场景,以及各种分区方法做一个性能比较。
一:概念
1:Range Partitioning
这是最常用的一种分区方法,基于COLUMN的值范围做分区,最常见的是基于时间字段的数据的范围的分区,比如:对于SALE表,可以对销售时间按照月份做一个Range Partitioning。这种分区在数据仓库里用的比较多,以下是CREATE STATMENT
CREATE TABLE sales_range
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE)
COMPRESS
PARTITION BY RANGE(sales_date)
(PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY')),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY')),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY')),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY')));
对于COMPRESS关键字的理解,将在后续的压缩分区讲到
2;Hash Partitioning
Hash Partitioning映射数据到基于HASH算法的分区上,HASH算法将应用你指定的分区关键字,平均的分那些在Partitions中的行。给每一个分区近似相同的大小,要保证数据能平均分配,分区数一般是2N。比如说,需要insert sales_hash 一条数据,ORACLE会通过HASH算法处理salesman_id,然后找到对于的分区表进行insert。Hash Partitioning 是为跨越设备的分布式数据提供了一种理想的方法,HASH算法也很容易转化成RANGE分区方法,特别是当被分区的数据不是历史数据时。
CREATE TABLE sales_hash
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 4;
Hash Partitioning映射数据到基于HASH算法的分区上,HASH算法将应用你指定的分区关键字,平均的分那些在Partitions中的行。给每一个分区近似相同的大小,要保证数据能平均分配,分区数一般是2N。比如说,需要insert sales_hash 一条数据,ORACLE会通过HASH算法处理salesman_id,然后找到对于的分区表进行insert。Hash Partitioning 是为跨越设备的分布式数据提供了一种理想的方法,HASH算法也很容易转化成RANGE分区方法,特别是当被分区的数据不是历史数据时。
CREATE TABLE sales_hash
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 4;
3:List Partitioning
List Partitioning能够让你明确的控制有多少行被分区,你能对要分区的COLUMN上明确的指定按照那些具体的值来分区,这种方式在Range和Hash方式是做不到的。这种方式的优点是,你能组织和分组那些没有顺序和没有关系的数据集。下面是通过销售地区做一个List分区表。
CREATE TABLE sales_list
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(PARTITION sales_west VALUES('California', 'Hawaii') COMPRESS,
PARTITION sales_east VALUES('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois'));
List Partitioning能够让你明确的控制有多少行被分区,你能对要分区的COLUMN上明确的指定按照那些具体的值来分区,这种方式在Range和Hash方式是做不到的。这种方式的优点是,你能组织和分组那些没有顺序和没有关系的数据集。下面是通过销售地区做一个List分区表。
CREATE TABLE sales_list
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(PARTITION sales_west VALUES('California', 'Hawaii') COMPRESS,
PARTITION sales_east VALUES('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois'));
4:Composite Partitioning
Composite Partitioning 是把Range ,Hash ,List 分区方式组合起来的分区方式。
比如Composite Range-Hash Partitioning和Composite Range-List Partitioning:
Composite Partitioning 是把Range ,Hash ,List 分区方式组合起来的分区方式。
比如Composite Range-Hash Partitioning和Composite Range-List Partitioning:
CREATE TABLE sales_range_hash(
s_productid NUMBER,
s_saledate DATE,
s_custid NUMBER,
s_totalprice NUMBER)
PARTITION BY RANGE (s_saledate)
SUBPARTITION BY HASH (s_productid) SUBPARTITIONS 8
(PARTITION sal99q1 VALUES LESS THAN (TO_DATE('01-APR-1999', 'DD-MON-YYYY')),
PARTITION sal99q2 VALUES LESS THAN (TO_DATE('01-JUL-1999', 'DD-MON-YYYY')),
PARTITION sal99q3 VALUES LESS THAN (TO_DATE('01-OCT-1999', 'DD-MON-YYYY')),
PARTITION sal99q4 VALUES LESS THAN (TO_DATE('01-JAN-2000', 'DD-MON-YYYY')));
s_productid NUMBER,
s_saledate DATE,
s_custid NUMBER,
s_totalprice NUMBER)
PARTITION BY RANGE (s_saledate)
SUBPARTITION BY HASH (s_productid) SUBPARTITIONS 8
(PARTITION sal99q1 VALUES LESS THAN (TO_DATE('01-APR-1999', 'DD-MON-YYYY')),
PARTITION sal99q2 VALUES LESS THAN (TO_DATE('01-JUL-1999', 'DD-MON-YYYY')),
PARTITION sal99q3 VALUES LESS THAN (TO_DATE('01-OCT-1999', 'DD-MON-YYYY')),
PARTITION sal99q4 VALUES LESS THAN (TO_DATE('01-JAN-2000', 'DD-MON-YYYY')));
另外你还可以用subpartition template的方式指定:
CREATE TABLE sales_range_hash(
s_productid NUMBER,
s_saledate DATE,
s_custid NUMBER,
s_totalprice NUMBER)
PARTITION BY RANGE (s_saledate)
SUBPARTITION BY HASH (s_productid)
SUBPARTITION TEMPLATE(
SUBPARTITION sp1 TABLESPACE tbs1,
SUBPARTITION sp2 TABLESPACE tbs2,
SUBPARTITION sp3 TABLESPACE tbs3,
SUBPARTITION sp4 TABLESPACE tbs4,
SUBPARTITION sp5 TABLESPACE tbs5,
SUBPARTITION sp6 TABLESPACE tbs6,
SUBPARTITION sp7 TABLESPACE tbs7,
SUBPARTITION sp8 TABLESPACE tbs8)
(PARTITION sal99q1 VALUES LESS THAN (TO_DATE('01-APR-1999', 'DD-MON-YYYY')),
PARTITION sal99q2 VALUES LESS THAN (TO_DATE('01-JUL-1999', 'DD-MON-YYYY')),
PARTITION sal99q3 VALUES LESS THAN (TO_DATE('01-OCT-1999', 'DD-MON-YYYY')),
PARTITION sal99q4 VALUES LESS THAN (TO_DATE('01-JAN-2000', 'DD-MON-YYYY')));
这样,没有子分区通过的HASH分区将会统一到不同的表空间。
CREATE TABLE sales_range_hash(
s_productid NUMBER,
s_saledate DATE,
s_custid NUMBER,
s_totalprice NUMBER)
PARTITION BY RANGE (s_saledate)
SUBPARTITION BY HASH (s_productid)
SUBPARTITION TEMPLATE(
SUBPARTITION sp1 TABLESPACE tbs1,
SUBPARTITION sp2 TABLESPACE tbs2,
SUBPARTITION sp3 TABLESPACE tbs3,
SUBPARTITION sp4 TABLESPACE tbs4,
SUBPARTITION sp5 TABLESPACE tbs5,
SUBPARTITION sp6 TABLESPACE tbs6,
SUBPARTITION sp7 TABLESPACE tbs7,
SUBPARTITION sp8 TABLESPACE tbs8)
(PARTITION sal99q1 VALUES LESS THAN (TO_DATE('01-APR-1999', 'DD-MON-YYYY')),
PARTITION sal99q2 VALUES LESS THAN (TO_DATE('01-JUL-1999', 'DD-MON-YYYY')),
PARTITION sal99q3 VALUES LESS THAN (TO_DATE('01-OCT-1999', 'DD-MON-YYYY')),
PARTITION sal99q4 VALUES LESS THAN (TO_DATE('01-JAN-2000', 'DD-MON-YYYY')));
这样,没有子分区通过的HASH分区将会统一到不同的表空间。
二:使用各种分区方法的场景
1:什么时候用Range Partition
Range Partition是一种方便的方法分区历史的数据,经常在DATE COLMUN通过时间间隔组织数据。比如说:你要查询2009年8月的数据,查询将直接找到2009年8月的分区,避免了大量不必要的数据扫描。
在处理周期性的load新数据和purge老数据的时候,Range Partition也是一个理想的选择。
应用场景:
a)有一个大表需要通过时间字段频繁的访问,通过这个时间字段做RANG PARTITION 有利于做分区裁剪。
b)如果你不能对一个大表在指定的时间内做备份或RESTORE,你可以通过RANGE把他们分成小的logic片来做。
1:什么时候用Range Partition
Range Partition是一种方便的方法分区历史的数据,经常在DATE COLMUN通过时间间隔组织数据。比如说:你要查询2009年8月的数据,查询将直接找到2009年8月的分区,避免了大量不必要的数据扫描。
在处理周期性的load新数据和purge老数据的时候,Range Partition也是一个理想的选择。
应用场景:
a)有一个大表需要通过时间字段频繁的访问,通过这个时间字段做RANG PARTITION 有利于做分区裁剪。
b)如果你不能对一个大表在指定的时间内做备份或RESTORE,你可以通过RANGE把他们分成小的logic片来做。
2:什么时候用HASH Partition
HASH Partition不是一个很好的管理历史的方法。
应用场景
a)增加大表的可用性。
b)避免各个分区之间查找数据,并且各个分区可以放在不同的设备上,达到最大的I0吞吐量。也可以用STORE IN 子句分配每个分区到不同的表空间。
HASH Partition不是一个很好的管理历史的方法。
应用场景
a)增加大表的可用性。
b)避免各个分区之间查找数据,并且各个分区可以放在不同的设备上,达到最大的I0吞吐量。也可以用STORE IN 子句分配每个分区到不同的表空间。
3:什么时候用LIST Partition
如果你想映射数据到离散的值的时候,LIST Partition是个比较好的选择。
如果你想映射数据到离散的值的时候,LIST Partition是个比较好的选择。
4:什么时候用Composite Range-Hash Partitioning
这是Range和Hash的组合使用,先对表用RANGE分,然后对每个RANGE再做HASH分区。
由于做了RANGE后的子分区是没有规律的,如果在数据仓库设计时候,通过查询需求觉得有必要再细分,可以考虑使用。ORACLE会把子分区又分成不同的SEGMENT。
这是Range和Hash的组合使用,先对表用RANGE分,然后对每个RANGE再做HASH分区。
由于做了RANGE后的子分区是没有规律的,如果在数据仓库设计时候,通过查询需求觉得有必要再细分,可以考虑使用。ORACLE会把子分区又分成不同的SEGMENT。
发表评论
-
数据库软删除IsDeleted
2015-07-08 14:33 1238http://www.infoq.com/cn/news/20 ... -
(转)Meta data 元数据
2013-01-30 15:27 853元数据最本质、最抽象的定义为:data about data ... -
如何查询Oracle表空间和数据文件信息(转)
2013-01-11 13:47 1223http://tech.sina.com.cn/s/2008- ... -
(转)如何开启/关闭归档
2012-07-16 11:37 901如果开启归档,请保证log_archive_start=tru ... -
(转)Oracle 数据库实例启动关闭过程
2012-06-07 00:27 1325/* Oracle数据库实例的启动,严格来说应该是实 ... -
(转)oracle数据库实例,数据库的理解
2012-06-07 00:26 1327数据库就是一个相片底 ... -
(转)oracle 权限
2012-06-05 23:00 1341权限管理:oracle 9里面默认的三个用户名和密码: ... -
最简单的表示oracle概念关系
2012-05-29 01:20 1188从逻辑上来讲:Datebase -> Tablespac ... -
(转)table space和data file的offline
2012-05-29 00:09 16871、对一个datafile执行offline或offline ... -
(转)Oracle分区表 (Partition Table) 的创建及管理
2012-05-28 23:43 2559Oracle分区表 (Partition Table) 的 ... -
(转)全面学习分区表及分区索引
2012-05-28 23:40 862http://space.itpub.net/7607759/ ... -
(转)Oracle Partitioned Table:exchange的利用
2012-05-28 23:37 1608周末作了一天的Partitioned Table旧有资料的归档 ... -
(转)Oracle的启动方式
2012-05-28 23:35 32Oracle的几种启动方式 1、startup nomoun ... -
(转)Oracle数据文件迁移
2012-05-28 23:28 2070windows xp oracle 9. 2.0.1.0 si ... -
oracle 密码过期
2012-04-18 14:13 1508【原因/触发因素】 确定是由于oracle11g中默认在de ... -
(转)Oracle Partition 分区详细总结
2012-04-13 01:45 1180此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分 ... -
(转)Oracle 表空间与数据文件
2012-04-13 01:36 1280一、概念 表空间:是一个或多个数据文件的逻辑集合 ... -
(转)oracle实例名,服务名等概念区别与联系
2012-03-22 17:20 1465数据库名、实例名、数据库域名、全局数据库名、服务名 ,这是几个 ... -
删除archive log
2011-10-24 01:44 3662两种方法:1、配置RMAN自动管理ARCHIVELOG。也可在 ... -
绝对清楚的区分数据库,实例,服务名,SID
2011-09-01 17:54 8050在实际的开发应用中,关于Oracle数据库,经常听见有人说建立 ...
相关推荐
Oracle查询中的`OVER (PARTITION BY ..)`...在实际工作中,结合`RANK()`、`DENSE_RANK()`、`MIN()`和`MAX()`等函数,我们可以更高效地解决各种数据分析问题。理解并熟练掌握这些函数是提高Oracle查询效率和精度的关键。
通过熟练掌握各种分析函数,你可以更高效地进行数据挖掘、趋势分析和报告生成。在实际工作中,结合PARTITION BY和OVER子句的使用,分析函数可以解决许多复杂的业务问题,提升数据处理能力。因此,对分析函数的深入...
本资料“oracle_partition_index.zip_partition”着重讨论了Oracle分区和索引的相关知识,下面将对这些主题进行详细解释。 一、Oracle分区 1. 分区概念:Oracle分区是将一个大表或索引分成多个较小、更易管理的...
Oracle提供了26个分析函数,涵盖了各种复杂计算需求,如`lead()`, `lag()`, `percent_rank()`, `cume_dist()`等。这些函数使得在SQL中执行诸如预测、趋势分析、累计分布等操作变得简单。 5. **窗口函数的应用**: ...
- 性能提升:分区表可以加快数据访问速度,特别是在执行分析型查询时。查询优化器可以针对查询条件排除不需要访问的分区,从而减少数据扫描量,提升性能。 以上介绍了Oracle数据库中分区表的基本概念、分区类型以及...
### ORACLE报表分析利剑——分析函数:深度解析与应用 #### 一、理解分析函数:数据统计的新维度 分析函数作为Oracle数据库中一项高级功能,专为解决复杂报表统计需求设计,其核心优势在于能够对数据进行精细的...
在实际应用中,Oracle分析函数可以帮助我们编写出更复杂的查询,比如计算移动平均、计算等级分、以及在时间序列数据上执行各种统计分析。理解和熟练掌握这些函数可以极大地提升SQL查询的灵活性和效率,对于数据分析...
### Oracle分析函数详解 #### 一、Oracle分析函数概述 Oracle分析函数是在处理大量数据时极为有用的一套工具,主要用于在线分析处理(OLAP)场景。这类函数可以在多个级别上进行数据聚合,并支持复杂的排序、分组...
"Oracle行转列"是数据库查询中常见的一种需求,尤其是在数据分析和报表展示时。这个主题涉及到Oracle数据库中的聚合函数、分析函数以及一些高级SQL技巧。 首先,"行转列"的基本思想是将数据库表中的一列数据转换为...
`OVER (PARTITION BY ...)` 和开窗函数在Oracle数据库中提供了极其强大的数据处理能力,特别是在需要进行复杂的数据分析或报表制作时。掌握这些技术对于提高数据库查询效率和数据处理能力至关重要。
Oracle分析函数是数据库管理系统Oracle中的一种高级查询工具,它们在SQL查询中用于处理集合数据,提供了对一组行进行计算的能力,而不仅仅局限于单行或单列。这些函数使得数据库管理员和开发人员能够进行复杂的统计...
资源文档“oracle分析函数66.doc”可能包含了各种使用示例和测试数据,帮助初学者逐步理解如何在实际问题中应用这些分析函数。通过学习和实践,你将能够充分利用Oracle分析函数来增强你的数据仓库查询能力,为你的BI...
Oracle 分析函数是一种高级SQL功能,它允许在单个查询中对数据集进行复杂的分析,无需额外的编程或多次数据库交互。分析函数处理的结果通常基于数据的分组、排序或特定窗口,为统计汇总和复杂的数据分析提供了便利。...
Oracle 分析函数是一种强大的SQL工具,它允许你在处理数据时执行复杂的分析操作,而不像聚合函数那样仅仅返回单行结果。分析函数在Oracle 8.1.6版本中被引入,自那时起,它们已经成为数据库查询和报表生成的重要组成...
ORACLE 常用分析函数说明 Oracle 分析函数从 8.1.6 版本开始提供,是一种计算基于组的聚合值的函数。它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 开窗函数是分析函数工作的...
### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且结果可以根据特定条件进行动态调整。这种灵活性使得Oracle分析函数在处理复杂的数据集时非常...
Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...
通过等级函数、窗口函数和报表函数,我们可以轻松地完成各种高级分析任务,如排名、累计计算、比例计算等。理解这些函数的基本原理及其应用场景对于提高数据处理效率至关重要。希望本文能够帮助您更好地掌握Oracle...
Oracle 9i 分析函数是数据库查询中一种强大的工具,它们允许在单个查询中对一组行进行聚合操作,同时保留原始行的细节。在Oracle数据库系统中,分析函数为数据分析师和数据库管理员提供了深入洞察数据的能力,尤其在...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...