本发明公开一种方法,涉及数据库,具体地说是一种分布式数据库的数据表统计信息自动采集方法。
背景技术:
1、分布式数据库,分布式数据库系统是指将数据分散存储在不同计算机节点上,通过网络协议进行通信和协调,形成一个具有统一视图和访问方式的数据库系统。它具有高扩展性、高可用性、高并发能力。
2、数据库查询优化器,是数据库系统的重要组成部分,optimizer组件即为查询优化器。查询优化器的作用是需要在一个合理的时间找到一个合理的计划,并且保证这个合理计划能稳定快速的返回查询结果。
3、cbo(cost-based optimization),“基于代价的优化器”,该优化器通过对sqlparser后产生的关系表达式进行转换,生成多个执行计划,然后cbo会根据统计信息(statistics)和代价模型(cost model)计算各个计划的“代价”,选择“代价”最低的执行计划,作为最终的执行计划,发送给执行引擎。
4、统计信息(statistics),存储在元数据中,是从数据表中提取出的一些数据特征,如总行数、列的distinct值(ndv)、列的直方图、网络资源、cpu使用情况等等。统计信息的准确与否最终会影响cbo选择最优的执行计划。
5、目前使用数据库的用户还需手动执行命令语法采集数据表的统计信息,不但用户体验感较差,统计信息也不能保证更新。
技术实现思路
1、本发明针对现有技术的问题,提供一种分布式数据库的数据表统计信息自动采集方法,提高用户的使用体验,保证数据库中的统计信息保持更新的状态。
2、本发明提出的具体方案是:
3、本发明提供一种分布式数据库的数据表统计信息自动采集方法,预设sql命令,利用sql命令捕获数据表的变化数据,所述变化数据为数据表id和变化行数,将所述变化数据存储至map结构的变量中;
4、定时触发刷新统计信息的操作,获取所述变量中元素所对应的数据表,根据数据表获取统计信息,根据条件判断是否需要刷新所述统计信息,所述条件包括:
5、①所述统计信息不存在,
6、②距离上次自动刷新超过预设时长,
7、③数据表成功执行import操作,导入了数据sql语句,
8、④数据表发生了schema change操作,更改了表结构,
9、⑤当数据表发生插入、更新或删除的操作时,根据公式:rowsaffected>=rowcount*fraction+min_row,判断是否满足刷新条件,fraction的分数取值在(0,1)之间,min_row为最小行数,rowcount为数据变化行数,rowsaffected为数据未变化时统计信息中的表行数;
10、满足任一项所述条件则刷新统计信息,并存储统计信息,利用gossip协议通知各个数据库节点。
11、进一步,所述的一种分布式数据库的数据表统计信息自动采集方法中所述预设sql命令,利用sql命令捕获数据表的变化数据,包括:
12、预设sql命令为set sql.stats.automatic_collection.enabled,
13、当set sql.stats.automatic_collection.enabled=true,则开启捕获数据表中变化数据的操作,捕获数据表中变化数据,否则set sql.stats.automatic_collection.enabled=false,关闭捕获数据表中变化数据的操作。
14、进一步,所述的一种分布式数据库的数据表统计信息自动采集方法中所述将所述变化数据存储至map结构的变量中,包括:
15、命名所述map结构的变量为mutationcounts,将mutationcounts的key设为数据表id,value设为数据变化行数。
16、进一步,所述的一种分布式数据库的数据表统计信息自动采集方法中所述根据数据表获取统计信息,包括:
17、先尝试从数据表统计信息的缓存中获取统计信息,若缓存中不存在,则从数据库元数据中获得统计信息并将统计信息加入缓存中。
18、进一步,所述的一种分布式数据库的数据表统计信息自动采集方法中所述满足任一项所述条件则刷新统计信息,包括:
19、根据数据表id拼接触发刷新统计信息的sql语句,利用所述sql语句调用执行器刷新数据表的统计信息。
20、本发明还提供一种分布式数据库的数据表统计信息自动采集装置,包括启动模块、刷新模块和判断模块,
21、启动模块预设sql命令,利用sql命令捕获数据表的变化数据,所述变化数据为数据表id和数据变化行数,刷新模块将所述变化数据存储至map结构的变量中;
22、刷新模块定时触发刷新统计信息的操作,获取所述变量中元素所对应的数据表,根据数据表获取统计信息,判断模块根据条件判断是否需要刷新所述统计信息,所述条件包括:
23、①所述统计信息不存在,
24、②距离上次自动刷新超过预设时长,
25、③数据表成功执行import操作,导入了数据sql语句,
26、④数据表发生了schema change操作,更改了表结构,
27、⑤当数据表发生插入、更新或删除的操作时,根据公式:rowsaffected>=rowcount*fraction+min_row,判断是否满足刷新条件,fraction的分数取值在(0,1)之间,min_row为最小行数,rowcount为数据变化行数,rowsaffected为数据未变化时统计信息中的表行数,满足任一项所述条件则刷新模块刷新统计信息,并存储统计信息,利用gossip协议通知各个数据库节点。
28、进一步,所述的一种分布式数据库的数据表统计信息自动采集装置中所述预设sql命令,利用sql命令捕获数据表的变化数据,包括:
29、预设sql命令为set sql.stats.automatic_collection.enabled,
30、当set sql.stats.automatic_collection.enabled=true,则开启捕获数据表中变化数据的操作,捕获数据表中变化数据,否则set sql.stats.automatic_collection.enabled=false,关闭捕获数据表中变化数据的操作。
31、进一步,所述的一种分布式数据库的数据表统计信息自动采集装置中所述将所述变化数据存储至map结构的变量中,包括:
32、命名所述map结构的变量为mutationcounts,将mutationcounts的key设为数据表id,value设为数据变化行数。
33、进一步,所述的一种分布式数据库的数据表统计信息自动采集装置中所述根据数据表获取统计信息,包括:
34、先尝试从数据表统计信息的缓存中获取统计信息,若缓存中不存在,则从数据库元数据中获得统计信息并将统计信息加入缓存中。
35、进一步,所述的一种分布式数据库的数据表统计信息自动采集装置中所述满足任一项所述条件则刷新统计信息,包括:
36、根据数据表id拼接触发刷新统计信息的sql语句,利用所述sql语句调用执行器刷新数据表的统计信息。
37、本发明的有益之处是:
38、本发明提供一种分布式数据库的数据表统计信息自动采集方法,预设sql命令,利用sql命令捕获数据表的变化数据,所述变化数据为数据表id和变化行数,将所述变化数据存储至map结构的变量中,定时触发刷新统计信息的操作,获取所述变量中元素所对应的数据表,根据数据表获取统计信息,根据条件判断是否需要刷新所述统计信息,从而提高数据库统计信息的准确性,并能够进一步帮助优化器选择一个更优的执行计划,同时本发明提出的统计信息自动采集方法均为后台运行,不会影响数据库系统的其他操作。