通过分区键值发现性能问题

简介: 在很多应用中如果数据量少有规模,都会有大量的分区表存在,使用比较多的是range partition. 一般的range partition都一时间为键值,或者根据业务绑定的关键id值。
在很多应用中如果数据量少有规模,都会有大量的分区表存在,使用比较多的是range partition.
一般的range partition都一时间为键值,或者根据业务绑定的关键id值。
虽然已经做了一些大数据量的数据迁移,但是不管是按照分区抽取,还是根据数据条数抽取,发现有一个表比较奇怪,一个100G左右的分区表,80%以上的数据都分布在一个分区里面,而这个大分区表却有180多个分区表。
如下所示,对于表charge,如果分区的大小在200M以内,就标记为1,如果大于200M,则按照200M为单位进行统计,可以看到,如下的分区   P120_C10占用了大量的空间,其他的分区却小的可怜。很明显从业务规划的角度存在一定的问题。
CHARGE                               P120_C100                             1                    
CHARGE                               P120_C10                            438                    
CHARGE                               P120_C20                              1                    
CHARGE                               P120_C30                              1                    
CHARGE                               P120_C40                              1                    
CHARGE                               P120_C50                              1                    
CHARGE                               P120_C60                              1                    
CHARGE                               P120_C70                              1                    
CHARGE                               P120_C80                              1                    
CHARGE                               P120_C90                              1                    
CHARGE                               P25_C100                              1                    
CHARGE                               P25_C10                               2                    
CHARGE                               P25_C20                               1                    
CHARGE                               P25_C30                               1                    
CHARGE                               P25_C40                               1                    
CHARGE                               P25_C50                               1                    
CHARGE                               P25_C60                               1                    
CHARGE                               P25_C70                               1                    
CHARGE                               P25_C80                               1                    
CHARGE                               P25_C90                               1                    
CHARGE                               P26_C100                              1                    
CHARGE                               P26_C10                               1                    
CHARGE                               P26_C20                               1                    
CHARGE                               P26_C30                               1                    
CHARGE                               P26_C40                               1                    
CHARGE                               P26_C50                               1                    
CHARGE                               P26_C60                               1                    
CHARGE                               P26_C70                               1                    
CHARGE                               P26_C80                               1                    
CHARGE                               P26_C90                               1                    
CHARGE                               P27_C100                              1                    
CHARGE                               P27_C10                               1                    
CHARGE                               P27_C20                               1                    
CHARGE                               P27_C30                               1                    
CHARGE                               P27_C40                               1                    
CHARGE                               P27_C50                               1   


带着这个疑问,和对应的开发人员进行了沟通,因为这个表已经使用很长时间了,他们想让我们提供一些关键的信息,比如分区的逻辑等,简单抽取了一些信息如下,
对于最大的分区P120_C10来说,High_value是120,10 直接看也看不出来什么问题。

PARTITION_NAME            HIGH_VALUE      TS_NAME     INI_TRANS LOGGING COMPRESS GLO LAST_ANAL
------------------------- --------------- ---------- ---------- ------- -------- --- ---------
.......
P41_C90                   41, 90          DATAH01             8 NO      DISABLED YES 15-AUG-14
P41_C100                  41, 100         DATAH01             8 NO      DISABLED YES 15-AUG-14
P120_C10                   120, 10         DATAH01             8 NO      DISABLED YES 15-AUG-14
P120_C20                  120, 20         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C30                  120, 30         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C40                  120, 40         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C50                  120, 50         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C60                  120, 60         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C70                  120, 70         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C80                  120, 80         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C90                  120, 90         DATAH01             8 NO      DISABLED YES 12-AUG-14
P120_C100                 120, 100        DATAH01             8 NO      DISABLED YES 12-AUG-14

根据最初的需求,是希望对于键值#1P120_C10 这个分区里面。
根据他们的期望,我对分区的数据进行了简单的分析,发现对于分区的键值在满足第一个分区的条件下,对于第二个键值的条件就直接忽略了。
select period_key,CUSTOMER_KEY from charge partition(P120_C10) group by  period_key,CUSTOMER_KEY order by period_key,customer_key
SQL> /
        42            0
        42            1
        42            2
 ....
        42           14
        42           15
        42           16
        42           17
...
        42           99
        43            0
 ...
        44           99
        45            0
        45            1
        45            2
        45            3
        45            4
...
        45           98
        45           99
        46            0
        46            1
        46            2
        46            3
        46            4
        46            5
        46            6
        46            7
        46            8
        46            9
        46           10
        46           11
        46           12
