暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle分区裁剪

Oracle蓝莲花 2021-04-15
1626


引言

greenplum搞了四周,其实我的内心是崩溃的,对sharing nothing架构有了一些浅显的认识,对hadoop分布式列式存储的分区表懵逼的程度不亚于第一次分析trace文件,算了,书归正传。本次文档提供了关于Oracle分区裁剪个人见解。


 1 

分区裁剪

相信大多数人对分区裁剪并不陌生,但百度的个人博客却给了太多错误的答案,借助此篇文章希望给大家在日常管理和运维上提供好的帮助,分区修剪其实是数据仓库的一个基本性能特性。在分区修剪中,cbo分析SQL语句中的FROM和WHERE子句,以在构建分区访问列表时消除不需要的分区。该功能允许Oracle数据库仅对与SQL语句相关的分区执行操作


1.1

分区裁剪的好处

首先,分区修剪大大减少了从磁盘检索的数据量,缩短了处理时间,从而提高了查询性能并优化了资源利用率。如果将索引和表划分到不同的列上(假设使用全局分区索引),那么分区修剪也会消除索引分区,即使不能消除底层表的分区,但性能上也一样是有益处的。

根据实际的SQL语句,Oracle数据库可能使用静态或动态修剪。静态剪枝发生在编译时,其中包含事先访问的分区的信息。动态修剪发生在运行时,这意味着语句访问的确切分区事先并不知道。静态修剪的示例场景是一个SQL语句,其中包含分区键列上具有常量文WHERE条件。动态修剪的一个例子是在WHERE条件下使用运算符或函数。

注意:

1.我们描述的细节,静态修剪的示例场景是一个SQL语句,其中包含分区键列上具有常量文字的WHERE条件。动态修剪的一个例子是在WHERE条件下使用运算符或函数。

  2.分区修剪影响发生修剪的对象的统计信息,也影响语句的执行计划。

  3.当我们在范围或列表分区列上使用range(比如相等)和IN-list谓词时,当我们在散列分区列上使用等式和IN-list谓词时,Oracle数据库将删除分区

1.2

举例说明

注意:

1.Oracle使用分区列上的谓词执行分区修剪,在使用范围分区时,Oracle只访问分区sal99q2和sal99q3,表示2001年2-10月的分区。

2.当使用hash subpartitioning时,Oracle仅访问每个分区中存储S_PRODUCTID='&S_PRODUCTID'行的子分区。子分区和谓词之间的映射是基于Oracle的内部哈希分布函数计算的。

3.引用分区表可以利用通过与引用表的连接进行分区修剪的优势。基于虚拟列的分区表受益于对在SQL语句中使用虚拟列定义表达式的语句进行分区修剪。

1.3

怎么确定是不是用了分区裁剪

1.3.1 Oracle是否使用分区修剪反映在语句的执行计划中,无论是在EXPLAIN plan语句的计划表中还是在共享SQL区域中,还是游标缓存中。

1.3.2  分区修剪信息反映在执行计划列PSTART (PARTITION_START)PSTOP(PARTITION_STOP)中。对于串行语句,修剪信息也反映在操作和选项列中。

1.4

什么是静态分区裁剪

1.4.1 对于许多情况,Oracle确定在编译时要访问的分区。如果使用静态谓词,就会发生静态分区修剪,但下列情况除外:

1.有些情况排除使用分区静态裁剪,1.分区修剪使用子查询的结果。2.优化器使用星型转换重写查询,并在星型转换之后进行修剪。当然啦,最有效的执行计划是嵌套循环。

  2.如果在解析时Oracle可以识别访问了哪些连续的分区,那么执行计划中的PSTART和PSTOP列将显示正在访问的分区的开始和结束值。任何其他分区修剪的情况,包括动态修剪,都显示了PSTART和PSTOP中的键值,或者带有额外的属性。

说明:

1.这个计划显示Oracle访问分区17,如PSTART和PSTOP列所示。操作列显示分区范围为SINGLE,表示只访问单个分区。如果操作显示分区范围为ALL,那么所有分区都被访问,并且不进行分区修剪。然后PSTART显示表的第一个分区,PSTOP显示最后一个分区。

  2.一般来讲,在分区间表上进行全表扫描的执行计划显示PSTART为1,PSTOP为1048575,而不管创建了多少间隔分区。


1.5

动态分区裁剪

1.5.1 对分区列使用绑定变量的语句会导致动态修剪。

说明:

1.在access谓词部分可以看到绑定变量,这里就是动态分区裁剪。

  2.同时在执行计划中能看到pstart pstop中体现的分区扫描为KEY。

1.5.2 对于并行执行计划,只有分区开始和停止列包含分区修剪信息;操作列包含并行操作的信息,如下例所示。

说明:

看到了吧,只有分区开始和停止列包含分区修剪信息,对应的操作列包含并行操作的信息

1.5.3 显式地对分区列使用子查询的语句会导致动态修剪。例如:

1.5.4 使用星型转换由数据库转换的语句会导致动态修剪:

1.5.5 使用嵌套循环联接最有效地执行的语句使用动态剪枝。

2

分区裁剪的相关技巧:

2.1 在分区裁剪期间我们可以考虑这些问题,比如为了从分区修剪中获得最大的性能收益,至少我们应该避免需要数据库转换指定的数据类型的情况。数据类型转换通常会导致动态修剪,而静态修剪本来是可能的。从静态修剪中获益的SQL语句比从动态修剪中获益的语句执行得更好,这点要记住。

2.2 在使用Oracle数据类型时,会出现数据类型转换的常见情况。Oracle日期数据类型不是字符串,但仅在查询数据库时表示;表示的格式由实例或会话 的NLS设置定义。因此,当向日期字段插入数据或在这样的字段上指定谓词时,必须进行相同的反向转换,这点也要记住。

2.3 通过指定TO_DATE转换,可以隐式或显式地进行转换。只有适当应用的TO_DATE函数才能保证数据库能够唯一地确定日期值,并可能将其用于静态修剪,这对于单分区访问特别有用,这个更要记住。  

2.4 考虑下面的例子,我们就直接用Oracle数据库中的示例SH模式来跑sql。你想知道2000年的总收入是多少。有多种方法可以检索查询的答案,但并不是所有方法都同样有效。不信 ?好,来看。


注意:

在这种情况下,PSTART和PSTOP的关键字键意味着动态分区修剪在运行时发生。在考虑以下情况。

注意:

执行计划显示静态分区修剪。查询访问13到16个分区的连续列表。在这种情况下,指定日期格式的方式与NLS日期格式设置相匹配。虽然这个示例展示了

最高效的执行计划,但是往往我们不能依赖NLS日期格式设置来定义特定的格式,再看下面的例子:

注意:

时间列从执行计划中踢掉了

2.5 这个计划使用动态剪枝,同样不如静态剪枝执行计划有效。为了保证静态分区修剪计划,应该显式地转换数据类型以匹配分区列数据类型。例如:

2.6 在一些情况下,优化器无法执行修剪。一个常见的原因是在分区列的顶部使用操作符。这可以是显式操作符(例如,函数),甚至是Oracle引入的隐式操作符,作为执行语句所需的数据类型转换的一部分。例如,考虑以下查询

注意:

由于time_id的类型为DATE, Oracle必须将其转换为TIMESTAMP类型以获得相同的数据类型。

2.7 SELECT语句访问所有分区,即使可能已经将分区修剪为单个分区。考虑下面的示例来查找2000年的总销售收入。构造查询的另一种方法

注意:

1.此查询对分区键列应用函数调用,该列通常禁用分区修剪。执行计划显示一个完整的表扫描没有分区修剪,很恶心吧。

2.避免在分区列上使用隐式或显式函数。如果的查询通常使用函数调用,那么考虑使用虚拟列和虚拟列分区,以便在这些情况下从分区修剪中获益,

     这是我屡试不爽的办法,如果需求相同,真的,大家不妨试试。

2.8下面的示例演示了EXPLAIN PLAN语句在包含集合表时的样子,在本讨论中,集合表是有序的集合表或嵌套表。它基于“XMLType和对象中的集合分区”中的CREATE TABLE语句。注意,之所以不执行完整的表访问,是因为它被限制为只访问有问题的分区

3.分区连接减少了并行执行连接时并行执行服务器之间交换的数据量,从而减少了查询响应时间。这大大减少了响应时间,提高了CPU和内存资源的使用。在rac环境中,分区连接还可以避免或至少限制互连上的数据流量,这是实现大规模连接操作的良好可伸缩性的关键。

例如,考虑在cust_id列上的sales表customer表之间的大型连接。查询“查找在1999年第3季度购买100篇以上文章的所有客户的记录”是执行这种连接的SQL语句的典型示例

注意:

1. 如此大的连接在数据仓库环境中是典型的。在本例中,整个customer表与四分之一的销售数据连接。在大型数据仓库应用程序中,这可能意味着要连接数百万行。在这种情况下使用的连接方法显然是散列连接。如果两个表都在cust_id列上等分,那么可以进一步减少这个散列连接的处理时间。此功能支持完全分区连接。

  2. 当在并行中执行完全分区连接时,并行性的颗粒就是一个分区。因此,并行度仅限于分区的数量。例如,我们需要至少16个分区来将查询的并行度设置为1618个分区并行度就18,当然,一定考虑当前系统负载以及cpu的情况。


总结

对于分区裁剪的使用,注意事项,性能考虑基本就聊到这里,希望大家能有所帮助,未来分区表相关文章我陆续可能还会写,最近忙nosql和分布式数据库有点焦头烂额,谨以此篇文章犒劳一下忙碌的自己。

点亮梦想.拒绝平庸

                QQ群:85160421

600团队

没时间解释了,快长按左边二维码加入我们~~


文章转载自Oracle蓝莲花,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论