CN116578558A - 一种数据处理方法、装置、设备及存储介质 - Google Patents
一种数据处理方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN116578558A CN116578558A CN202310242252.4A CN202310242252A CN116578558A CN 116578558 A CN116578558 A CN 116578558A CN 202310242252 A CN202310242252 A CN 202310242252A CN 116578558 A CN116578558 A CN 116578558A
- Authority
- CN
- China
- Prior art keywords
- index
- data
- target
- column
- bucket
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000003860 storage Methods 0.000 title claims abstract description 39
- 238000003672 processing method Methods 0.000 title abstract description 9
- 239000012634 fragment Substances 0.000 claims abstract description 84
- 238000000034 method Methods 0.000 claims abstract description 38
- 230000015654 memory Effects 0.000 claims description 40
- 238000012545 processing Methods 0.000 claims description 40
- 230000011218 segmentation Effects 0.000 claims description 18
- 238000012216 screening Methods 0.000 claims description 7
- 238000012163 sequencing technique Methods 0.000 claims description 2
- 238000010586 diagram Methods 0.000 description 21
- 238000009826 distribution Methods 0.000 description 18
- 230000006870 function Effects 0.000 description 12
- 238000004364 calculation method Methods 0.000 description 11
- 238000005516 engineering process Methods 0.000 description 9
- 238000004422 calculation algorithm Methods 0.000 description 6
- 230000000694 effects Effects 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 238000013467 fragmentation Methods 0.000 description 4
- 238000006062 fragmentation reaction Methods 0.000 description 4
- 230000009286 beneficial effect Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 3
- 238000010276 construction Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000018109 developmental process Effects 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000008520 organization Effects 0.000 description 2
- 238000005192 partition Methods 0.000 description 2
- 230000000750 progressive effect Effects 0.000 description 2
- 238000013515 script Methods 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 1
- 150000001875 compounds Chemical class 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000005294 ferromagnetic effect Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000005291 magnetic effect Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2255—Hash tables
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/26—Visual data mining; Browsing structured data
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供一种数据处理方法、装置、设备及存储介质,方法包括:获取针对数据库中数据表预设的打散参数、所述数据表的目标索引以及所述目标索引对应的索引类型,其中,所述打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数;基于所述桶数据行数和所述数据表的数据,生成与所述目标索引对应的列直方图,其中,所述列直方图包括多个目标桶;基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,并将所述数据表的数据按照所述存储分片进行打散。
Description
技术领域
本申请实施例涉及金融科技(Fintech)的数据处理技术领域,涉及但不限于一种数据处理方法、装置、设备及存储介质。
背景技术
随着计算机计算的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,然而,由于金融行业的安全性、实时性要求,金融科技也对技术提出了更高的要求。金融科技领域下,随着业务的扩张以及多方向发展,由此产生的业务数据量越来越大。应此而生的分布式数据库、大数据处理技术,都需要将海量的关系模型数据、结构化数据和非结构化数据以某种的方式(维度)将数据进行拆分,以满足数据落地到单个物理机器上(有限的数据存储、计算处理能力)。
一般情况下,一张表初始只有一个分片,需要对分布式数据库中的数据表进行切分以及对数据打散。其中,对数据表进行分片的方案是采集分片使用情况信息,根据一定策略自动对分片进行拆分。比如当分片达到一定大小后,对数据进行自动切分,产生更多分片后,通过调度将分片均匀到各个分布式节点上,利用分布式多节点处理提高并发能力,避免产生短板效应。
相关技术中一定的策略一般为基于索引对数据进行切分的方案,要么是按照主键(primary key)索引对数据表中的数据进行打散,要么是按照二级索引的范围或指定点切分对数据表中的数据进行切分。然而,该方式至少存在通用性较差的问题。
发明内容
本申请实施例提供一种数据处理方法、设备及存储介质,以解决相关技术中进行数据处理时,至少存在通用性较差的问题。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种方法,包括:
获取针对数据库中数据表预设的打散参数、所述数据表的目标索引以及所述目标索引对应的索引类型,其中,所述打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数;
基于所述桶数据行数和所述数据表的数据,生成与所述目标索引对应的列直方图,其中,所述列直方图包括多个目标桶;
基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,并将所述数据表的数据按照所述存储分片进行打散。
本申请实施例提供一种数据处理装置,包括:
获取模块,用于获取针对数据库中数据表预设的打散参数、所述数据表的目标索引以及所述目标索引对应的索引类型,其中,所述打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数;
生成模块,用于基于所述桶数据行数和所述数据表的数据,生成与所述目标索引对应的列直方图,其中,所述列直方图包括多个目标桶;
处理模块,用于基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,并将所述数据表的数据按照所述存储分片进行打散。
本申请实施例提供一种设备,包括:
存储器,用于存储可执行指令;
处理器,用于执行存储器中存储的可执行指令时,实现上述的方法。
本申请实施例提供一种存储介质,存储有可执行指令,用于引起处理器执行时,实现上述的方法。
本申请实施例具有以下有益效果:
本申请在获取针对数据库中数据表预设的打散参数、数据表的目标索引以及目标索引对应的索引类型,其中,打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数;基于桶数据行数和数据表的数据,生成与目标索引对应的列直方图,其中,列直方图包括多个目标桶;基于索引类型、分片数据行数和列直方图,对数据表的数据进行存储分片,并将数据表的数据按照存储分片进行打散。如此,可以按照一定分页大小(列直方图中每一目标桶对应的桶分界范围)处理一个大数据量结果集,无需逐行逻辑处理,就可知晓其数据分布情况;相较传统处理方式,处理效率高,对数据库代价低,无需多次反复查询数据库,查询一次即可。
附图说明
图1是本申请实施例提供的近年来数据增长率和数据量的示意图;
图2是相关技术中采用一致性Hash对数据进行分片设置的示意图;
图3是本申请实施例提供的终端的一个可选的架构示意图;
图4是本申请实施例提供的数据处理方法的一个可选的流程示意图;
图5是本申请实施例提供的打散参数表包括的字段的示意图;
图6是本申请实施例提供的列直方图信息表包括的字段,以及目标索引为唯一索引的列直方图的示意图;
图7是本申请实施例提供的数据处理方法的一个可选的流程示意图;
图8是本申请实施例提供的数据处理方法的一个可选的流程示意图;
图9是本申请实施例提供的数据处理方法的一个可选的流程示意图;
图10A是本申请实施例提供的目标索引为普通索引,且索引列acct_no的数据类型为字符串类型的列直方图的示意图;
图10B是本申请实施例提供的目标索引为普通索引,且索引列mnt_sys_time的数据类型为时间类型的列直方图的示意图;
图10C是本申请实施例提供的索引列acct_no和mnt_sys_time拼接得到的拼接索引列对应的组合列直方图的示意图;
图11A是本申请实施例提供的针对索引列acct_no,对具有相同第一桶边界范围所需的存储分片个数的示意图;
图11B是本申请实施例提供的针对索引列mnt_sys_time,对具有相同第一桶边界范围所需的存储分片个数的示意图;
图12是本申请实施例提供的数据处理方法的一个可选的流程示意图;
图13是本申请实施例提供的数据处理方法的一个可选的流程示意图;
图14是本申请实施例提供的第二合并后的目标桶对应的桶边界范围以及包括的数据行数的示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。除非另有定义,本申请实施例所使用的所有的技术和科学术语与属于本申请实施例的技术领域的技术人员通常理解的含义相同。本申请实施例所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
为了更好地理解本申请实施例中提供的数据处理方法,首先对相关技术中的数据处理方法进行说明:
金融科技领域下,参照图1所示,根据国际知名数据咨询公司(InternationalData Corporation,IDC)的《Global DataSphere Forecast,2021-2025》调查报告预测2025年全球产生的数据量大约是2020年的2.8倍,全球数据急速增长。截止2020年底,全球产生的数据总量为64.2泽字节(Zettabyte,ZB),预计2025年数据总量达到181ZB,2021-2025年全球产生的数据量将以23%的复合增长率持续增长。
随着全球数据的快速增长,基础架构领域存储、网络、数据库技术应势发展,在数据库领域中,分布式数据库发展最为迅猛。企业决策者在选型数据库产品时,弹性伸缩、高可用、扩展性等关键分布式能力成为主要技术因素之一。实现弹性伸缩、高可用及其扩展性能力最终方式是数据分片。数据被分片后,横向增加数据分片数量即可提升扩展能力;单个数据分片的多个副本之间通过分布式一致性协议比如Raft协议保证跨主机、机架、IDC级别高可用能力;动态增减数据分片即可实现弹性伸缩能力。
在分布式数据库中,数据分片包括如下几种方式:第一种哈希(Hash)取模,每一条数据设置一个键(key),利用Hash算法为每一个key分配一个Hash值,将相同Hash值的数据存储在同一数据分片中;具体地,使用mod取余分片个数。该方案的优势在于业务上连续的数据经过Hash计算后存储在不相邻的数据分片上,避免了热点问题,劣势在于无法使用范围查询,或者范围查询代价高;同时由于mod分片个数算法,当集群有缩容或扩容需求时,Hash值会被重新计算,数据需要做大量搬迁动作进行再平衡。
第二种一致性Hash,为了解决Hash算法数据再平衡带来的影响,具体地,为每一条数据设置一个key,将key及节点或分片Hash到一个环上,按照顺时针将key放置在离key最近的节点或分片上。示例性地,参照图2所示,ID为2861的key放置在Node2上,ID为9246的key放置在Node3上,以此类推。其相较Hash算法,该方案的优势在于节点变化时,需要再平衡数据量只有key/n(节点个数),比如Node2故障下线,那么只需将ID为2861的Key迁移到Node3上即可。
第三种范围(Range),数据按照某种数据规则比如主键进行排序,切分成若干有序集合,每个集合是一个连续的数据范围。该方案的优势在于范围查询性能表现更佳,劣势在于如果区间范围边界划分不合理,某些数据范围过大或查询频次高易产生热点问题。
需要说明的是,Hash算法和一致性Hash算法解决了热点问题,但不利于范围查询,通常适用于单key查询和修改场景,代表的产品有非关系数据库Redis、Cassandra等。一般分布式关系型数据库为了支持适用性更强的范围查询,通常会选择Range方式进行数据分片。故而在分布式关系数据库中,热点问题会更加突出,具体地,当出现热点问题后,分布式数据库集群性能会受限于集群中某个节点的处理能力上限,无法发挥分布式架构多节点计算和存储优势,从而产生短板效应。
一般情况下,一张表初始只有一个分片,需要对分布式数据库中的数据表进行切分以及对数据打散。其中,对数据表进行分片的方案是采集分片使用情况信息,根据一定策略自动对分片进行拆分。比如当分片达到一定大小后,对数据进行自动切分,产生更多分片后,通过调度将分片均匀到各个分布式节点上,利用分布式多节点处理提高并发能力,避免产生短板效应。
相关技术中对数据进行打散的方案,要么是针对按照主键(int primary key)建立的数据表或数据库默认数据组织方式的表,按照主键索引对数据表中的数据进行打散;要么是按照二级索引的范围打散或指定点切分对数据表中的数据进行打散,示例性地,某数据库使用split table t index idx1 between(‘A’)and(‘Z’)语法支持被索引列按照字母A到字母Z均匀切分一定分片个数,或者使用split table t index idx1 by(‘A’),(‘B’),……(‘Z’)语法指定点切分。然而,上述打散方式落地不易,且受索引数据存储格式的限制,实际打散需要根据实际业务数据范围进行切分,故用户需要感知并预测索引数据范围,根据数据范围进行打散,对于用户有一定成本,且用户需要感知并预测索引数据范围,根据数据范围进行打散,对于用户有一定成本,且仅支持有限分片切分,无法支持大批量数据打散,导致上述方式至少存在通用性较差的问题。
下面说明本申请实施例提供的数据处理设备的示例性应用,本申请实施例提供的数据处理设备可以实施为笔记本电脑,平板电脑,台式计算机,智能机器人等任意具有屏幕显示功能的终端,也可以实施为服务器。下面,将说明数据处理设备实施为终端时的示例性应用。
参见图3,图3是本申请实施例提供的终端100的结构示意图,图3所示的终端100包括:至少一个处理器110、至少一个网络接口120、用户接口130和存储器150。终端100中的各个组件通过总线系统140耦合在一起。可理解,总线系统140用于实现这些组件之间的连接通信。总线系统140除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图3中将各种总线都标为总线系统140。
处理器110可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口130包括使得能够呈现媒体内容的一个或多个输出装置131,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口130还包括一个或多个输入装置132,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器150可以是可移除的,不可移除的或其组合。示例性地硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器150可选地包括在物理位置上远离处理器110的一个或多个存储设备。存储器150包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(Read Only Memory,ROM),易失性存储器可以是随机存取存储器(Random Access Memory,RAM)。本申请实施例描述的存储器150旨在包括任意适合类型的存储器。在一些实施例中,存储器150能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统151,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块152,用于经由一个或多个(有线或无线)网络接口120到达其他计算设备,示例性地网络接口120包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(Universal Serial Bus,USB)等;
输入处理模块153,用于对一个或多个来自一个或多个输入装置132之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本申请实施例提供的装置可以采用软件方式实现,图3示出了存储在存储器150中的一种数据处理装置154,该数据处理装置154可以是终端100中的数据处理装置,其可以是程序和插件等形式的软件,包括以下软件模块:获得模块1541、确定模块1542、处理模块1543,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
在另一些实施例中,本申请实施例提供的装置可以采用硬件方式实现,作为示例,本申请实施例提供的装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本申请实施例提供的数据处理方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(Application Specific Integrated Circuit,ASIC)、DSP、可编程逻辑器件(Programmable Logic Device,PLD)、复杂可编程逻辑器件(Complex ProgrammableLogic Device,CPLD)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或其他电子元件。
下面将结合本申请实施例提供的终端100的示例性应用和实施,说明本申请实施例提供的数据处理方法。参见图4,图4是本申请实施例提供的数据处理方法的一个可选的流程示意图,将结合图4示出的步骤进行说明,
步骤201,获取针对数据库中数据表预设的打散参数、数据表的目标索引以及目标索引对应的索引类型。
其中,打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数。
本申请实施例中,打散参数包括单个分片包含的分片数据行数和单个桶包含的桶数据行数,当然,打散参数还包括单个分片的数据大小。这里,打散参数存放在打散参数表split_param_define中,打散参数表中的字段包括参数标识param_id、参数名称param_name、参数描述信息param_comment、参数值param_value和参数影响范围param_influence_range。
其中,参数标识param_id为打散参数表中每一参数对应的唯一标识。
其中,参数名称param_name包括如下参数:1)单个分片包含的分片数据行数split_shard_keys,即每个分片包含数据行数,如100万行;2)单个分片的数据大小split_shard_size,即每个分片的数据大小,如100兆字节(Megabyte,MB);3)单个桶包含的桶数据行数bucket_size,即每个列直方图bucket包含的数据行数,如50万行,一般情况下,单个分片包含的分片数据行数为单个桶包含的桶数据行数的正整数倍。
其中,参数描述信息param_comment为对每一参数的简要描述。
其中,参数值param_value为为每一参数设置的数据值。
其中,参数影响范围param_influence_range指影响范围为所有表,即所有表按照上述定义上限进行切分。
参照图5所示,图5示出的打散参数表包括的字段,这里,为了示例说明,将单个分片包含的分片数据行数split_shard_keys设置为100行,单个分片的数据大小split_shard_size设置为0.1MB,单个桶包含的桶数据行数bucket_size设置为50行。
在分布式数据库中,主要存放两种类型结构:数据和索引。分布式数据库多使用聚簇表结构组织数据,可以按照具备业务属性的Primary Key;也可以按照数据库默认分配的行号(rowid)。rowid与业务属性无关,只要自身行号生成规则相对随机,打散即可按照一定固定范围切分数据。比如某数据库按照rowid组织的表在1至int64的范围进行均匀切分,即可打散数据。
本申请实施例中,索引是对数据表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,即索引是加速数据查询的一种数据结构。索引的数据结构为以键值(key-value)对形式,其中,key用于存放被索引列的值(过滤条件列的实际值),value用于存放数据行号(rowid)。索引按照key的大小进行排序并进行组织。
本申请实施例中,索引类型是根据数据库的功能,在数据库中预先设计的索引类型。其中,索引类型包括单列索引和组合索引,单列索引指的是一个索引只包含单个列,一个表可以有多个单列索引,组合索引指的是一个索引包含多个列,即在数据表的多个字段组合上创建的索引,需要说明的是,由于组合索引的有序性,索引分布首先与索引前导列有关,再紧接着和后续的索引列分布有关。示例性地,单列索引和组合索引的数据结构如表1所示,
表1
步骤202,基于桶数据行数和数据表的数据,生成与目标索引对应的列直方图。
其中,列直方图包括多个目标桶。
本申请实施例中,生成列直方图所使用的直方图参数存放在列直方图信息表user_tab_histograms中,列直方图信息表中的字段包括桶标识bucket_id、桶包含的最小索引值low_value、桶包含的最大索引值endpoint_value、桶包含的实际数据行数endpoint_number、表名table_name、索引名index_name、列名column_name和库名schema_name。示例性地,参照图6所示,图6示出的列直方图信息表包括的字段。
在实际使用时,由于直方图是一种对数据分布情况进行描述的工具,因此,为了便于进行统计,需要按照预先设置的排序规则对数据进行排序,例如,按照数据大小进行排序等等,大多数数据库都会选择用直方图来进行区间查询的估算,并且,根据分桶策略的不同,构建的直方图可以分为等深直方图和等宽直方图等等,具体的直方图的构建行使,可以根据实际使用情况进行设置,本发明实施例对此不进行限制。
本申请实施例中,终端获取针对数据库中数据表预设的单个分片包含的分片数据行数和单个桶包含的桶数据行数、数据表的目标索引以及目标索引对应的索引类型之后,根据分片数据行数和数据表的数据,生成与目标索引对应的列直方图。
步骤203,基于索引类型、分片数据行数和列直方图,对数据表的数据进行存储分片,并将数据表的数据按照存储分片进行打散。
本申请实施例中,终端基于桶数据行数和数据表的数据,生成与目标索引对应的列直方图之后,基于数据表的索引类型、单个分片的分片数据行数和生成的列直方图,对数据表的数据进行存储分片,并将数据表的数据按照存储分片进行打散。
这里,对步骤202基于桶数据行数和数据表的数据,生成与目标索引对应的列直方图的过程结合图7作出进一步说明,
步骤301,对数据表的数据进行排序,确定目标索引对应的每一索引值所在数据行的逻辑行号。
本申请实施例中,逻辑行号指的是按照数据表的数据的逻辑顺序所标记的行号。
本申请实施例中,数据表中的每一行数据都会存在目标索引对应的索引值,终端对数据表的数据进行排序,得到目标索引对应的每一索引值所在数据表的数据行的逻辑行号。
步骤302,基于逻辑行号和桶数据行数,对逻辑行号对应的数据进行桶划分,得到逻辑行号对应的数据所在的目标桶。
本申请实施例中,终端将逻辑行号和桶数据行数带入第一计算函数,以对逻辑行号对应的数据进行桶划分,得到逻辑行号对应的数据所在的目标桶,其中,第一计算函数为其中,n为目标桶的桶标识,/>函数为向下取整函数。
步骤303,基于目标桶中的目标索引对应的索引列的第一最大索引值和第一最小索引值,确定目标桶的第一桶边界范围。
本申请实施例中,目标索引对应的索引列的第一最大索引值与第一最小索引值可能相同,目标索引对应的索引列的第一最大索引值与第一最小索引值可能不同,以第一最小索引值为起始值,以第一最大索引值为终止值确定目标桶的第一桶边界范围。
步骤304,基于目标桶的第一桶边界范围和目标桶包含的数据的实际数据行数,生成列直方图。
本申请实施例中,基于目标桶中的目标索引对应的索引列的第一最大索引值和第一最小索引值,确定目标桶的第一桶边界范围之后,获取目标桶所在的数据库的库名、所在的数据表的表名、目标索引对应的索引列名;基于目标桶的桶标识、目标桶的第一桶边界范围、目标桶所在的数据库的库名、所在的数据表的表名、目标索引对应的索引列名,构建与目标索引对应的列直方图。
在一种可实现场景中,以索引类型为单列索引,且目标索引为主键索引为例,对构建与目标索引对应的列直方图进行说明,针对数据表sbtest1.deposit_ca_txn_other_table_1,存在txn_acct_no列主键索引。首先,使用主键索引或唯一索引的有序特征,按照主键索引从小到大排序,为主键索引对应的每一索引值所在的数据行赋予逻辑行号。其次,基于逻辑行号和桶数据行数,按照第一计算函数对数据表中的数据进行分组,示例性地,逻辑行号1-50分别带入第一计算函数中,得到计算结果为桶标识,即为0,终端将逻辑行号1-50的数据划分到桶标识为0的目标桶中,以此类推,将行号51-100划分到桶标识为1的目标桶中。最后,计算每个目标桶存放的目标索引对应的索引列的最小值和最大值,并统计这个目标桶存放的实际数据行数,即页面大小,生成与目标索引对应的列直方图。需要说明的是,实际数据行数小于或等于桶数据行数bucket_size大小。为方便演示,以桶数据行数bucket_size大小为50行为例,参照图6所示,图6示出的一种目标索引为唯一索引的列直方图的示意图。这里,以索引类型为单列索引,且目标索引为主键索引,生成与主键索引对应的列直方图的代码如下:
1)、获取桶数据行数bucket_size;
2)、计算目标桶的最小索引值low_value和最大索引值endpoint_value,即selectmin(t.txn_acct_no)as low_value,max(t.txn_acct_no)as endpoint_value,count(*)asendpoint_number from(select*,row_number()over(order by txn_acct_no)as row_num from sbtest1.deposit_ca_txn_other_table_1)t group by floor((t.row_num-1)/$bucket_size)order by low_value;
3)、生成与主键索引对应的直方图表,即
insert into user_tab_histograms
select null as bucket_id,low_value,endpoint_value,endpoint_number,'deposit_ca_txn_other_table_1'as table_name,'txn_acct_no'as column_name,'idx_txn_acct_no'as column_name,'sbtest1'as schema_name from
(select min(t.txn_acct_no)as low_value,max(t.txn_acct_no)as endpoint_value,count(*)as endpoint_number
from(select*,row_number()over(order by txn_acct_no)as row_num fromsbtest1.deposit_ca_txn_other_table_1)t
group by floor((t.row_num-1)/50)order by low_value,endpoint_value)t;
由上述可知,按照区间范围处理一个大数据量结果集,无需逐行逻辑处理,就可知晓其数据分布情况,且分片本质是一个有序范围,知晓其边界值即可明确分片范围;数据分布也按此范围方式统计,很容易明确每个分片边界值。
这里,若索引类型为单列索引且目标索引为唯一索引,对步骤203基于索引类型、分片数据行数和列直方图,对数据表的数据进行存储分片,并将数据表的数据按照存储分片进行打散的过程结合图8作出进一步说明,
步骤401,若索引类型为单列索引且目标索引为唯一索引,按照列直方图包括的目标桶的桶标识对多个目标桶进行排序。
本申请实施例中,每一个目标桶对应一个桶标识,且该桶标识唯一。
若目标索引为单列索引,且目标索引为唯一索引,唯一索引包括主键索引,查询列直方图的分布情况,并按照桶标识对列直方图中的多个目标桶进行升序或降序排列。
步骤402,基于第一目标桶的第二最小索引值、第二目标桶的第二最大索引值,确定第一分片边界范围。
本申请实施例中,第一目标桶指的是最小桶标识对应的目标桶,第二最小索引值指的是第一目标桶包括的所有索引值中的最小索引值;第二目标桶指的是最大桶标识对应的目标桶,第二最大索引值指的是第二目标桶包括的所有索引值中的最大索引值。
本申请实施例中,第一分片边界范围为以第二最小索引值为起始值,以第二最大索引值为终止值所确定的范围,第一分片边界范围内的数据为待分片的所有数据。
步骤403,确定分片数据行数与桶数据行数的比值,为单个分片与单个桶之间的倍数因子。
步骤404,针对排序后的多个目标桶,将相邻的倍数因子个目标桶的第一桶边界范围进行合并,并确定合并后的第一桶边界范围的第三最大索引值。
本申请实施例中,终端计算分片数据行数与桶数据行数的比值,并将该比值确定为单个分片与单个桶之间的倍数因子;进一步地,将排序后的多个目标桶中,相邻的倍数因子个目标桶的第一桶边界范围进行合并,得到合并后的第一桶边界范围,此时,这每一合并后的第一桶边界范围即为每一存储分片对应的分片边界范围。最后,确定每一存储分片的分片边界范围中的最大索引值为第三最大索引值,得到多个第三最大索引值。
步骤405,以第一目标桶的第二最小索引值、多个第三最大索引值为切分点,对第一分片边界范围内的数据进行存储分片,并将数据表的数据按照存储分片进行打散。
本申请实施例中,终端以第一目标桶的第二最小索引值、多个第三最大索引值为切分点,对第一分片边界范围内的数据进行存储分片,并将数据表的数据按照存储分片进行打散。
在一种可实现的应用场景中,参照图5和图6,首先查询列直方图user_tab_histograms的分布情况,并按照桶标识bucket_id对列直方图user_tab_histograms中的多个目标桶bucket从小到大排序。其次,以第一个目标桶bucket的最小索引值为起始值,最后一个目标桶bucket最大索引值为终止值确定范围,为所有存储分片的分片边界范围。然后,确定分片数据行数如100行与桶数据行数如50行的比值,为单个分片与单个桶之间的倍数因子即2,也就是说,按100行生成一个存储分片,则每两个目标桶bucket合并就构成一个存储分片,进一步地,确定每一个存储分片的分片边界范围内的最大索引值。最后,以第一个目标桶的最小索引值、每一个存储分片的分片边界范围内的最大索引值为切分点,生成打散语句,对所有存储分片的分片边界范围内的数据进行存储分片,实现将数据表的数据按照存储分片进行打散。这里,以第一个目标桶的最小索引值、每一个存储分片的分片边界范围内的最大索引值为切分点,生成打散语句的代码如下:
1)、获取目标桶bucket的个数;
2)、获取第一个目标桶bucket的最小索引值;
3)、生成打散指定点切分SQL语句,即
select concat('split table sbtest1.deposit_ca_txn_other_table_2index`PRIMARY`by(1),',group_concat(concat('(',max_endpoint_value,')')),';')from(select min(low_value)as min_low_value,max(endpoint_value)max_endpoint_valuefrom(select cast(low_value as signed)low_value,cast(endpoint_value as signed)endpoint_value,row_number()over(order by bucket_id)as row_num from user_tab_histograms where table_name='deposit_ca_txn_other_table_1')t group by floor((t.row_num-1)/2)order by min_low_value)t order by min_low_value
执行上述代码后,生成的打散语句的示例结果如下:
split table sbtest1.deposit_ca_txn_other_table_1index`PRIMARY`by(1),(100),(200),(300),(400),(500)。
由上述可知,对于唯一索引,由于其每个值都是唯一的,其列直方图中每一个目标桶bucket的最小索引值和最大索引值也是唯一的,不存在一个索引数据存在多行的情况。且设计时单个桶的桶数据行数bucket_size小于单个分片的分片数据行数split_shard_keys,故打散时可以使用split by指定点切分一个分片方式,无需判断被索引列数据类型,且切分相对更加精准。具体地,基于分片数据行数与桶数据行数之间的整数倍关系,将排序后的相邻的多个目标桶bucket的桶边界范围合并,得到每一存储分片的分片边界范围,并确定每一存储分片的分片边界范围的最大索引值。之后,以每一分片边界范围的最大索引值点为切分点,对数据表中的数据进行切分,同时在第一个目标桶bucket的桶边界范围的最小索引值点进行切分,如此,实现了对数据的打散。
这里,若索引类型为单列索引且目标索引为普通索引,对步骤203基于索引类型、分片数据行数和列直方图,对数据表的数据进行存储分片,并将数据表的数据按照存储分片进行打散的过程结合图9作出进一步说明,该过程可以通过步骤501至步骤503实现,或步骤501至步骤502、步骤504至步骤508实现,
步骤501,若索引类型为单列索引且目标索引为普通索引,以第一桶边界范围为维度,将列直方图中具有相同第一桶边界范围的目标桶进行合并,得到第一合并后的目标桶。
本申请实施例中,目标索引为普通索引可以理解为目标索引为非唯一索引,即索引列的数据类型为字符串数据类型和时间数据类型。这里,目标索引为普通索引时,创建普通索引对应的列直方图的方式与创建唯一索引对应的列直方图的方式相同,这里,示例性地,参照图10,图10A示出的是目标索引为普通索引,且索引列acct_no的数据类型为字符串类型的列直方图的示意图,图10B示出的是目标索引为普通索引,且索引列mnt_sys_time的数据类型为时间类型的列直方图的示意图。
本申请实施例中,终端确定索引类型为单列索引且目标索引为普通索引之后,以第一桶边界范围为维度,将列直方图中具有相同第一桶边界范围的目标桶进行合并,得到与第一桶边界范围个数相同的多个第一合并后的目标桶,其中,第一合并后的目标桶中包括的数据行数等于所有具有相同第一桶边界范围的目标桶的数据行数之和。这里,结合图10A进行示例性说明,比如表sbtest1.deposit_ca_txn_other_table_2,存在acct_no列非唯一索引,其值分布相对不均匀,部分数据重复行数据较多,如UR000000068888数据记录较多,部分数据较小,如UR000000058888数据记录较少;结合图10B,比如表sbtest1.deposit_ca_txn_other_table_2,存在mnt_sys_time列非唯一索引,其值分布相对不均匀。此时,将列直方图中具有相同第一桶边界范围的目标桶bucket合并为一类。
步骤502,获取第一合并后的目标桶的第二分片边界范围中的第四最大索引值与第四最小索引值是否相同的判断结果。
其中,第二分片边界范围为具有相同第一桶边界范围。
本申请实施例中,第二分片边界范围为以第一合并后的目标桶中的第一个目标桶的最小索引值为起始值,以第一合并后的目标桶中的最后一个目标桶的最大索引值为终止值所确定的范围;需要说明的是,第一个目标桶与最后一个目标桶可以相同,第一个目标桶与最后一个目标桶也可以不同,对此,本申请不做具体限制。第二分片边界范围内的数据为相同第一桶边界范围对应的待分片的数据。
本申请实施例中,判断结果包括:第一合并后的目标桶的第二分片边界范围中的第四最大索引值与第四最小索引值相同,第一合并后的目标桶的第二分片边界范围中的第四最大索引值与第四最小索引值不同。
本申请实施例中,终端将列直方图中具有相同第一桶边界范围的目标桶进行合并,得到第一合并后的目标桶之后,确定第一合并后的目标桶的第二分片边界范围中的第四最大索引值与第四最小索引值是否相同的判断结果,以便根据判断结果执行与判断结果对应的步骤。
这里,在获取第一合并后的目标桶的第二分片边界范围中的第四最大索引值与第四最小索引值是否相同的判断结果之前,还可以计算第一合并后的目标桶所需的存储分片的个数,这里,计算第一合并后的目标桶所需的存储分片的个数可以通过如下公式得到, 其中,s为第一合并后的目标桶包括的目标桶的个数,endpoint_numberi为第i个目标桶存储的实际数据行数,split_shard_keys为单个分片的分片数据行数,/>函数为向上取整函数,即分片个数不足1,则按1处理,若分片个数包含小数,则向上取整。
这里,结合图10A进行示例性说明,将列直方图中具有相同第一桶边界范围的目标桶进行合并,并确定每一第一合并后的目标桶所需的存储分片的个数对应的代码如下:Select low_value,endpoint_value,ceil(sum(endpoint_number)/100)shard_numberfrom user_tab_histograms where table_name='deposit_ca_txn_other_table_2'group by low_value,endpoint_value order by low_value,endpoint_value。执行上述代码后,示例结果参照图11A所示,图11A示出的是针对索引列acct_no,对具有相同第一桶边界范围所需的存储分片个数的示意图。
这里,结合图10B进行示例性说明,将列直方图中具有相同第一桶边界范围的目标桶进行合并,并确定每一第一合并后的目标桶所需的存储分片的个数的示例结果参照图11B所示,图11B示出的是针对索引列mnt_sys_time,对具有相同第一桶边界范围所需的存储分片个数的示意图。
步骤503,若判断结果表征第四最大索引值与第四最小索引值不相同,以第四最大索引值或第四最小索引值为切分点,对第二分片边界范围内的数据进行存储分片,并将数据表的数据按照存储分片进行打散。
本申请实施例中,终端可以按照最大索引值和最小索引值,对所有第一合并后的目标桶进行排序;然后,对每一第一合并后的目标桶的第四最大索引值与第四最小索引值是否相同进行判断,若判断结果表征第四最大索引值与第四最小索引值不相同,则终端确定第一合并后的目标桶所处边界位置,则只需要按照其上下界打散一个分片即可。这里,终端以第四最大索引值或第四最小索引值为切分点,对第二分片边界范围内的数据进行存储分片,并将数据表的数据按照存储分片进行打散。这里,结合图10A进行示例性说明,打散语句为split table table_name index index_name between(第四最大索引值)and(第四最小索引值)regions 2。执行上述代码后,示例结果如下:
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000588888')and('UR0000000688888')regions 2;
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000688888')and('UR0000000788888')regions 2;
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000788888')and('UR0000000888888')regions 2;
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000888888')and('UR0000000988888')regions 2。
步骤504,若判断结果表征第四最大索引值与第四最小索引值相同,确定第一合并后的目标桶包含的数据的总数据行数与分片数据行数的比值,为第二分片边界范围所需的第一分片数量。
本实施例中,总数据行数指的是第一合并后的目标桶包括的所有目标桶的实际数据行数之和。
本申请实施例中,终端可以按照最大索引值和最小索引值,对所有第一合并后的目标桶进行排序;然后,对每一第一合并后的目标桶的第四最大索引值与第四最小索引值是否相同进行判断,若判断结果表征第四最大索引值与第四最小索引值相同,则终端确定该索引值至少存在大于1个目标桶bucket中,则按需在同一个索引值打散多个分片。这里,终端需要计算第一合并后的目标桶包含的数据的总数据行数与单个分片的分片数据行数的比值,确定该比值为第二分片边界范围所需的第一分片数量。
步骤505,若第一分片数量大于分片数量阈值,获取目标索引对应的索引列的数据类型,并在第四最大索引值中增加与数据类型对应的数据位数,得到扩大后的第二分片边界范围。
其中,扩大后的第二分片边界范围中的第五最大索引值与第五最小索引值不相同。
本申请实施例中,目标索引对应的索引列的数据类型包括字符串数据类型、数字数据类型和时间数据类型。
本申请实施例中,在第四最大索引值中增加与数据类型对应的数据位数指的是在第四最大索引值的最后增加,与字符串类型对应的数据位数,或与时间类型对应的数据位数,或与数字类型对应的数据位数。这里,结合图10A进行示例性说明,实际存放索引结构如下:
Key:t{table_id}_i{index_id}_UR0000000068888_rowid
Value:null
针对第四最大索引值UR0000000068888,对第四最大索引值UR0000000068888中增加一位数据,得到扩大后的第二分片边界范围,且扩大后的第二分片边界范围中的第五最大索引值与第五最小索引值不相同。
这里,为支持更大数据量级,需要根据字符边界特点进行打散。ASCII码显示字符最小值为(空格)(sp),其十进制为32;最大值为~,其十进制为126,故扩大后的第二分片边界范围为[UR0000000068888,UR0000000068888~)。
步骤506,对第一分片数量与分片数量阈值的比值进行向上取整,得到第二分片边界范围的拆分次数。
本申请实施例中,分片数量阈值可以为预设的分片数量,如分片数量阈值可以为1000。
本申请实施例中,第一分片数量大于分片数量阈值,表征数据表中的数据量相对较大,需要根据目标索引对应的索引列的数据类型的边界特点进行打散。
本申请实施例中,若第一分片数量大于分片数量阈值,对第一分片数量与分片数量阈值的比值进行向上取整,得到第二分片边界范围的拆分次数。
步骤507,以拆分次数对扩大后的第二分片边界范围进行均等拆分,生成多组分片拆分边界范围。
步骤508,对每一分片拆分边界范围内的数据进行存储分片,并将数据表的数据按照存储分片进行打散。
在一种可实现的应用场景中,以数据类型为字符串数据类型为例进行说明,在判断结果表征第四最大索引值与第四最小索引值相同的情况下,为支持在同一个索引值打散,可以通过增加字符位数扩大分片边界范围。这里,结合图10A进行示例性说明,实际存放索引结构如下:
Key:t{table_id}_i{index_id}_UR0000000068888_rowid
Value:null
第一种情况,第一分片数量小于或等于分片数量阈值如1000,则可以增加数字位数,从而扩大分片边界范围,存在两个分片边界范围,第一个分片边界范围为:t[table_id]_i[index_id]_UR0000000688880,t[table_id]_i[index_id]_UR0000000688884;第二个分片边界范围为:t[table_id]_i[index_id]_UR0000000688885,t[table_id]_i[index_id]_UR0000000688889。此时,数据t[table_id]_i[index_id]_UR000000068888可以落入上述任意一个分片边界范围对应的存储分片中。
第二种情况,为支持更大数据量级,需要根据字符边界特点进行打散。ASCII码显示字符最小值为(空格)(sp),其十进制为32;最大值为~,其十进制为126,若第一分片数量大于分片数量阈值如1000,在第四最大索引值UR000000068888中增加一位数据,得到扩大后的第二分片边界范围[UR0000000068888,UR0000000068888~)。然后,对第一分片数量与1000的比值进行向上取整,得到第二分片边界范围的拆分次数。以拆分次数对扩大后的第二分片边界范围进行均等拆分,生成多组分片拆分边界范围。这里,将ASCII码十进制值32-126数组范围按照拆分次数进行均等拆分,并将拆分范围映射回ASCII码中的字符,即可生成多组分片拆分范围。示例性地,第一分片数量为1500,则按照ASCII码十进制值计算两个分片边界范围,即[32,79)、[79-126)两个范围,十进制值32对应ASCII码中的字符‘(空格)(sp)’,十进制值79对应ASCII码中的字符‘0’,十进制值126对应ASCII码中的字符‘~’,此时,拆分后的两个组分片拆分边界范围分别为[UR0000000068888,UR00000000688880)、[UR00000000688880,UR0000000068888~)。
第三种情况,第一分片数量大于又一分片数量阈值如94×1000,可以继续增加一位数据,即可以产生94×94×1000个分片范围,以此类推该方式就可以增加无限个分片范围。
这里,继续结合图10A进行示例性说明,为支持在同一个索引值打散,可以通过增加字符位数扩大分片边界范围的实现代码如下:
select case when(shard_number=1and low_value!=endpoint_value)thenconcat('split table sbtest1.deposit_ca_txn_other_table_2index`idx_acct_no`between(”',low_value,”')and(”',endpoint_value,”')regions 2;')else concat('split table sbtest1.deposit_ca_txn_other_table_2index`idx_acct_no`between(”',low_value,”') and (”',endpoint_value,'~”)regions',shard_number,';') endfrom (select low_value,endpoint_value,ceil(sum(endpoint_number)/100)shard_number from user_tab_histograms where table_name='deposit_ca_txn_other_table_2'group by low_value,endpoint_value order by low_value,endpoint_value)torder by shard_number asc。
执行上述代码后,示例结果如下:
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000988888')and('UR0000000988888~')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000788888')and('UR0000000788888~')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000888888')and('UR0000000888888~')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'idx_acct_no'between('UR0000000688888')and('UR0000000688888~')regions 15。
在另一种可实现的应用场景中,以数据类型为时间数据类型为例进行说明,在判断结果表征第四最大索引值与第四最小索引值相同的情况下,为支持在同一个索引值打散,可以通过增加时间位数扩大分片边界范围。这里,结合图10B进行示例性说明,如2022-09-1916:03:51值就会落在2022-09-19 16:03:51.1至2022-09-19 16:03:51.9范围区间内。时间类型最大支持切分粒度至us,即最大可以支持打散1000000*1000个分片范围。同样按照所需切分分片个数,按需增加时间位数。这里,继续结合图10B进行示例性说明,为支持在同一个索引值打散,可以通过增加时间位数扩大分片边界范围的实现代码如下:
select case when(shard_number=1and low_value!=endpoint_value)thenconcat('split table sbtest1.deposit_ca_txn_other_table_2index`mnt_sys_time`between(”',low_value,”')and(”',endpoint_value,”')region 2;')else concat('split table sbtest1.deposit_ca_txn_other_table_2index`mnt_sys_time`between(”',low_value,'.0”)and(”',endpoint_value,'.9”)regions',shard_number,';')endfrom(select low_value,endpoint_value,ceil(sum(endpoint_number)/100)shard_number from user_tab_histograms where table_name='deposit_ca_txn_other_table_2'and column_name='mnt_sys_time'group by low_value,endpoint_valueorder by low_value,endpoint_value)t。
执行上述代码后,示例结果如下:
split table sbtest1.deposit_ca_txn_other_table_2index'mnt_sys_time'between('2022-09-19 16:03:51.0')and('2022-09-19 16:03:51.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'mnt_sys_time'between('2022-09-19 16:07:37.0')and('2022-09-19 16:07:37.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'mnt_sys_time'between('2022-09-19 16:07:49.0')and('2022-09-19 16:07:49.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'mnt_sys_time'between('2022-09-19 16:08:00.0')and('2022-09-19 16:08:00.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'mnt_sys_time'between('2022-09-19 16:08:08.0')and('2022-09-19 16:08:08.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'mnt_sys_time'between('2022-09-19 16:08:15.0')and('2022-09-19 16:08:15.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2index'mnt_sys_time'between('2022-09-19 10:25:01.0')and('2022-09-19 10:25:01.9')regions 1。
相关技术中,目前支持的两种通用的打散方式,对于组合索引场景均有缺陷:第一种均匀切分:若第一列是个范围区间,则打散支持按照第一列的范围切分,无法感知后续第二列、第三列分布情况;比如存在以下场景:第一列可选值不多,第二列区分度更优,在这样情况下打散效果就会打折扣,甚至难以切分。比如索引前导列数据只有0或者1两种值,打散时使用“split table t index idx1 between(0)and(1)”语法切分,切分出来的分片范围只有0和1两个值,写入数据时最多只能写入两个分片,热点问题无法解决。虽然在这种情况可以尝试枚举前导列值进行打散,比如使用“split table t index idx1 between(0,‘a’)and(0,‘z’);split table t index idx1 between(1,‘a’)and(1,‘z’);”多个语句进行打散,这样分片的切分就会按照第二列范围进行。但是这种枚举方式需要重复大量操作,实际使用时可能枚举较多值后才能进行打散操作,操作复杂度高。第二种指定点切分:是指在指定值位置切分分片,实际操作更为复杂。比如上述例子只需要指定一个范围及分片个数,即可均匀切分分片个数;而指定点切分需要预先计算好每个分片边界值,对边界值进行切分,否则为每一个实际值切分一次,就会造成一个分片。最终情况是一个值一个分片,这样就丧失了分片的意义,加大了整个数据库负载和维护代价。
需要说明的是,上述切分均有一个前提,即需要知道如何切分,切分范围大小、切分个数,上述信息都需要用户自行判断。对于单列索引来说,就不易判断某一列数据范围及分布情况,根据列选择率,制定合理的打散策略。组合索引更为复杂,组合选择率本身就需要复杂的计算,综合考虑数据分布,分片大小等,目前已有分布式数据库产品均未提供很好的解决方案。
为此,本申请针对索引类型为组合索引类型,提出了如下方案,
这里,索引类型为组合索引类型,所述目标索引包括至少两个索引列,列直方图包括每一索引列对应的单列直方图和所有索引列拼接后对应的组合列直方图,对步骤203基于索引类型、分片数据行数和列直方图,对数据表的数据进行存储分片,并将数据表的数据按照存储分片进行打散的过程结合图12作出进一步说明,
步骤601,按照所有索引列的顺序,基于单列直方图、组合列直方图和分片数据行数,确定目标索引列对应的平均选择率、平均选择率阈值、Top值选择率和Top选择率阈值。
其中,目标索引列包括至少两个索引列和拼接索引列。
本申请实施例中,目标索引的索引类型为组合索引,且目标索引包括至少两个索引列,索引列的数据类型包括但不限于数字数据类型、字符串数据类型和时间数据类型。这里,目标索引包括至少两个索引列时,创建单列直方图的方式与创建唯一索引对应的列直方图的方式相同;创建组合列直方图时,需要将至少两个索引列进行拼接,得到一个拼接索引列,进而创建拼接索引列对应的组合列直方图与创建唯一索引对应的列直方图的方式相同。这里,示例性地,参照图10,以目标索引对应的索引列包括索引列acct_no和索引列mnt_sys_time,图10A示出的是索引列acct_no对应的单列直方图的示意图,图10B示出的是索引列mnt_sys_time对应的单列直方图的示意图,图10C示出的是索引列acct_no和mnt_sys_time拼接得到的拼接索引列对应的组合列直方图的示意图。这里,以索引类型为组合索引,且目标索引包括两个索引列(acct_no,mnt_sys_time),生成与目标索引列对应的列直方图的代码如下:
insert into user_tab_histograms select null as bucket_id,low_value,endpoint_value,endpoint_number,'deposit_ca_txn_other_table_2'as table_name,'txn_acct_no+mnt_sys_time'as column_name,'idx_acct_no+idx_mnt_sys_time'ascolumn_name,'sbtest1'as schema_name from(select min(concat(t.acct_no,',',t.mnt_sys_time))as low_value,max(concat(t.acct_no,',',t.mnt_sys_time))asendpoint_value,count(*)as endpoint_number from(select*,row_number()over(order by acct_no,mnt_sys_time)as row_num from sbtest1.deposit_ca_txn_other_table_2)t group by floor((t.row_num-1)/50)order by low_value,endpoint_value)t。
需要说明的是,组合索引需要考虑如下几种情况,一索引列个数可能是两列、三列;二索引列的数据类型需要进行额外判断;三选择率也需要考虑,由于其索引存储结构,若第一索引列选择率本身就很好,那无需考虑第二索引列的数据分布情况;若第一索引列过滤性较差,第二索引列过滤性不错的情况下,即可按照第二索引列打散。示例性地,继续参照图10,假设存在sbtest1.deposit_ca_txn_other_table_2表,存在(acct_no,mnt_sys_time)组合索引,acct_no其值分布相对不均匀,部分数据重复行数据较多,而mnt_sys_time,过滤性相对较好,此时,需要按照mnt_sys_time进行打散。
本申请实施例中,平均选择率用于确定以目标索引列对数据表的数据进行打散的均匀程度,平均选择率阈值用于判断平均选择率。
本申请实施例中,Top值选择率用于确定以目标索引列对应的索引值对数据表的数据进行打散的均匀程度,Top选择率阈值用于判断Top值选择率。
本申请实施例中,步骤601按照所有索引列的顺序,基于单列直方图、组合列直方图和分片数据行数,确定目标索引列对应的平均选择率、平均选择率阈值、Top值选择率和Top选择率阈值的过程结合图13作出进一步说明,
步骤611,以第一桶边界范围为维度,将列直方图中具有相同第一桶边界范围的目标桶进行合并,得到多个第二合并后的目标桶。
本申请实施例中,终端获取每一索引列对应的单列直方图和拼接索引列对应的组合列直方图后,针对每一单列直方图或组合列直方图,以第一桶边界范围为维度,将每一列直方图中具有相同第一桶边界范围的目标桶进行合并,得到多个第二合并后的目标桶,其中,第二合并后的目标桶中包括的数据行数等于所有具有相同第一桶边界范围的目标桶的数据行数之和。这里,结合图10A进行示例性说明,比如表sbtest1.deposit_ca_txn_other_table_2,存在索引列为acct_no的非唯一索引,其值分布相对不均匀,部分数据重复行数据较多,如UR000000068888数据记录较多,部分数据较小,如UR000000058888数据记录较少,此时,将索引列acct_no对应的列直方图中具有相同第一桶边界范围的目标桶bucket合并为一类,并统计每一第二合并后的目标桶包括的数据行数。具体地,参照图10A和14所示,图14示出的是第二合并后的目标桶对应的桶边界范围以及包括的数据行数的示意图。这里,参照图10A和14所示,以第一桶边界范围为维度,将列直方图中具有相同第一桶边界范围的目标桶进行合并,得到多个第二合并后的目标桶对应的实现代码如下:
select low_value,endpoint_value,sum(endpoint_number)sum_endpoint_number from user_tab_histograms where table_name='deposit_ca_txn_other_table_2'and column_name='idx_acct_no'group by low_value,endpoint_value orderby low_value,endpoint_value。
步骤612,计算每一第二合并后的目标桶的桶边界范围的桶去重值数量,以及针对所有第二合并后的目标桶的桶边界范围的目标去重值数量。
本申请实施例中,去重值数量(Number of Distinct Values,NDV)指的是范围结果集中的去重值个数。桶去重值数量指的是在第二合并后的目标桶对应的一个桶边界范围结果集中的去重值个数。目标去重值数量指的是在所有第二合并后的目标桶对应的多个桶边界范围中的去重值个数。
本申请实施例中,参照图14,针对桶去重值数量,若第二合并后的目标桶的桶边界范围为‘UR0000000588888’->‘UR0000000688888’,由于最小索引值UR0000000588888和最大索引值UR0000000688888不同,故该第二合并后的目标桶的桶边界范围的桶去重值数量为2;若第二合并后的目标桶的桶边界范围为‘UR0000000688888’->‘UR0000000688888’,由于最小索引值UR0000000688888和最大索引值UR0000000688888相同,故该第二合并后的目标桶的桶边界范围的去重值数量为1。针对目标去重值数量,若所有第二合并后的目标桶对应的多个桶边界范围为‘UR0000000588888’->‘UR0000000688888’、‘UR0000000688888’->‘UR0000000688888’、‘UR0000000688888’->‘UR0000000788888’、‘UR0000000788888’->‘UR0000000788888’、‘UR0000000788888’->‘UR0000000888888’、‘UR0000000888888’->‘UR0000000888888’、‘UR0000000888888’->‘UR0000000988888’、‘UR0000000988888’->‘UR0000000988888’,则目标去重值数量为5,分别为UR0000000588888、UR0000000688888、UR0000000788888、UR0000000888888和UR0000000988888。
步骤613,基于桶去重值数量、目标去重值数量和第二合并后的目标桶包含的合并数据行数,确定目标索引列的平均选择率。
本申请实施例中,计算平均选择率可以通过如下公式得到,
其中,T为第二合并后的目标桶的个数,NDVj为第j个第二合并后的目标桶对应的桶去重值数量,sum_endpoint_numberj为第j个第二合并后的目标桶包含的合并数据行数,S_NDV为目标去重值数量。
这里,结合图14进行示例性说明,索引列acct_no的平均选择率为:
步骤614,基于合并数据行数和分片数据行数,确定目标索引列的选择率阈值。
本申请实施例中,确定目标索引列的选择率阈值可以通过如下公式得到,
其中,T为第二合并后的目标桶的个数,sum_endpoint_numberj为第j个第二合并后的目标桶包含的合并数据行数,split_shard_keys为单个分片对应的分片数据行数。
这里,结合图14进行示例性说明,索引列acct_no的选择率阈值为:
步骤615,从多个第二合并后的目标桶中,筛选出满足桶筛选条件的第二合并后的目标桶。
其中,桶筛选条件包括第二合并后的目标桶的桶边界范围的第六最大索引值和第六最小索引值相同,且第六最大索引值位于排列后的所有第六最大索引值的前第一数量个位置。
本申请实施例中,由于平均选择率对于第二合并后的目标桶的最大索引值和最小索引值一致的场景估算会有极大偏差,考虑以下场景,数据分布极不均匀情况下,如果某个第二合并后的目标桶的最大索引值和最小索引值不一致,意味着该第二合并后的目标桶包括的数据行数最多为2个桶数据行数bucket_size,2个桶数据行数bucket size也就是一个存储分片的分片数据行数shard_size,这种情况下打散一个存储分片即可满足需要;如果上下边界一致,有可能多个目标桶bucket边界都为同一值,这样虽然平均选择率计算相对较低,但是仍然存在某些值比较集中。为解决这类问题,引入top值选择率,标识存在某些top值过滤性。
这里,top值即判断第二合并后的目标桶边界一致情况下,该索引值出现的频率,top可能是top10或top20,本质是通过引入top值选择率更加精准判断列选择性。
本申请实施例中,终端从多个第二合并后的目标桶中,筛选出第二合并后的目标桶中的桶边界范围的第六最大索引值和第六最小索引值相同的第二合并后的目标桶,并对筛选出的第二合并后的目标桶中的第六最大索引值进行排序;然后,从筛选出的第二合并后的目标桶中的,选择位于前第一数量个位置的第六最大索引值对应的第二合并后的目标桶,从而得到满足桶筛选条件的第二合并后的目标桶。这里,第一数量可以是预设数量,如10、20等,也可以是其他数值,对此,本申请不做具体限制。
步骤616,确定筛选出的每一第二合并后的目标桶包含的合并数据行数与筛选出的所有第二合并后的目标桶包含的合并数据行数之和的比值,为每一第六最大索引值的Top值选择率。
本申请实施例中,确定每一第六最大索引值的Top值选择率可以通过如下公式得到,
这里,结合图14进行示例性说明,索引列acct_no对应的多个第六最大索引值UR0000000688888、UR0000000788888、UR0000000888888和UR0000000988888的top选择率阈值分别为:
步骤617,确定选择率阈值与第一数量的比值,为Top选择率阈值。
本申请实施例中,Top选择率阈值可以通过如下公式得到,
这里,结合图14进行示例性说明,索引列acct_no的选择率阈值为3.3%,第一数量为10,即top10,计算索引列acct_no对应的top10选择率阈值为3.3%/10=0.33%。
步骤602,确定平均选择率与平均选择率阈值之间的第一大小关系,以及Top值选择率与Top选择率阈值之间的第二大小关系。
本申请实施例中,第一大小关系包括:平均选择率大于或等于平均选择率阈值,以及平均选择率小于平均选择率阈值。
本申请实施例中,第二大小关系包括:Top值选择率大于或等于Top选择率阈值,以及Top值选择率小于Top选择率阈值。
步骤603,基于第一大小关系和第二大小关系,从目标索引列中确定处于目标位置的索引列。
本申请实施例中,若第一大小关系表征平均选择率小于平均选择率阈值,则认为平均选择率对应的目标索引列过滤性较好,若第一大小关系表征平均选择率大于或等于平均选择率阈值,则认为平均选择率对应的目标索引列过滤性较差。
本申请实施例中,若第二大小关系表征Top值选择率小于Top选择率阈值,则认为平均选择率对应的目标索引列过滤性较好,即可按照首列进行打散,首列打散与单列打散方式一致;若第二大小关系表征Top值选择率大于或等于Top选择率阈值,则认为平均选择率对应的目标索引列过滤性较差,则不能以排列在前的当前索引列进行打散,需要继续计算下一索引列的平均选择率、平均选择率阈值、Top值选择率和Top选择率阈值,以确定下一索引列的过滤性,以此类推,直至达到目标索引列的最后一列,经过上述判断后,即可确定至组合索引的目标位置即第几列的索引列,打散效果最好。具体地,组合索引打散的方式,按照上述组合索引分布情况,按第一索引列分组,将第一索引列相同的结果汇聚。若第一列值上下边界不同,则按照第一列范围打散即可;若第一列值上下边界相同,则按照第二索引列范围打散。这里,结合图10A进行示例说明,按照组合索引对数据进行打散的代码如下:
select case when(shard_number=1and fc_low_value!=fc_endpoint_value)then concat('split table sbtest1.deposit_ca_txn_other_table_2 index`idx_acct_no_mnt_sys_time` between (”',fc_low_value,”') and(”',fc_endpoint_value,”')region 2;')else replace(concat('split table sbtest1.deposit_ca_txn_other_table_2index`idx_acct_no_mnt_sys_time`between(”',low_value,'.0”) and (”',endpoint_value,'.9”) regions',shard_number,';'),',',”',”') end from (selectsubstr(low_value,1,instr(low_value,',')-1) as fc_low_value,substr(endpoint_value,1,instr(endpoint_value,',')-1) as fc_endpoint_value,low_value,endpoint_value,shard_number from (select low_value,endpoint_value,ceil(sum(endpoint_number)/100)shard_number from user_tab_histograms where table_name='deposit_ca_txn_other_table_2'and column_name='idx_acct_no+idx_mnt_sys_time'group bylow_value,endpoint_value order by low_value,endpoint_value)t)t。
执行上述代码后,生成的示例结果如下:
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000588888')and('UR0000000688888')regions 2;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000688888','2022-09-1916:08:00.0')and('UR0000000688888','2022-09-19 16:08:00.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000688888','2022-09-1916:08:00.0')and('UR0000000688888','2022-09-19 16:08:08.9')regions 1;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000688888','2022-09-1916:08:08.0')and('UR0000000688888','2022-09-19 16:08:08.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000688888','2022-09-1916:08:05.0')and('UR0000000688888','2022-09-19 16:08:15.9')regions 1;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000688888','2022-09-1916:08:15.0')and('UR0000000688888','2022-09-19 16:08:15.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000688888')and('UR0000000788888')regions 2;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000788888','2022-09-1916:07:49.0')and('UR0000000788888','2022-09-19 16:07:49.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000788888')and('UR0000000888888')regions 2;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000888888','2022-09-1916:07:37.0')and('UR0000000888888','2022-09-19 16:07:37.9')regions 5;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000888888')and('UR0000000988888')regions 2;
split table sbtest1.deposit_ca_txn_other_table_2 index'idx_acct_no_mnt_sys_time' between('UR0000000988888','2022-09-1916:03:51.0')and('UR0000000988888','2022-09-19 16:03:51.9')regions 5。
步骤604,根据目标位置的索引列对数据进行存储分片,并将数据表的数据按照存储分片进行打散。
由上述可知,本申请实施例中,首先通过整体数据量,估算所需存储分片region个数,按照(1/region个数)计算平均选择率判断值,这样计算出的判断值相对更合理。比如region很少情况下,则判断值更接近100%,即使平均选择率或Top值选择率很高情况下,只要小于100%,则打散则会按照第一列打散即可;若region很多情况下,则判断选择率很低,则平均选择率及Top值选择率更有参考意义。其次,引入Top值选择率,且只处理范围上下边界一致的第二合并后的目标桶bucket,这样有几点好处:(1)对于单列索引,若上下边界不一致,意味着该范围除边界上界值数据行数不会太多,打散一个分片即可。(2)对于单列索引,若上下边界一致,意味着该范围至少大于一个分片;再根据分组将同一类值合并,即可知晓准确的分片个数。(3)对于组合索引,计算Top值选择率一方面过滤掉了上下边界不一致的bucket(边界不一致意味着选择率很低),降低了计算个数;(4)另一方面,Top值选择率也避免了平均选择率在列偏斜严重情况下,产生的计算误差。
本申请其他实施例中,为方便多次使用,每次计算打散结果后,将打散结果放入实体表中。后续对于该表使用或环境变更时,均可以将对应打散语句拿出进行打散。比如以下场景:使用测试数据或准生产环境构造相对真实数据,将生成的打散结果,可以直接投入生产即可使用。使用scheduler定期将打散语句重新生成,保持打散或数据离散性。
下面继续说明本申请实施例提供的数据处理装置154实施为软件模块的示例性结构,在一些实施例中,如图3所示,存储在存储器150的数据处理装置154中的软件模块可以是终端100中的数据处理装置,包括:
获取模块1541,用于获取针对数据库中数据表预设的打散参数、所述数据表的目标索引以及所述目标索引对应的索引类型,其中,所述打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数;
生成模块1542,用于基于所述桶数据行数和所述数据表的数据,生成与所述目标索引对应的列直方图,其中,所述列直方图包括多个目标桶;
处理模块1543,用于基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,并将所述数据表的数据按照所述存储分片进行打散。
需要说明的是,本申请实施例装置的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果,因此不做赘述。对于本装置实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
本申请实施例提供一种存储有可执行指令的存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的方法,例如,如图4、7-9、12-13示出的方法。
在一些实施例中,存储介质可以是计算机可读存储介质,例如,铁电存储器(FRAM,Ferromagnetic Random Access Memory)、只读存储器(ROM,Read Only Memory)、可编程只读存储器(PROM,Programmable Read Only Memory)、可擦除可编程只读存储器(EPROM,Erasable Programmable Read Only Memory)、带电可擦可编程只读存储器(EEPROM,Electrically Erasable Programmable Read Only Memory)、闪存、磁表面存储器、光盘、或光盘只读存储器(CD-ROM,Compact Disk-Read Only Memory)等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(超文本标记语言,Hyper Text Markup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。
Claims (10)
1.一种数据处理方法,其特征在于,包括:
获取针对数据库中数据表预设的打散参数、所述数据表的目标索引以及所述目标索引对应的索引类型,其中,所述打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数;
基于所述桶数据行数和所述数据表的数据,生成与所述目标索引对应的列直方图,其中,所述列直方图包括多个目标桶;
基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,并将所述数据表的数据按照所述存储分片进行打散。
2.根据权利要求1所述的方法,其特征在于,所述基于所述桶数据行数和所述数据表的数据,生成与所述目标索引对应的列直方图,包括:
对所述数据表的数据进行排序,确定所述目标索引对应的每一索引值所在数据行的逻辑行号;
基于所述逻辑行号和所述桶数据行数,对所述逻辑行号对应的数据进行桶划分,得到所述逻辑行号对应的数据所在的目标桶;
基于所述目标桶中的目标索引对应的索引列的第一最大索引值和第一最小索引值,确定所述目标桶的第一桶边界范围;
基于所述目标桶的第一桶边界范围和所述目标桶包含的数据的实际数据行数,生成所述列直方图。
3.根据权利要求1所述的方法,其特征在于,所述基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,包括:
若所述索引类型为单列索引且所述目标索引为唯一索引,按照所述列直方图包括的所述目标桶的桶标识对所述多个目标桶进行排序;
基于第一目标桶的第二最小索引值、第二目标桶的第二最大索引值,确定第一分片边界范围;
确定所述分片数据行数与所述桶数据行数的比值,为所述单个分片与所述单个桶之间的倍数因子;
针对排序后的多个目标桶,将相邻的所述倍数因子个目标桶的第一桶边界范围进行合并,并确定合并后的第一桶边界范围的第三最大索引值;
以第一目标桶的第二最小索引值、多个第三最大索引值为切分点,对所述第一分片边界范围内的数据进行存储分片。
4.根据权利要求1所述的方法,其特征在于,所述基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,包括:
若所述索引类型为单列索引且所述目标索引为普通索引,以所述第一桶边界范围为维度,将所述列直方图中具有相同第一桶边界范围的目标桶进行合并,得到第一合并后的目标桶;
获取所述第一合并后的目标桶的第二分片边界范围中的第四最大索引值与第四最小索引值是否相同的判断结果,其中,所述第二分片边界范围为所述具有相同第一桶边界范围;
若判断结果表征所述第四最大索引值与第四最小索引值不相同,以所述第四最大索引值或所述第四最小索引值为切分点,对所述第二分片边界范围内的数据进行存储分片。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
若判断结果表征所述第四最大索引值与第四最小索引值相同,确定所述第一合并后的目标桶包含的数据的总数据行数与所述分片数据行数的比值,为所述第二分片边界范围所需的第一分片数量;
若所述第一分片数量大于分片数量阈值,获取所述目标索引对应的索引列的数据类型,并在所述第四最大索引值中增加与所述数据类型对应的数据位数,得到扩大后的第二分片边界范围,其中,所述扩大后的第二分片边界范围中的第五最大索引值与第五最小索引值不相同;
对所述第一分片数量与所述分片数量阈值的比值进行向上取整,得到所述第二分片边界范围的拆分次数;
以所述拆分次数对所述扩大后的第二分片边界范围进行均等拆分,生成多组分片拆分边界范围;
对每一分片拆分边界范围内的数据进行存储分片。
6.根据权利要求1所述的方法,其特征在于,所述索引类型为组合索引类型,所述目标索引包括至少两个索引列,所述列直方图包括每一索引列对应的单列直方图和所有索引列拼接后对应的组合列直方图,所述基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,包括:
按照所述所有索引列的顺序,基于所述单列直方图、所述组合列直方图和所述分片数据行数,确定目标索引列对应的平均选择率、平均选择率阈值、Top值选择率和Top选择率阈值,其中,所述目标索引列包括所述至少两个索引列和拼接索引列;
确定所述平均选择率与所述平均选择率阈值之间的第一大小关系,以及所述Top值选择率与所述Top选择率阈值之间的第二大小关系;
基于所述第一大小关系和第二大小关系,从所述目标索引列中确定处于目标位置的索引列;
根据所述目标位置的索引列对所述数据进行存储分片。
7.根据权利要求6所述的方法,其特征在于,所述按照所述所有索引列的顺序,基于所述单列直方图、所述组合列直方图和所述分片数据行数,确定目标索引列对应的平均选择率、平均选择率阈值、Top值选择率和Top选择率阈值,包括:
以所述第一桶边界范围为维度,将所述列直方图中具有相同第一桶边界范围的目标桶进行合并,得到多个第二合并后的目标桶;
计算每一第二合并后的目标桶的桶边界范围的桶去重值数量,以及针对所有第二合并后的目标桶的桶边界范围的目标去重值数量;
基于所述桶去重值数量、所述目标去重值数量和所述第二合并后的目标桶包含的合并数据行数,确定所述目标索引列的平均选择率;
基于所述合并数据行数和所述分片数据行数,确定所述目标索引列的选择率阈值;
从所述多个第二合并后的目标桶中,筛选出满足桶筛选条件的第二合并后的目标桶,其中,所述桶筛选条件包括所述第二合并后的目标桶的桶边界范围的第六最大索引值和第六最小索引值相同,且第六最大索引值位于排列后的所有第六最大索引值的前第一数量个位置;
确定所述筛选出的每一第二合并后的目标桶包含的合并数据行数与筛选出的所有第二合并后的目标桶包含的合并数据行数之和的比值,为每一第六最大索引值的所述Top值选择率;
确定所述选择率阈值与所述第一数量的比值,为所述Top选择率阈值。
8.一种数据处理装置,其特征在于,所述装置,包括:
获取模块,用于获取针对数据库中数据表预设的打散参数、所述数据表的目标索引以及所述目标索引对应的索引类型,其中,所述打散参数包括:单个分片包含的分片数据行数和单个桶包含的桶数据行数;
生成模块,用于基于所述桶数据行数和所述数据表的数据,生成与所述目标索引对应的列直方图,其中,所述列直方图包括多个目标桶;
处理模块,用于基于所述索引类型、所述分片数据行数和所述列直方图,对所述数据表的数据进行存储分片,并将所述数据表的数据按照所述存储分片进行打散。
9.一种数据处理设备,其特征在于,包括:
存储器,用于存储可执行指令;处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至7任一项所述的方法。
10.一种存储介质,其特征在于,存储有可执行指令,用于引起处理器执行时,实现权利要求1至7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310242252.4A CN116578558A (zh) | 2023-03-01 | 2023-03-01 | 一种数据处理方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310242252.4A CN116578558A (zh) | 2023-03-01 | 2023-03-01 | 一种数据处理方法、装置、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116578558A true CN116578558A (zh) | 2023-08-11 |
Family
ID=87541927
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310242252.4A Pending CN116578558A (zh) | 2023-03-01 | 2023-03-01 | 一种数据处理方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116578558A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116932655A (zh) * | 2023-09-18 | 2023-10-24 | 成都市杉岩科技有限公司 | 一种分布式键值数据库操作方法及计算机可读存储介质 |
-
2023
- 2023-03-01 CN CN202310242252.4A patent/CN116578558A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116932655A (zh) * | 2023-09-18 | 2023-10-24 | 成都市杉岩科技有限公司 | 一种分布式键值数据库操作方法及计算机可读存储介质 |
CN116932655B (zh) * | 2023-09-18 | 2023-11-24 | 成都市杉岩科技有限公司 | 一种分布式键值数据库操作方法及计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20230376506A1 (en) | System and Method for Analysis and Management of Data Distribution in a Distributed Database Environment | |
Tsourakakis et al. | Fennel: Streaming graph partitioning for massive scale graphs | |
US20120323867A1 (en) | Systems and methods for querying column oriented databases | |
CN111125059B (zh) | 数据迁移方法、装置、存储介质及服务器 | |
CN102708183B (zh) | 数据压缩的方法和装置 | |
CN103678609A (zh) | 一种基于分布式关系-对象映射处理的大数据查询的方法 | |
CN104239301A (zh) | 一种数据比对方法和装置 | |
US9305076B1 (en) | Flattening a cluster hierarchy tree to filter documents | |
EP3425528A1 (en) | Service parameter selection method and related device | |
CN111159180A (zh) | 一种基于数据资源目录构建的数据处理方法及系统 | |
CN105989015B (zh) | 一种数据库扩容方法和装置以及访问数据库的方法和装置 | |
CN105550225A (zh) | 索引构建方法、查询方法及装置 | |
CN106649412B (zh) | 一种数据处理方法和设备 | |
CN112163048A (zh) | 基于ClickHouse实现OLAP分析的方法、装置 | |
CN116578558A (zh) | 一种数据处理方法、装置、设备及存储介质 | |
CN104731951A (zh) | 一种数据查询方法及装置 | |
CN105159986A (zh) | 一种oracle数据库优化配置的方法及系统 | |
CN112204543A (zh) | 用于分布式系统的频繁模式分析 | |
US20230325375A1 (en) | Measuring and improving index quality in a distrubuted data system | |
CN101916281B (zh) | 并行计算系统及去重计数方法 | |
CN103902592A (zh) | 基于MapReduce实现分析函数的方法及系统 | |
CN114090695A (zh) | 分布式数据库的查询优化的方法和装置 | |
CN111858607A (zh) | 数据处理方法、装置、电子设备和计算机可读介质 | |
CN103365923A (zh) | 用于评估数据库的分区方案的方法和装置 | |
CN106980673A (zh) | 内存数据库表索引更新方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |