CN112597004A - Sql语句性能测试方法、装置、计算机设备和存储介质 - Google Patents

Sql语句性能测试方法、装置、计算机设备和存储介质 Download PDF

Info

Publication number
CN112597004A
CN112597004A CN202011462193.4A CN202011462193A CN112597004A CN 112597004 A CN112597004 A CN 112597004A CN 202011462193 A CN202011462193 A CN 202011462193A CN 112597004 A CN112597004 A CN 112597004A
Authority
CN
China
Prior art keywords
sql statement
sql
triggered
replaced
analyzed
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
Application number
CN202011462193.4A
Other languages
English (en)
Inventor
梁伟项
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Guangzhou Pinwei Software Co Ltd
Original Assignee
Guangzhou Pinwei Software Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Guangzhou Pinwei Software Co Ltd filed Critical Guangzhou Pinwei Software Co Ltd
Priority to CN202011462193.4A priority Critical patent/CN112597004A/zh
Publication of CN112597004A publication Critical patent/CN112597004A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请涉及一种SQL语句性能测试方法、装置、计算机设备和存储介质,所述方法包括:获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数;获取待替换参数对应的线上参数;将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句;对替换后的SQL语句执行性能测试分析。上述方法能够提高SQL语句性能测试结果的准确度。

Description

SQL语句性能测试方法、装置、计算机设备和存储介质
技术领域
本申请涉及信息测试技术领域,特别是涉及一种SQL语句性能测试方法、装置、计算机设备和存储介质。
背景技术
现阶段,在测试阶段执行SQL(Structured Query Language,结构化查询语言)语句的性能测试时存在时间成本高以及技术难度大等各大痛点。例如,在对SQL语句的性能测试中,采用现有的一些开源工具进行性能测试的检索分析,如现有开源工具SOAR,SQLAdvisor等。这些开源工具均是基于RBO(基于规则的启发式优化器)算法对SQL语句进行索引方案分析,分析结果忽略了线上数据分布对SQL语句的索引选择的影响,从而降低SQL语句的性能测试结果数据的准确性。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提高SQL语句性能测试结果的准确度的SQL语句性能测试方法、装置、计算机设备和存储介质。
一种SQL语句性能测试方法,该方法包括:获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数;获取待替换参数对应的线上参数;将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句;对替换后的SQL语句执行性能测试分析。
在其中一个实施例中,一种SQL语句性能测试方法还包括:在被测试应用程序的进程中注入拦截代码,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句;获取待分析的SQL语句,包括:从触发的SQL语句中获取待分析的SQL语句。
优选地,一种SQL语句性能测试方法还包括:按照预设频率监测配置表记录的多个应用程序中被测试应用程序的进程是否注入拦截代码,若否,执行在被测试应用程序的进程中注入拦截代码的步骤。
在其中一个实施例中,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句之后,还包括:获取触发的SQL语句的标识信息,当根据标识信息识别出触发的SQL语句未执行过性能测试时,执行从触发的SQL语句中获取待分析的SQL语句的步骤。
在其中一个实施例中,标识信息包括触发的SQL语句的哈希码,获取触发的SQL语句的标识信息,包括:获取触发的SQL语句的哈希码;根据标识信息识别出触发的SQL语句未执行过性能测试,包括:将触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,识别出触发的SQL语句未执行过性能测试;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句的哈希码。
优选地,获取触发的SQL语句的哈希码,包括:对触发的SQL语句进行解析,得到触发的SQL语句中的第一不可变字符,第一不可变字符为触发的SQL语句中不用于参数替换的字符;计算第一不可变字符的哈希码,将第一不可变字符的哈希码作为触发的SQL语句的哈希码;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句中的第二不可变字符的哈希码,第二不可变字符为已执行性能测试的SQL语句中不用于参数替换的字符。
在其中一个实施例中,若匹配失败,识别出触发的SQL语句未执行过性能测试,包括:若匹配失败,获取SQL语句性能测试的忽略规则配置信息,忽略规则配置信息用于指示满足预设忽略规则的SQL语句不用于执行性能测试;当触发的SQL语句不满足忽略规则配置信息中预设忽略规则时,识别出触发的SQL语句未执行过性能测试。
在其中一个实施例中,从待分析的SQL语句中识别待替换参数,包括:获取预设字符,当从待分析的SQL语句中识别到预设字符时,将待分析的SQL语句中的预设字符作为待替换参数。
在其中一个实施例中,获取待替换参数对应的线上参数,包括:获取待分析的SQL语句中的数据表信息,数据表信息用于指示出待分析的SQL语句用于查询的数据库中的数据表;根据数据表信息从线上数据库采集SQL语句的字段值;获取待分析的SQL语句的表达式,根据表达式从SQL语句的字段值获取线上参数。
优选地,一种SQL语句性能测试方法还包括:若无法获取到待分析的SQL语句的表达式,或根据表达式无法从SQL语句的字段值获取到线上参数,获取待分析的SQL语句的测试环境中用于替换待替换参数的测试参数,将测试参数作为线上参数。
在其中一个实施例中,对替换后的SQL语句执行性能测试分析,包括:获取替换后的SQL语句中的查询条件;根据查询条件创建多个索引方式;在各索引方式下执行替换后的SQL语句的索引性能测试,获取执行索引耗时最少的索引方式;若索引耗时最少的索引方式只有一个,将索引耗时最少的索引方式作为替换后的SQL语句的索引方式;若索引耗时最少的索引方式为多个,根据RBO算法对多个索引耗时最少的索引方式进行筛选,筛选出替换后的SQL语句的索引方式。
一种SQL语句性能测试装置,该装置包括:第一获取模块,用于获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数;第二获取模块,用于获取待替换参数对应的线上参数;替换模块,用于将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句;测试模块,用于对替换后的SQL语句执行性能测试分析。
一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述任一实施例方法的步骤。
一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述任一实施例方法的步骤。
上述SQL语句性能测试方法、装置、计算机设备和存储介质,测试***获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数,进而获取待替换参数对应的线上参数,将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句,对替换后的SQL语句执行性能测试分析。因此,在执行SQL语句性能测试时,测试***能够引入线上参数,将线上参数替换SQL语句中的待替换参数后再执行SQL语句的性能分析,从而得到基于线上数据的性能分析结果,提高SQL语句的性能测试结果数据的准确性。
附图说明
图1为一个实施例中一种SQL语句性能测试方法的应用环境图;
图2为一个实施例中一种SQL语句性能测试方法的流程示意图;
图3为一个实施例中测试***执行触发的SQL语句的去重操作的流程示意图;
图4为一个实施例中测试***执行待分析的SQL语句的参数替换的流程示意图;
图5为一个实施例中测试***执行替换后的SQL语句的索引性能测试的流程示意图;
图6为一个实施例中测试***的***架构示意图;
图7为一个实施例中一种SQL语句性能测试方法的业务时序逻辑的流程示意图;
图8为一个实施例中一种SQL语句性能测试装置的结构框图;
图9为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请提供的一种SQL语句性能测试方法,应用于如图1所示的应用环境中。如图1所示,测试***10用于执行本申请的一种SQL语句性能测试方法。SQL管理平台104用于对SQL语句进行采集并管理。其中,SQL管理平台104中的服务器用于采集被测应用中的SQL语句并存储到数据库中。测试平台102从SQL管理平台104中请求获取待分析的SQL语句,并从待分析的SQL语句中识别待替换参数。进而,从线上数据平台进行参数采样,获取待替换参数对应的线上参数。最后,测试平台102将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句,对替换后的SQL语句执行性能测试分析。因此,在执行SQL语句性能测试时,测试***10能够引入线上参数,将线上参数替换SQL语句中的待替换参数后再执行SQL语句的性能分析,从而得到基于线上数据的性能分析结果,提高SQL语句的性能测试结果数据的准确性。
在一个实施例中,如图2所示,提供了一种SQL语句性能测试方法,以该方法应用于图1中的测试***10为例进行说明,包括以下步骤:
S102,获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数。
在本实施例中,测试平台102的服务器从数据库中获取待分析的SQL语句。具体可以是,设置定时任务,通过启动定时任务按照指定时间从数据库中获取一条或多条待分析的SQL语句。其中,数据库中存储的待分析的SQL语句通过从被测试应用的进程中拦截得到。如,设置包含拦截代码的代理程序,将代理程序注入被测试应用中,通过代理程序拦截被测试应用运行过程触发的SQL语句,将拦截到的SQL语句存储到数据库中。服务器从数据库存储的SQL语句中获取待分析的SQL语句。
待分析的SQL语句中包含有待替换参数。一般地,待替换参数为SQL语句中能够根据索引需求改变的字符。例如,SQL语句为查询语句时,SQL语句中订单号id对应的字符为待替换参数。如,select语句中的id>??中,“??”为待替换参数。此处id>??表示订单号id为“??”。查询的订单号可以根据索引需求进行修改,此时“??”可以做为可替换的待替换参数。
服务器从待分析的SQL语句中识别待替换参数。具体可以是:服务器对待分析的SQL语句按照SQL语句的语法结构进行解析,得到多个字符,进一步对各字符进行字符识别,以识别出待分析的SQL语句中能够替换的字符,将能够替换的字符作为待替换参数。识别的方式为:识别各字符是否为SQL语句中不能替换的字符,如select、from、create、databases等字符。若是,则判断该字符不属于待替换字符,反之判断该字符为待替换字符。
S104,获取待替换参数对应的线上参数。
在本实施例中,服务器确定出待分析的SQL语句中的待替换参数之后,获取该待替换参数对应的线上参数。可以是,服务器识别待替换参数的类型,调用线上参数采样模块从线上数据平台采集待替换参数的线上参数。还可以是,服务器获取待分析的SQL语句中的库名字符和表名字符,根据库名字符和表名字符查询线上SQL语句,进而获取线上SQL语句中的待替换参数对应的线上参数。例如,基于上述表达式中id>??,“??”为待替换参数,待替换参数的类型为订单号。调用线上参数采样模块从线上数据平台采集线上订单号作为线上参数作为参数替换。
S106,将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句。
在本实施例中,服务器将待分析的SQL语句中的待替换参数修改为线上参数,得到替换后的SQL语句。如,将待分析的SQL语句中查询的订单号这一待替换参数修改为线上SQL语句中查询的订单号这一线上参数。或,将待分析的SQL语句中修改的数据对象这一待替换参数修改为线上SQL语句中修改的数据对象这一线上参数。
S108,对替换后的SQL语句执行性能测试分析。
在本实施例中,服务器对替换后的SQL语句执行性能测试分析。可以是:获取替换后的SQL语句的索引方式,基于索引方式对替换后的SQL语句执行索引性能的测试分析。如,替换后的SQL语句的性能测试分析为:按照索引方式执行替换后的SQL语句,计算替换后的SQL语句执行完成时耗费的时间,基于耗费的时间判断替换后的SQL语句的索引性能。
上述SQL语句性能测试方法,测试***的服务器获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数,进而获取待替换参数对应的线上参数,将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句,对替换后的SQL语句执行性能测试分析。因此,在执行SQL语句性能测试时,测试***能够引入线上参数,将线上参数替换SQL语句中的待替换参数后再执行SQL语句的性能分析,从而得到基于线上数据的性能分析结果,提高SQL语句的性能测试结果数据的准确性。
在一实施例中,S102之前,还包括:在被测试应用程序的进程中注入拦截代码,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句。S102包括:从触发的SQL语句中获取待分析的SQL语句。优选地,在被测试应用程序的进程中注入拦截代码之前,还包括:按照预设频率监测配置表记录的多个应用程序中被测试应用程序的进程是否注入拦截代码,若否,执行在被测试应用程序的进程中注入拦截代码的步骤。
在该实施例中,测试***中设置配置表。配置表中记录有一个或多个被测试应用程序。SQL管理平台104是一个基于Spring Boot框架开发的WEB应用,SQL管理平台104用于采集被测试应用的触发的SQL语句。SQL管理平台104包含环境监控模块。环境监控模块以预设频率,如1分钟一次的频率,监控配置表中的被测应用程序是否有被注入采集SQL语句的包含拦截代码的代理程序,如果没有则注入。其中,在被测试应用程序的进程中注入拦截代码,具体为:设置SQL语句采集的代理程序Agent,代理程序Agent封装了不同数据持久层框架的拦截代码。该代理程序Agent被注入被测试应用的目标进程后实时拦截被测试应用运行过程中触发的SQL语句,并通过SQL管理平台104的API接口传送到测试平台102的测试分析模块,以通过测试分析模块进行SQL语句的性能分析。因此,实现了待分析的SQL语句的实时线上采集。
在一实施例中,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句之后,还包括:获取触发的SQL语句的标识信息,当根据标识信息识别出触发的SQL语句未执行过性能测试时,执行从触发的SQL语句中获取待分析的SQL语句的步骤。
在该实施例中,拦截到被测试应用程序在程序运行过程中触发的SQL语句之后,需要对触发的SQL语句进行去重操作。SQL管理平台104包含SQL收集并去重模块,该SQL收集并去重模块接收SQL管理平台104的API接口传递的触发的SQL语句,根据触发的SQL语句的标识信息判断触发的SQL语句是否已经执行过性能测试,若是,则对触发的SQL语句进行丢弃处理。若否,对其执行性能测试。如:通过注入拦截代码的方式获取到被测应用程序进程中的触发的SQL语句之后,若触发的SQL语句没有执行过性能测试,将触发的SQL语句存储到存储区。存储区可以是Redis数据库。在执行性能测试时,从存储区中获取触发的SQL语句执行性能测试。去重处理可以实现剔除历史分析过的SQL语句,避免SQL语句的重复分析。
在一实施中,标识信息包括触发的SQL语句的哈希码,获取触发的SQL语句的标识信息,包括:获取触发的SQL语句的哈希码。根据标识信息识别出触发的SQL语句未执行过性能测试,包括:将触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,识别出触发的SQL语句未执行过性能测试;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句的哈希码。
在该实施例中,存储区可以是Redis数据库。测试***10将获取到的触发的SQL语句存储到存储区中,并从存储区中的触发的SQL语句中获取未执行性能测试的SQL语句以执行性能测试。当存储区中触发的SQL语句已执行过性能测试时,标注已执行过性能测试的触发的SQL语句。其中,可以采用触发的SQL语句的哈希码进行标注。这里的哈希码指的是与触发的SQL语句关联的哈希码,可以由触发的SQL语句中全部字符或者部分字符计算得到。当采集到新的触发的SQL语句时,将新的触发的SQL语句的哈希码与存储区中各触发的SQL语句的哈希码进行匹配,以识别出未执行过性能测试触发的SQL语句。当存储区为Redis数据库时,可将触发的SQL语句的哈希码作为Redis数据库的键值对中的键以对触发的SQL语句进行缓存,从而在采集到新的触发的SQL语句时,通过将新的触发的SQL语句的哈希码与Redis数据库中各键值对中的键进行匹配识别即可,因此可提高测试***10匹配识别的处理效率。
优选地,获取触发的SQL语句的哈希码,包括:对触发的SQL语句进行解析,得到触发的SQL语句中的第一不可变字符,第一不可变字符为触发的SQL语句中不用于参数替换的字符;计算第一不可变字符的哈希码,将第一不可变字符的哈希码作为触发的SQL语句的哈希码;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句中的第二不可变字符的哈希码,第二不可变字符为已执行性能测试的SQL语句中不用于参数替换的字符。
在该实施例中,触发的SQL语句的哈希码以及存储区中各个哈希码均根据对应的SQL语句中不可变字符的哈希码确定。其中,SQL语句中包含可变字符和不可变字符。可变字符和不可变字符的划分的基准为:不可变字符为SQL语句中不用于参数替换的字符,可变字符为SQL语句中能够用于参数替换。其中,SQL语句中的字符是否用于参数替换由预先设定的规则确定。如,设定SQL语句中的“?”字符用作参数替换,其他字符不用于参数替换。举例说明,SQL语句为查询语句:SELECT*FROM查询的表名WHERE键名='键值',根据SQL语句的句式结构以及SQL语句的索引功能提取出SELECT字符、FROM字符和WHERE字符、以及查询的表名对应的字符以及键名对应的字符作为不可变字符、'键值'对应的字符为可变字符。
按照上述的方式提取出触发的SQL语句中的第一不可变字符以及已执行性能测试的SQL语句中的第二不可变字符。计算第一不可变字符的哈希码,将第一不可变字符的哈希码作为触发的SQL语句的哈希码。计算已执行性能测试的SQL语句中的第二不可变字符的哈希码,将已执行性能测试的SQL语句进行存储,以用于后续哈希码的匹配识别。测试***在触发的SQL语句的去重操作时,通过SQL语句的不可变字符确定的哈希码进行匹配识别,可提供SQL语句的识别的准确度,从而提高触发的SQL语句的去重的准确性。
进一步地,标识信息包括触发的SQL语句的第一不可变字符的哈希码以及触发的SQL语句中的库名以及表名。根据标识信息识别出触发的SQL语句未执行过性能测试,包括:将标识信息中的第一不可变字符的哈希码以及触发的SQL语句中的库名以及表名分别与存储区中各个识别信息中的哈希码以及库名和表名进行匹配,若标识信息与识别信息匹配失败,识别出所述触发的SQL语句未执行过性能测试;其中,识别信息中的哈希码以及库名和表名为已执行性能测试的SQL语句的第二不可变字符的哈希码以及已执行性能测试的SQL语句的库名和表名。
具体地,将触发的SQL语句所涉及的库名称、表名称以及触发的SQL语句中剔除待替换参数之后的字符得到的哈希码拼接形成字符串,将该字符串作为触发的SQL语句的标识信息。同时,存储区中已执行性能测试的SQL语句的识别信息的获取方式也通过此方式获得。
举例:对于SQL语句:select*from tableA where id>?。采集该SQL语句的同时也会收集其所在的库名称,假设是库名称为databaseA;经过SQL语句的解析,得到表名称为tableA,待替换参数为id>?中的“?”,由不可变字符构成的关键信息字符串为:select*fromtableA where id>,假设关键信息生成的哈希码hashcode是1234566789;最终得到的标识信息或识别信息为databaseAtableA1234566789。
在一实施例中,将触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,识别出触发的SQL语句未执行过性能测试,包括:若匹配失败,获取SQL语句性能测试的忽略规则配置信息,忽略规则配置信息用于指示满足预设忽略规则的SQL语句不用于执行性能测试;当触发的SQL语句不满足忽略规则配置信息中预设忽略规则时,识别出触发的SQL语句未执行过性能测试。
在该实施例中,当触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,则表明触发的SQL语句未执行过性能测试,此时进一步检测触发的SQL语句是否为配置信息中需过滤的SQL语句。具体地,预先配置忽略规则配置信息,忽略规则配置信息用于指示满足预设忽略规则的SQL语句不用于执行性能测试。如,设置规则配置信息表,规则配置信息表中填写有预设忽略规则。忽略规则配置信息包括规则配置信息表中一个或多个预设忽略规则。当触发的SQL语句不满足忽略规则配置信息中预设忽略规则时,确定触发的SQL语句未执行过性能测试。反之,对触发的SQL语句执行忽略操作。因此,可为人工操作提供操作节点,通过人工配置产生忽略规则配置信息以控制SQL语句的性能测试操作,从而使得测试***更加满足SQL语句的性能测试要求。
在一实施例中,当触发的SQL语句不满足忽略规则配置信息中预设忽略规则时,识别出触发的SQL语句未执行过性能测试之后,还包括:通过SQL语法树构建的方式对未执行过性能测试的触发的SQL语句进行解析,从解析结果中提取触发的SQL语句的第三不可变字符,获取第三不可变字符的哈希码,将第三不可变字符的哈希码作为存储区的键值对中的键进行存储,当执行触发的SQL语句的哈希码与存储区中各个哈希码进行匹配的步骤时,从存储区中获取键值对中的键与触发的SQL语句的哈希码进行匹配。
在该实施例中,SQL语法树构建的方式对未执行过性能测试的触发的SQL语句进行解析,得到触发的SQL语句的第三不可变字符。此处的第三不可变字符的判断规则如上述SQL语句中不可变字符的判断规则相同。当第三不可变字符为多个时,将多个第三不可变字符构成字符串,获取字符串的哈希码,将字符串的哈希码作为存储区的键值对中的键进行存储。例如,触发的SQL语句的第三不可变字符可以包括select字符、form字符等。
具体地,采集触发的SQL语句之后对触发的SQL语句进行去重操作流程如图3所示。参考图3所示的流程:首先判断Redis数据库中是否存在以采集到的触发的SQL语句的哈希码作为Redis数据库的键值对中的键的缓存。若是,结束去重操作的判断流程,将采集到的触发的SQL语句进行丢弃处理。若否,判断采集到的触发的SQL语句是否符合配置的忽略规则。该忽略规则为人工配置,可通过忽略规则控制满足该忽略规则的触发的SQL语句不执行去重操作。忽略规则以库名与表名作为Redis数据库的键值对中的键进行缓存。通过触发的SQL语句中的库名与表名作为Redis数据库的键值对中的键查询该触发的SQL语句的忽略规则。
当触发的SQL语句满足预先配置的忽略规则时,将触发的SQL语句的哈希码作为Redis数据库的键值对中的键的缓存。若触发的SQL语句不满足预先配置的忽略规则,采用SQL语法树构建的方式对触发的SQL语句进行解析,提取触发的SQL语句中的关键信息,拼接成字符A。其中,关键信息可以包括触发的SQL语句中的第三不可变字符。再次判断Redis数据库中是否存在以字符A的哈希码作为键值对中的键的缓存信息,若否,将字符A的哈希码作为Redis数据库的键值对中的键进行缓存。若是,以触发的SQL语句的哈希码作为Redis数据库的键值对中的键进行缓存。其中,图3中的sql指的是触发的SQL语句,hashcode指哈希码,key指的是键值对中的键,redis指的是Redis数据库。因此,为SQL语句的性能测试的去重操作提供技术框架,从而测试***能够对采集到的触发的SQL语句进行去重操作,剔除历史分析过的SQL语句,避免重复分析,减轻测试***的***运行压力。
在一实施例中,S102包括:获取预设字符,当从待分析的SQL语句中识别到预设字符时,将待分析的SQL语句中的预设字符作为待替换参数。
在该实施例中,预先配置预设字符。如,预设字符可以是“?”字符。通过SQL语句的解析框架对待分析的SQL语句进行解析,得到待分析的SQL语句各个字符。判断待分析的SQL语句中是否存在预设字符,若是,则将待分析的SQL语句中的预设字符作为待替换参数。因此,可快速识别出待分析的SQL语句中的待替换参数。
在一实施例中,S104包括:获取待分析的SQL语句中的数据表信息,数据表信息用于指示出待分析的SQL语句用于查询的数据库中的数据表;根据数据表信息从线上数据库采集SQL语句的字段值;获取待分析的SQL语句的表达式,根据表达式从SQL语句的字段值获取线上参数。
优选地,根据数据表信息从线上数据库采集SQL语句的字段值之后,还包括:若无法获取到待分析的SQL语句的表达式,或根据表达式无法从SQL语句的字段值获取到线上参数,获取待分析的SQL语句的测试环境中用于替换待替换参数的测试参数,将测试参数作为线上参数。
在该实施例中,根据待分析的SQL语句中数据表信息涉及的所有数据表名称从线上数据库采集数据,采集到的数据包括SQL语句的字段值。同时,采用SQL语句的解析框架对待分析的SQL语句进行解析,得到待分析的SQL语句的表达式。其中,解析得到的待分析的SQL语句的表达式包括待替换参数对应的左表达式。根据左表达式从采集到的数据中获取待替换参数的线上参数。
若采用SQL语句的解析框架对待分析的SQL语句进行解析后,从解析结果判断待分析的SQL语句中未包含表达式,即无法获取到待分析的SQL语句的表达式时,将待分析的SQL语句的测试环境中用于替换待替换参数的测试参数作为线上参数。或者,采用SQL语句的解析框架对待分析的SQL语句进行解析后,从解析结果判断待分析的SQL语句中包含表达式,但无法根据表达式从采集到的数据中获取待替换参数的线上参数时,将待分析的SQL语句的测试环境中用于替换待替换参数的测试参数作为线上参数。
例如,根据待分析的SQL语句涉及的库名称和表名称从线上数据库获取部分线上数据备用。获取待分析的SQL语句中的所有需要替换的参数的左表达式,然后分成两类处理:一类是该左表达式属于线上数据表中的某一个字段,则获取备用的线上数据中对应的字段替换该参数;另外一类是左表达式不存在或者对应不上线上数据中任何一个字段,比如参数属于函数调用的参数,排序(order by)参数,分页(limit)参数等,则可以直接使用从测试环境收集到的完成了参数替换的SQL语句中对应的参数值来替换该参数。
举例说明:select*from tableA where id>?limit?这条待分析的SQL语句。在测试环境中完成参数替换后的SQL语句是:select*from tableA where id>200limit 50,需要替换的参数有两个,第一个“?”,对于的左表达式是id,对应的是tableA中的id字段,可以用线上数据中tableA表中的id字段的值来作为替换的线上参数。假设从采集到的线上数据的id为500,而第二个“?”对应的左表达式是limit,它是一个SQL命令,对应不上线上数据中任何数据表的字段,此时可以从测试环境中提取替换后的参数进行替换,即用50进行替换,替换后的SQL语句为:select*from tableA where id>500limit 50。
在一实施例中,S108包括:获取替换后的SQL语句中的查询条件;根据查询条件创建多个索引方式;在各索引方式下执行替换后的SQL语句的索引性能测试,获取执行索引耗时最少的索引方式;若索引耗时最少的索引方式只有一个,将索引耗时最少的索引方式作为替换后的SQL语句的索引方式;若索引耗时最少的索引方式为多个,根据RBO算法对多个索引耗时最少的索引方式进行筛选,筛选出替换后的SQL语句的索引方式。
在该实施例中,测试***10的测试平台102对替换后的SQL语句执行索引性能测试。首先获取替换后的SQL语句中的查询条件。获取的方式可以包括:从替换后的SQL语句中获取查询字段,根据查询字段确定一个或多个查询条件。进一步地,根据查询条件创建多个索引,在各索引下执行替换后的SQL语句的索引性能测试。例如,替换后的SQL语句为:select*from tableA where a=1and b=2and c>3。经过解析识别到查询条件左表达式为a,b,c。也即是查询条件包括a,b,c。经过排列组合得到的索引组合为:1、单独只建a索引。2、单独只建b索引。3、单独只建c索引。4、建ab联合索引。5、建ac联合索引。6、建ba联合索引。7、建bc联合索引。8、建ca联合索引。9、建cb联合索引。10、建abc联合索引。11、建acb联合索引。12、建bac联合索引。13、建bca联合索引。14、建cab联合索引。15、建cba联合索引。依次建立这些索引,然后让替换后的SQL语句强行按照这些索引执行一遍,得到不同索引下的耗时。进一步地,执行各索引方式时获取执行索引耗时最少的索引方式。若索引耗时最少的索引方式只有一个,将索引耗时最少的索引方式作为替换后的SQL语句的索引方式,从而完成替换后的SQL语句的性能测试。若索引耗时最少的索引方式为多个,根据RBO(Rule-BasedOptimization基于规则的优化器)算法对多个索引耗时最少的索引方式进行筛选,筛选出替换后的SQL语句的索引方式,从而完成替换后的SQL语句的性能测试。
具体地,如图5所示。测试***根据替换后的SQL语句所属的数据库名称做环境准备及线上测试数据准备,然后基于CBO(Cost-Based Optimization基于代价的优化器)算法为主、RBO算法为辅的方式去进行SQL索引方案分析。如图5所示,force index表示forceindex()方法,测试***执行force index()方法时强制使用force index()方法中的索引。sql指的是替换后的SQL语句。cost指的是按照CBO算法执行替换后的SQL语句时的索引耗时。因此,基于CBO算法为主、RBO算法为辅的替换后的SQL语句的性能测试,能够提高替换后的SQL语句的性能测试的准确度。
针对上述一种SQL语句性能测试方法,以下提供一个具体实施例;
参见图6所示,图6提供了一具体实施过程中测试***的***架构图。本申请采用图6所示的***架构执行本申请的一种SQL语句性能测试方法。参见图6所示,测试***可以划分为3个子***:SQL采集Agent线下测试环境、SQL分析管理平台以及SQL分析***。
SQL采集Agent线下测试环境的SQL语句采集代理程序Agent:主要基于开源的jvm-sandbox工具,封装不同数据持久层框架的拦截代码。该Agent被注入被测试应用的目标进程后实时的拦截到被测试应用运行过程中触发的SQL语句,并通过SQL分析管理平台的API接口传送出去。
SQL分析管理平台,一个基于Spring Boot框架开发的WEB应用,主要有以下几个子模块:
环境监控模块,该模块主要作用是以1分钟一次的频率去监控配置表中的被测应用程序是否有被注入采集Agent,如果没有则注入。
SQL收集并去重模块,该模块的主要作用是接收Agent传递过来的SQL语句信息,并根据特定的算法做SQL语句去重后选择丢弃或者存储到数据库。去重的目的是剔除历史分析过的SQL语句,避免重复分析。去重算法逻辑如图3所示。
SQL分析定时任务模块,该模块的定时任务的主要目的是从数据库中提取出所有未分析的SQL语句,经过SQL解析,线上参数采样并执行参数替换后将替换后的SQL语句提交到SQL分析***进行分析,并对分析结果做处理。其中,参数替换的目的是充分利用线上真实的数据去做索引分析。替换逻辑如附图4所示。
分析结果使用模块,该模块主要根据分析结果判断是否有风险,对于有风险的SQL创建一份风险告警邮件,在通过应用名称关联到对应责任人后发送出去。
SQL分析***:主要作用是基于CBO算法为主、CRO算法为辅的方式进行SQL语句的索引方案分析,计算逻辑如附图5所示。
针对图6的***框架,测试***执行本申请的一种SQL语句性能测试方法的业务时序逻辑参见图7所示。
如图7所示,SQL分析管理平台中的环境监控模块把采集Agent注入到测试环境中的被测应用。采集Agent拦截到SQL语句后通过接口传递到SQL分析管理平台中的SQL收集并去重模块。SQL分析管理平台中的定时任务将未分析的SQL语句从数据库提取出,通过调用SQL分析***的线上参数采样接口做参数采样,然后通过解析SQL语句后做参数替换,最后把替换后的SQL语句提交到SQL分析***分析。
SQL分析***接收到SQL语句后,先根据SQL语句的所属的数据库名称做环境准备及线上测试数据准备,然后基于CBO算法为主、RBO算法为辅的方式进行SQL语句的索引方案分析,并把分析结果返回给SQL分析管理平台。
SQL分析管理平台对分析结果做对应处理。
综上,本申请的一种SQL语句性能测试方法,能够支持自动采集线下测试环境中的待分析的SQL语句,实现在测试阶段提前做SQL语句的索引及风险评估,解决了人工测试的时间成本高和难度大的问题。此外,本申请的一种SQL语句性能测试方法,在性能测试的分析结果中引入了线上参数,从而提高了性能测试结果对SQL语句的索引选择的意义性,提升了性能测试结果的参考意义。
应该理解的是,虽然流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,附图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
本申请还提供一种SQL语句性能测试装置,如图8所示,该装置包括第一获取模块10、第二获取模块20、替换模块30以及测试模块40。第一获取模块10,用于获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数;第二获取模块20,用于获取待替换参数对应的线上参数;替换模块30,用于将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句;测试模块40,用于对替换后的SQL语句执行性能测试分析。
在其中一个实施例中,一种SQL语句性能测试装置还包括注入模块,用于在被测试应用程序的进程中注入拦截代码,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句;获取待分析的SQL语句,包括:从触发的SQL语句中获取待分析的SQL语句。
优选地,一种SQL语句性能测试装置还包括监测模块,用于按照预设频率监测配置表记录的多个应用程序中被测试应用程序的进程是否注入拦截代码,若否,执行在被测试应用程序的进程中注入拦截代码的步骤。
在其中一个实施例中,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句之后,还包括:获取触发的SQL语句的标识信息,当根据标识信息识别出触发的SQL语句未执行过性能测试时,执行从触发的SQL语句中获取待分析的SQL语句的步骤。
在其中一个实施例中,标识信息包括触发的SQL语句的哈希码,获取触发的SQL语句的标识信息,包括:获取触发的SQL语句的哈希码;根据标识信息识别出触发的SQL语句未执行过性能测试,包括:将触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,识别出触发的SQL语句未执行过性能测试;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句的哈希码。
优选地,获取触发的SQL语句的哈希码,包括:对触发的SQL语句进行解析,得到触发的SQL语句中的第一不可变字符,第一不可变字符为触发的SQL语句中不用于参数替换的字符;计算第一不可变字符的哈希码,将第一不可变字符的哈希码作为触发的SQL语句的哈希码;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句中的第二不可变字符的哈希码,第二不可变字符为已执行性能测试的SQL语句中不用于参数替换的字符。
在其中一个实施例中,若匹配失败,识别出触发的SQL语句未执行过性能测试,包括:若匹配失败,获取SQL语句性能测试的忽略规则配置信息,忽略规则配置信息用于指示满足预设忽略规则的SQL语句不用于执行性能测试;当触发的SQL语句不满足忽略规则配置信息中预设忽略规则时,识别出触发的SQL语句未执行过性能测试。
在其中一个实施例中,第一获取模块10具体还用于从待分析的SQL语句中识别待替换参数,包括:获取预设字符,当从待分析的SQL语句中识别到预设字符时,将待分析的SQL语句中的预设字符作为待替换参数。
在其中一个实施例中,获取待替换参数对应的线上参数,包括:获取待分析的SQL语句中的数据表信息,数据表信息用于指示出待分析的SQL语句用于查询的数据库中的数据表;根据数据表信息从线上数据库采集SQL语句的字段值;获取待分析的SQL语句的表达式,根据表达式从SQL语句的字段值获取线上参数。
优选地,第二获取模块具体用于若无法获取到待分析的SQL语句的表达式,或根据表达式无法从SQL语句的字段值获取到线上参数,获取待分析的SQL语句的测试环境中用于替换待替换参数的测试参数,将测试参数作为线上参数。
在其中一个实施例中,对替换后的SQL语句执行性能测试分析,包括:获取替换后的SQL语句中的查询条件;根据查询条件创建多个索引方式;在各索引方式下执行替换后的SQL语句的索引性能测试,获取执行索引耗时最少的索引方式;若索引耗时最少的索引方式只有一个,将索引耗时最少的索引方式作为替换后的SQL语句的索引方式;若索引耗时最少的索引方式为多个,根据RBO算法对多个索引耗时最少的索引方式进行筛选,筛选出替换后的SQL语句的索引方式。
关于SQL语句性能测试装置的具体限定可以参见上文中对于SQL语句性能测试方法的限定,在此不再赘述。上述SQL语句性能测试装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是支持测试***运行的服务器,其内部结构图可以如图9所示。该计算机设备包括通过***总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作***、计算机程序和数据库。该内存储器为非易失性存储介质中的操作***和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部设备连接,以与外部设备进行信息交互。该计算机程序被处理器执行时以实现一种SQL语句性能测试方法。
本领域技术人员可以理解,图9中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数;获取待替换参数对应的线上参数;将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句;对替换后的SQL语句执行性能测试分析。
在其中一个实施例中,处理器执行计算机程序时实现以下步骤:在被测试应用程序的进程中注入拦截代码,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句;处理器执行计算机程序实现上述的获取待分析的SQL语句的步骤时,具体实现以下步骤:从触发的SQL语句中获取待分析的SQL语句。
在其中一个实施例中,处理器执行计算机程序时实现以下步骤:按照预设频率监测配置表记录的多个应用程序中被测试应用程序的进程是否注入拦截代码,若否,执行在被测试应用程序的进程中注入拦截代码的步骤。
在其中一个实施例中,处理器执行计算机程序时实现以下步骤:获取触发的SQL语句的标识信息,当根据标识信息识别出触发的SQL语句未执行过性能测试时,执行从触发的SQL语句中获取待分析的SQL语句的步骤。
在其中一个实施例中,标识信息包括触发的SQL语句的哈希码。处理器执行计算机程序实现上述的获取触发的SQL语句的标识信息的步骤时,具体实现以下步骤:获取触发的SQL语句的哈希码。处理器执行计算机程序实现上述的根据标识信息识别出触发的SQL语句未执行过性能测试的步骤时,具体实现以下步骤:将触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,识别出触发的SQL语句未执行过性能测试;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句的哈希码。
在其中一个实施例中,处理器执行计算机程序实现上述的获取触发的SQL语句的哈希码的步骤时,具体实现以下步骤:对触发的SQL语句进行解析,得到触发的SQL语句中的第一不可变字符,第一不可变字符为触发的SQL语句中不用于参数替换的字符;计算第一不可变字符的哈希码,将第一不可变字符的哈希码作为触发的SQL语句的哈希码;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句中的第二不可变字符的哈希码,第二不可变字符为已执行性能测试的SQL语句中不用于参数替换的字符。
在其中一个实施例中,处理器执行计算机程序实现上述的若匹配失败,识别出触发的SQL语句未执行过性能测试的步骤时,具体实现以下步骤:若匹配失败,获取SQL语句性能测试的忽略规则配置信息,忽略规则配置信息用于指示满足预设忽略规则的SQL语句不用于执行性能测试;当触发的SQL语句不满足忽略规则配置信息中预设忽略规则时,识别出触发的SQL语句未执行过性能测试。
在其中一个实施例中,处理器执行计算机程序实现上述的从待分析的SQL语句中识别待替换参数的步骤时,具体实现以下步骤:获取预设字符,当从待分析的SQL语句中识别到预设字符时,将待分析的SQL语句中的预设字符作为待替换参数。
在其中一个实施例中,处理器执行计算机程序实现上述的获取待替换参数对应的线上参数的步骤时,具体实现以下步骤:获取待分析的SQL语句中的数据表信息,数据表信息用于指示出待分析的SQL语句用于查询的数据库中的数据表;根据数据表信息从线上数据库采集SQL语句的字段值;获取待分析的SQL语句的表达式,根据表达式从SQL语句的字段值获取线上参数。
在其中一个实施例中,处理器执行计算机程序时实现以下步骤:若无法获取到待分析的SQL语句的表达式,或根据表达式无法从SQL语句的字段值获取到线上参数,获取待分析的SQL语句的测试环境中用于替换待替换参数的测试参数,将测试参数作为线上参数。
在其中一个实施例中,处理器执行计算机程序实现上述的对替换后的SQL语句执行性能测试分析的步骤时,具体实现以下步骤:获取替换后的SQL语句中的查询条件;根据查询条件创建多个索引方式;在各索引方式下执行替换后的SQL语句的索引性能测试,获取执行索引耗时最少的索引方式;若索引耗时最少的索引方式只有一个,将索引耗时最少的索引方式作为替换后的SQL语句的索引方式;若索引耗时最少的索引方式为多个,根据RBO算法对多个索引耗时最少的索引方式进行筛选,筛选出替换后的SQL语句的索引方式。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:获取待分析的SQL语句,从待分析的SQL语句中识别待替换参数;获取待替换参数对应的线上参数;将线上参数替换待分析的SQL语句中的待替换参数,得到替换后的SQL语句;对替换后的SQL语句执行性能测试分析。
在其中一个实施例中,计算机程序被处理器执行时实现以下步骤:在被测试应用程序的进程中注入拦截代码,通过拦截代码获取被测试应用程序在程序运行过程中触发的SQL语句;计算机程序被处理器执行实现上述的获取待分析的SQL语句的步骤时,具体实现以下步骤:从触发的SQL语句中获取待分析的SQL语句。
在其中一个实施例中,计算机程序被处理器执行时实现以下步骤:按照预设频率监测配置表记录的多个应用程序中被测试应用程序的进程是否注入拦截代码,若否,执行在被测试应用程序的进程中注入拦截代码的步骤。
在其中一个实施例中,计算机程序被处理器执行时实现以下步骤:获取触发的SQL语句的标识信息,当根据标识信息识别出触发的SQL语句未执行过性能测试时,执行从触发的SQL语句中获取待分析的SQL语句的步骤。
在其中一个实施例中,标识信息包括触发的SQL语句的哈希码。计算机程序被处理器执行实现上述的获取触发的SQL语句的标识信息的步骤时,具体实现以下步骤:获取触发的SQL语句的哈希码。计算机程序被处理器执行实现上述的根据标识信息识别出触发的SQL语句未执行过性能测试的步骤时,具体实现以下步骤:将触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,识别出触发的SQL语句未执行过性能测试;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句的哈希码。
在其中一个实施例中,计算机程序被处理器执行实现上述的获取触发的SQL语句的哈希码的步骤时,具体实现以下步骤:对触发的SQL语句进行解析,得到触发的SQL语句中的第一不可变字符,第一不可变字符为触发的SQL语句中不用于参数替换的字符;计算第一不可变字符的哈希码,将第一不可变字符的哈希码作为触发的SQL语句的哈希码;其中,存储区中各个哈希码分别为已执行性能测试的SQL语句中的第二不可变字符的哈希码,第二不可变字符为已执行性能测试的SQL语句中不用于参数替换的字符。
在其中一个实施例中,计算机程序被处理器执行实现上述的若匹配失败,识别出触发的SQL语句未执行过性能测试的步骤时,具体实现以下步骤:若匹配失败,获取SQL语句性能测试的忽略规则配置信息,忽略规则配置信息用于指示满足预设忽略规则的SQL语句不用于执行性能测试;当触发的SQL语句不满足忽略规则配置信息中预设忽略规则时,识别出触发的SQL语句未执行过性能测试。
在其中一个实施例中,计算机程序被处理器执行实现上述的从待分析的SQL语句中识别待替换参数的步骤时,具体实现以下步骤:获取预设字符,当从待分析的SQL语句中识别到预设字符时,将待分析的SQL语句中的预设字符作为待替换参数。
在其中一个实施例中,计算机程序被处理器执行实现上述的获取待替换参数对应的线上参数的步骤时,具体实现以下步骤:获取待分析的SQL语句中的数据表信息,数据表信息用于指示出待分析的SQL语句用于查询的数据库中的数据表;根据数据表信息从线上数据库采集SQL语句的字段值;获取待分析的SQL语句的表达式,根据表达式从SQL语句的字段值获取线上参数。
在其中一个实施例中,计算机程序被处理器执行时实现以下步骤:若无法获取到待分析的SQL语句的表达式,或根据表达式无法从SQL语句的字段值获取到线上参数,获取待分析的SQL语句的测试环境中用于替换待替换参数的测试参数,将测试参数作为线上参数。
在其中一个实施例中,计算机程序被处理器执行实现上述的对替换后的SQL语句执行性能测试分析的步骤时,具体实现以下步骤:获取替换后的SQL语句中的查询条件;根据查询条件创建多个索引方式;在各索引方式下执行替换后的SQL语句的索引性能测试,获取执行索引耗时最少的索引方式;若索引耗时最少的索引方式只有一个,将索引耗时最少的索引方式作为替换后的SQL语句的索引方式;若索引耗时最少的索引方式为多个,根据RBO算法对多个索引耗时最少的索引方式进行筛选,筛选出替换后的SQL语句的索引方式。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