...
        57           88
        57           89
        57           90
        57           91
        57           92
        57           93
        57           94
        57           95
        57           96
        57           97
        57           98
        57           99


如果这样看,似乎有些不太合理了,是什么原因导致这些数据进入p120_c10了呢。
来做个简单的测试模拟一下,发现对于这个多键值的分区表,分区的情况和单键值还是有很大的差别,比较容易混淆和误导。当第一个键值的条件满足时,就忽略了第二个键值的条件,(比如(55,70),55已经小于第一个键值了,就直接插入p120_c10了,忽略了后面的一个条件)
如果键值等于120的时候,就开始校验第二个条件了(比如(120,5), (120,15)都校验了后面的键值,数据分别进入了p120_c10,p120_c20这两个分区)
如果键值大于120的时候,如果没有默认的分区,就直接报错了,因为oracle根据这种匹配还找不到对应的分区。

create table test (period_key number,customer_key number)

partition by range(period_key,customer_key)

(

partition p120_c10 values less than (120,10),

partition p120_c20 values less than (120,20),

partition p120_c30 values less than (120,30)

);

  

SQL> insert into test values(57,99);

1 row created.

SQL> insert into test values(57,150);

1 row created.

SQL> insert into test values(120,5);

1 row created.

SQL> insert into test values(119,50);

1 row created.

SQL> insert into test values(120,5);

1 row created.

SQL> insert into test values(120,15);

1 row created.

SQL> insert into test values(120,25);

1 row created.

SQL> insert into test values(120,30);

insert into test values(120,30)

            *

ERROR at line 1:

ORA-14400: inserted partition key does not map to any partition

SQL> insert into test values(121,1);

insert into test values(121,1)

            *

ERROR at line 1:

ORA-14400: inserted partition key does not map to any partition

 

SQL> select *from test partition(p120_c10);

PERIOD_KEY CUSTOMER_KEY

---------- ------------

        57           99

        57          150

       120            5

       119           50

       120            5

 

SQL> select *from test partition(p120_c20);

PERIOD_KEY CUSTOMER_KEY

---------- ------------

       120           15

 

SQL> select *from test partition(p120_c30);

PERIOD_KEY CUSTOMER_KEY

---------- ------------

       120           25

 

对于这个问题,只能根据业务的角度进行重新规划来把数据进一步balance了。
目录
相关文章
|
机器学习/深度学习 算法 数据可视化
深度学习在图像识别中的应用与挑战
【7月更文挑战第43天】 随着人工智能技术的迅猛发展,深度学习已成为推动计算机视觉领域进步的核心动力。本文旨在探讨深度学习技术在图像识别任务中的实际应用情况,分析其面临的主要挑战,并提出可能的解决方案。通过回顾当前最前沿的研究成果和案例分析,文章揭示了深度学习算法在处理复杂图像数据时的强大能力以及存在的局限性。
|
弹性计算 监控 开发工具
【阿里云弹性计算】实战教程:如何高效利用阿里云ECS弹性伸缩应对业务高峰
【5月更文挑战第20天】本文介绍了如何使用阿里云ECS弹性伸缩服务应对业务高峰。通过自动调整云资源规模,弹性伸缩在流量增加时扩展实例,流量减少时收缩实例,实现成本与性能的优化。步骤包括开通服务、创建伸缩组、设定规则和监控指标。文中还提供了一个Python脚本示例,并强调了优化策略,如应用无状态设计、考虑冷却时间和结合云监控。通过实践和调整,企业可以有效应对业务波动。
412 5
|
SQL 缓存 安全
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
13180 2
|
安全 物联网 区块链
未来触手可及:探索区块链、物联网与虚拟现实的融合趋势
随着技术不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正逐步改变我们的工作和生活方式。本文将探讨这些技术的发展趋势和潜在应用场景,揭示它们如何相互融合,共同塑造未来的数字化世界。
73 4
|
人工智能 自然语言处理 Java
「松弛感工作」之必备AI技能
【8月更文挑战第6天】「松弛感工作」之必备AI技能
|
XML Oracle Java
Java18新特性有哪些
Java18新特性有哪些
|
JavaScript Java Android开发
autojs颜色渐变效果
牙叔教程 简单易学 使用场景 颜色渐变
257 0
|
Web App开发 自然语言处理 数据格式
浏览器插件-离线英汉词典 0.0.7
实现浏览器插件, 基于本地词典数据, 提供网页上英语词语查询汉语释义功能, 添加词形变化等功能. Add features to English to Chinese dictionary using local data in browser extension.
1033 0