Claims (10)

1.一种SQL语句性能测试方法,所述方法包括:
获取待分析的SQL语句,从所述待分析的SQL语句中识别待替换参数;
获取所述待替换参数对应的线上参数;
将所述线上参数替换所述待分析的SQL语句中的所述待替换参数,得到替换后的SQL语句;
对所述替换后的SQL语句执行性能测试分析。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在被测试应用程序的进程中注入拦截代码,通过所述拦截代码获取所述被测试应用程序在程序运行过程中触发的SQL语句;
所述获取待分析的SQL语句,包括:从所述触发的SQL语句中获取所述待分析的SQL语句;
优选地,所述方法还包括:
按照预设频率监测配置表记录的多个应用程序中所述被测试应用程序的进程是否注入所述拦截代码,若否,执行所述在被测试应用程序的进程中注入拦截代码的步骤。
3.根据权利要求2所述的方法,其特征在于,所述通过所述拦截代码获取所述被测试应用程序在程序运行过程中触发的SQL语句之后,还包括:
获取所述触发的SQL语句的标识信息,当根据所述标识信息识别出所述触发的SQL语句未执行过性能测试时,执行所述从所述触发的SQL语句中获取所述待分析的SQL语句的步骤。
4.根据权利要求3所述的方法,其特征在于,所述标识信息包括所述触发的SQL语句的哈希码,所述获取所述触发的SQL语句的标识信息,包括:获取所述触发的SQL语句的哈希码;
所述根据所述标识信息识别出所述触发的SQL语句未执行过性能测试,包括:将所述触发的SQL语句的哈希码与存储区中各个哈希码进行匹配,若匹配失败,识别出所述触发的SQL语句未执行过性能测试;
其中,所述存储区中各个哈希码分别为已执行性能测试的SQL语句的哈希码;
优选地,所述获取所述触发的SQL语句的哈希码,包括:
对所述触发的SQL语句进行解析,得到所述触发的SQL语句中的第一不可变字符,所述第一不可变字符为所述触发的SQL语句中不用于参数替换的字符;
计算所述第一不可变字符的哈希码,将所述第一不可变字符的哈希码作为所述触发的SQL语句的哈希码;
其中,所述存储区中各个哈希码分别为已执行性能测试的SQL语句中的第二不可变字符的哈希码,所述第二不可变字符为所述已执行性能测试的SQL语句中不用于参数替换的字符。
5.根据权利要求4所述的方法,其特征在于,所述若匹配失败,识别出所述触发的SQL语句未执行过性能测试,包括:
若匹配失败,获取SQL语句性能测试的忽略规则配置信息,所述忽略规则配置信息用于指示满足预设忽略规则的SQL语句不用于执行性能测试;
当所述触发的SQL语句不满足所述忽略规则配置信息中所述预设忽略规则时,识别出所述触发的SQL语句未执行过性能测试。
6.根据权利要求1所述的方法,其特征在于,所述从所述待分析的SQL语句中识别待替换参数,包括:
获取预设字符,当从所述待分析的SQL语句中识别到所述预设字符时,将所述待分析的SQL语句中的所述预设字符作为所述待替换参数;
优选地,所述获取所述待替换参数对应的线上参数,包括:
获取所述待分析的SQL语句中的数据表信息,所述数据表信息用于指示出所述待分析的SQL语句用于查询的数据库中的数据表;
根据所述数据表信息从线上数据库采集SQL语句的字段值;
获取所述待分析的SQL语句的表达式,根据所述表达式从所述SQL语句的字段值获取所述线上参数;
优选地,所述方法还包括:
若无法获取到所述待分析的SQL语句的表达式,或根据所述表达式无法从所述SQL语句的字段值获取到所述线上参数,获取所述待分析的SQL语句的测试环境中用于替换所述待替换参数的测试参数,将所述测试参数作为所述线上参数。
7.根据权利要求1所述的方法,其特征在于,所述对所述替换后的SQL语句执行性能测试分析,包括:
获取所述替换后的SQL语句中的查询条件;
根据所述查询条件创建多个索引方式;
在各索引方式下执行所述替换后的SQL语句的索引性能测试,获取执行索引耗时最少的索引方式;
若索引耗时最少的索引方式只有一个,将索引耗时最少的索引方式作为所述替换后的SQL语句的索引方式;
若索引耗时最少的索引方式为多个,根据RBO算法对多个索引耗时最少的索引方式进行筛选,筛选出所述替换后的SQL语句的索引方式。
8.一种SQL语句性能测试装置,其特征在于,所述装置包括:
第一获取模块,用于获取待分析的SQL语句,从所述待分析的SQL语句中识别待替换参数;
第二获取模块,用于获取所述待替换参数对应的线上参数;
替换模块,用于将所述线上参数替换所述待分析的SQL语句中的所述待替换参数,得到替换后的SQL语句;
测试模块,用于对所述替换后的SQL语句执行性能测试分析。
9.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
CN202011462193.4A 2020-12-11 2020-12-11 Sql语句性能测试方法、装置、计算机设备和存储介质 Pending CN112597004A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011462193.4A CN112597004A (zh) 2020-12-11 2020-12-11 Sql语句性能测试方法、装置、计算机设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011462193.4A CN112597004A (zh) 2020-12-11 2020-12-11 Sql语句性能测试方法、装置、计算机设备和存储介质

Publications (1)

Publication Number Publication Date
CN112597004A true CN112597004A (zh) 2021-04-02

Family

ID=75192598

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011462193.4A Pending CN112597004A (zh) 2020-12-11 2020-12-11 Sql语句性能测试方法、装置、计算机设备和存储介质

Country Status (1)

Country Link
CN (1) CN112597004A (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102541884A (zh) * 2010-12-10 2012-07-04 ***通信集团贵州有限公司 数据库优化方法和装置
WO2018036549A1 (zh) * 2016-08-25 2018-03-01 中兴通讯股份有限公司 分布式数据库查询方法、装置及管理***
CN110221982A (zh) * 2019-06-17 2019-09-10 深圳前海微众银行股份有限公司 业务***的性能测试方法、装置、设备及可读存储介质
CN110555030A (zh) * 2018-03-28 2019-12-10 北京京东尚科信息技术有限公司 一种sql语句的处理方法和装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102541884A (zh) * 2010-12-10 2012-07-04 ***通信集团贵州有限公司 数据库优化方法和装置
WO2018036549A1 (zh) * 2016-08-25 2018-03-01 中兴通讯股份有限公司 分布式数据库查询方法、装置及管理***
CN110555030A (zh) * 2018-03-28 2019-12-10 北京京东尚科信息技术有限公司 一种sql语句的处理方法和装置
CN110221982A (zh) * 2019-06-17 2019-09-10 深圳前海微众银行股份有限公司 业务***的性能测试方法、装置、设备及可读存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
刘光霆 等: "ORACLE中SQL执行原理及性能优化研究", 计算机应用与软件, no. 06 *
王丽娟 等: "基于MySQL的查询优化技术研究", 电脑知识与技术, no. 30 *

Similar Documents

Publication Publication Date Title
CN114398239B (zh) 日志监控方法、装置、计算机设备及存储介质
CN107038222B (zh) 数据库缓存实现方法及其***
CN112540811B (zh) 缓存数据的检测方法、装置、计算机设备和存储介质
EP3416065B1 (en) Query method and query device
CN111459698A (zh) 一种数据库集群故障自愈方法及装置
US11809406B2 (en) Event records in a log file
CN107797916B (zh) Ddl语句审核方法和装置
CN114911830B (zh) 基于时序数据库的索引缓存方法、装置、设备及存储介质
CN113127519B (zh) 文件的查询方法、装置、计算机设备及存储介质
GB2574282A (en) Data consistency verification method and system minimizing load of original database
CN115576999B (zh) 基于云平台的任务数据处理方法、装置、设备及存储介质
CN112667630A (zh) 整合业务报表的方法、装置、设备以及存储介质
CN115269631A (zh) 数据查询方法、数据查询***、设备及存储介质
CN112948504B (zh) 数据采集方法、装置、计算机设备和存储介质
CN111191443A (zh) 基于区块链的敏感词检测方法、装置、计算机设备和存储介质
CN112597004A (zh) Sql语句性能测试方法、装置、计算机设备和存储介质
CN112507129B (zh) 配电网作业文件的内容变动处理方法及相关设备
CN115934487A (zh) 日志监控告警方法、装置、计算机设备和存储介质
CN116089446A (zh) 一种结构化查询语句的优化控制方法及装置
CN114385656A (zh) 脚本检测方法、装置、计算机设备及存储介质
CN113672457A (zh) 识别数据库中的异常操作的方法和装置
CN113821517A (zh) 数据同步方法、装置、设备及存储介质
CN112131462A (zh) 一种基于信息监测的关键词发现方法、***和电子设备
CN116431677B (zh) 基于内存数据库的数据路由方法、***和可读存储介质
CN116108486B (zh) 一种实现dlp快速检测的***及方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination