CN114356966B - 数据库语句的处理方法及装置 - Google Patents
数据库语句的处理方法及装置 Download PDFInfo
- Publication number
- CN114356966B CN114356966B CN202210274491.3A CN202210274491A CN114356966B CN 114356966 B CN114356966 B CN 114356966B CN 202210274491 A CN202210274491 A CN 202210274491A CN 114356966 B CN114356966 B CN 114356966B
- Authority
- CN
- China
- Prior art keywords
- statement
- database
- data
- inline view
- target data
- 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.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开提供了一种数据库语句的处理方法及装置。该方法包括:获取第一数据库语句,所述第一数据库语句用于在数据库中对目标数据执行第一操作,所述第一操作包括插入、删除和/或更新操作;对所述第一数据库语句进行分离操作,得到第二数据库语句,所述第二数据库语句包括内联视图和外层语句,所述内联视图用于输出所述目标数据,所述外层语句用于对所述目标数据执行所述第一操作;对所述第二数据库语句中的所述内联视图进行等价查询改写,得到第三数据库语句;基于所述第三数据库语句对应的执行计划,确定目标执行计划。
Description
技术领域
本公开涉及数据库技术领域,并且更具体地,涉及一种数据库语句的处理方法及装置。
背景技术
数据库系统通常需要对数据库语句(如结构化查询语言(structured querylanguage,SQL)语句)进行等价改写,产生一个更优的数据库语句写法,从而产生一个更好的执行计划,降低数据库语句的执行耗时。
数据库语句可以包括查询语句和增删改语句(如插入语句、删除语句和更新语句)。目前,相关技术中已经提出了很多针对查询语句的改写策略,以使查询语句能够产生更优的执行计划,提升查询的性能。为了使增删改语句也能产生更优的执行计划,也需要对增删改语句进行改写。一种简单的方式是通过复用查询语句的改写策略,对增删改语句进行改写。
但是,某些查询改写策略会引入一些特别的语法,而这些特别的语法是增删改语句不支持的语法,导致增删改语句不能进行改写,从而不能产生更优的执行计划。
发明内容
本公开提供一种数据库语句的处理方法及装置,以解决上述问题。
第一方面,提供一种数据库语句的处理方法,包括:获取第一数据库语句,所述第一数据库语句用于在数据库中对目标数据执行第一操作,所述第一操作包括插入、删除和/或更新操作;对所述第一数据库语句进行分离操作,得到第二数据库语句,所述第二数据库语句包括内联视图和外层语句,所述内联视图用于输出所述目标数据,所述外层语句用于对所述目标数据执行所述第一操作;对所述第二数据库语句中的所述内联视图进行等价查询改写,得到第三数据库语句;基于所述第三数据库语句对应的执行计划,确定目标执行计划。
在一种可能的实现方式中,所述第一操作为更新操作,所述内联视图包括用于确定更新后的数据的表达式,所述内联视图输出的数据还包括所述更新后的数据。
在一种可能的实现方式中,所述外层语句包括所述目标数据所在的数据库表,所述数据库表的主键以及所述内联视图输出的所述目标数据中的主键用于确定所述目标数据在所述数据库表中的行。
在一种可能的实现方式中,所述第一数据库语句为SQL语句。
第二方面,提供一种数据库语句的处理装置,包括:获取模块,用于获取第一数据库语句,所述第一数据库语句用于在数据库中对目标数据执行第一操作,所述第一操作包括插入、删除和/或更新操作;分离模块,用于对所述第一数据库语句进行分离操作,得到第二数据库语句,所述第二数据库语句包括内联视图和外层语句,所述内联视图用于输出所述目标数据,所述外层语句用于对所述目标数据执行所述第一操作;改写模块,用于对所述第二数据库语句中的所述内联视图进行等价查询改写,得到第三数据库语句;确定模块,用于基于所述第三数据库语句对应的执行计划,确定目标执行计划。
在一种可能的实现方式中,所述第一操作为更新操作,所述内联视图包括用于确定更新后的数据的表达式,所述内联视图输出的数据还包括所述更新后的数据。
在一种可能的实现方式中,所述外层语句包括所述目标数据所在的数据库表,所述数据库表的主键以及所述内联视图输出的所述目标数据中的主键用于确定所述目标数据在所述数据库表中的行。
在一种可能的实现方式中,所述第一数据库语句为SQL语句。
第三方面,提供一种数据库语句的处理装置,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面或第一方面中任一可能的实现方式中所述的方法。
第四方面,提供一种计算机可读存储介质,其上存储有可执行代码,当所述可执行代码被执行时,能够实现如第一方面或第一方面中任一可能的实现方式中所述的方法。
第五方面,提供一种计算机程序产品,包括可执行代码,当所述可执行代码被执行时,能够实现如第一方面或第一方面中任一可能的实现方式中所述的方法。
本公开实施例将第一数据库语句(即增删改语句)先进行分离操作,分离为内联视图和外层语句,外层语句用于对内联视图输出的数据进行插入、删除和/或更新操作。进一步地,通过对内联视图进行等价查询改写,实现对增删改语句的改写。因此,通过分离操作可以将对增删改语句的改写转变为对内联视图的查询改写,由于内联视图为查询语句,自然可以支持各种查询改写策略。由于所有针对查询语句的改写策略都可以应用到增删改语句中,从而使得增删改语句可以获得更大的优化空间,生成更好的执行计划。
附图说明
图1是可应用于本公开实施例的数据库系统的结构示意图。
图2是本公开实施例提供的一种数据库语句的处理方法的示意性流程图。
图3是本公开实施例提供的另一种数据库语句的处理方法的示意性流程图。
图4是本公开实施例提供的一种数据库语句的改写流程的示意图。
图5是本公开实施例提供的一种数据库语句的处理装置的示意性结构图。
图6是本公开实施例提供的另一种数据库语句的处理装置的示意性结构图。
具体实施方式
下面将结合本公开实施例的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本公开一部分实施例,而不是全部的实施例。
图1是本公开实施例提供的一种数据库系统的示意图。该数据库系统100可以为一个服务器或由多个服务器组成的服务器集群。该数据库系统100可以包括数据库130和数据库管理系统(databasemanagementsystem,DBMS)120。根据数据库支持的数据库语言的不同,数据库语句会有所不同。例如,不同的数据库可以使用不同标准的SQL语句。下文以SQL语句为例进行描述。
数据库可以指存储在数据存储器中的有组织的数据集合,即按照一定的数据模型组织、存储和使用的相关联的数据集合。数据存储器可以为固态硬盘、磁盘阵列或其他类别的非瞬态计算机可读介质。该数据库例如可以为关系型数据库,如该数据库可以包括一个或多个表数据。
关系型数据库是支持关系模型的数据库系统,一般采用二维表结构的存储方式,数据以行和/或列的方式进行存储。关系型数据库按照结构化的方法存储数据,每个数据表对各个字段定义好(也就是先定义好表的结构),再根据表的结构存入数据,这样做的好处就是由于数据的形式和内容在存入数据之前就已经定义好了,所以整个数据表就可以变得很清晰、一目了然,要读取和查询都十分方便,且可靠性和稳定性也比较高。为方便描述,下文将数据库中的数据集称为表或数据库表。
根据存储原理的不同,关系型数据库可以为分布式关系型数据或者非分布式关系型数据库。
DBMS用于建立、使用和维护数据库,以及对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户可以通过DBMS访问数据库中的数据。例如,用户可以通过DBMS修改或查询数据库中的数据。DBMS可以是关系型数据库管理系统(relationaldatabasemanagementsystem,RDBMS)。
在进行数据访问时,用户可以使用数据库语句访问数据库系统。数据库语句可以是SQL语句。通常,SQL是指专门用于管理关系型数据库中保存的数据的专用编程语言。SQL可以指代各种类型的数据相关语言,包括例如数据定义语言和数据操纵语言,其中SQL的范围可以包括数据插入、查询、更新和删除,模式创建和修改以及数据访问控制。此外,在一些示例中,SQL可以包括与各种语言元素相关的描述,包括子句(clause),表达式(expression),谓词(predicate),查询(query)和语句(statement)。其中,表达式可以被配置为产生包括数据列和/或行的标量值(scalar value)和/或表。谓词(Predicate,PRED)是计算结果为逻辑值(比如TRUE、FALSE、UNKNOWN)的逻辑表达式,可以用于描述对象之间的连接关系。比如,在SELECT查询语句中,在WHERE子句和HAVING子句中的过滤条件可以理解为指定谓词。举例来说,对于SQL语句{select*from A,B where A.a=1 and A.a<B.b},A.a=1 andA.a<B.b指定了该查询语句的结果集中的行需要满足的条件,所以是该查询语句的谓词。
SQL语句可以包括查询语句、插入语句、删除语句和更新语句(或称为修改语句)等。查询语句为SELECT语句,用于从数据库中查询一行或多行数据。插入语句为INSERT语句,用于在数据库中插入新的一行或多行数据。删除语句为DELETE语句,用于删除数据库中的一行或多行数据。更新语句为UPDATE语句,用于修改数据库中的一行或多行数据。为方便描述,下文将用于进行插入数据、删除数据和/或更新数据的语句统称为增删改语句。
以查询语句为例,数据库管理系统120可以从数据库客户端110接收SQL查询语句。通常,数据库管理系统通过通信接口,比如应用程序接口(application programminginterface,API)或者以太网接口等网络接口接收客户端110的查询语句,从数据库访问相关数据并操纵相关数据以生成查询所对应的查询结果,并将查询结果通过上述通信接口返回到数据库客户端。
客户端110可以包括被配置成与数据库管理系统交互的任何类型的设备或应用程序。在一些示例中,客户端可以包括一个或多个应用服务器。
数据库管理系统120可以包括解析器、优化器、执行器和存储引擎。解析器用于执行对客户端提交的查询语句的语法、语义分析,将查询中的视图展开、划分为小的查询块。优化器为查询语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,比较执行计划的代价,最终选择一个最优的执行计划。执行器依照查询语句的执行计划进行操作,以产生查询结果。存储引擎负责管理表的数据、索引的实际内容,同时也会管理运行时的Cache、Buffer、事务、Log等数据。例如存储引擎可以将执行引擎的执行结果通过物理输入/输出(input/output,I/O)写入数据存储器。
用户在对数据库进行数据操作(如数据查询操作)时,可以向数据库管理系统发送SQL语句。执行计划可以理解为数据库执行SQL语句的具体步骤,例如,是通过索引还是全表扫描的方式来访问数据库中的数据,或连接查询的实现方式和连接顺序等。
为了扩大执行计划的搜索空间,获得更优的执行计划。优化器需要对SQL语句进行等价改写,产生一个更优的SQL写法,从而生成一个更好的执行计划,降低SQL的执行耗时。等价改写是将一种SQL语句改写为另一种SQL语句。改写前后的SQL语句的写法不同,但两者的执行结果一致。
目前,相关技术中已经提出了很多针对查询语句的改写策略,以使查询语句能够产生更优的执行计划,提升查询的性能。为了使增删改语句也能产生更优的执行计划,也需要对增删改语句进行改写。一种简单的方式是通过复用查询语句的改写策略,对增删改语句进行改写。但是,某些查询改写策略会引入一些特别的SQL语法,而这些特别的语法是增删改语句不支持的语法,导致增删改语句不能进行改写,从而不能产生更优的执行计划。
下面以分组上拉改写和Win Magic改写为例进行举例说明。所谓分组上拉,指的是将一个内联视图中的分组操作上拉到外层查询块中。其中,内联视图可以理解为数据库查询语句中的一个子语句。当数据库语句中包括内联视图时,内联视图中的SELECT语句先被执行,得到一个结果集;然后由外层语句对内联视图的结果进行操作。所谓Win Magic改写,指的是将一个特定子查询改写成窗口函数。分组上拉改写会在SQL语句中引入分组操作,Win Magic改写会在SQL语句中引入窗口函数。而分组操作和窗口函数仅能出现在查询语句中,不能出现在增删改语句中。这导致这些改写策略仅能支持查询语句的改写,不能支持增删改语句的改写。上述限制将导致增删改语句损失一些改写可能,进而生成更差的执行计划,增加SQL的执行耗时。
为了对增删改语句进行优化,相关技术中提出了一些改写策略,使得数据库可以支持UPDATE/DELETE语句的OR展开优化。相关技术是在执行计划生成的过程中,将一个OR谓词拆分成了多个谓词,每个谓词生成一个基表扫描算子。每个基表扫描算子可以使用不同的索引对谓词进行优化。最后再把所有基表扫描读取到的数据进行合并,得到原始OR谓词需要查询的数据集。本质上,上述技术是在计划生成的过程中对OR谓词进行展开来优化的。这么做的缺点有如下两个:
1、该方案不具备泛化能力,仅能实现OR展开这一种策略,无法很直接地推广到其他查询改写策略上。例如,GROUP BY上拉改写,Win Magic改写等。
2、在计划生成过程中进行OR展开无法直接重用改写部分的代码,需要在改写模块和优化模块中分别实现这种优化策略。
因此,需要设计一种通用的改写方案,能够让针对查询语句设计的改写策略同样可以应用到增删改类SQL语句中。
为了解决上述问题,本公开实施例将增删改语句先进行分离操作,分离为内联视图和外层语句,外层语句用于对内联视图输出的数据进行插入、删除和/或更新操作。进一步地,通过对内联视图进行等价查询改写,实现对增删改语句的改写。因此,通过分离操作可以将对增删改语句的改写转变为对内联视图的查询改写,由于内联视图为查询语句,自然可以支持各种查询改写策略。另外,该方法对每个查询改写而言是透明的,不需要对查询改写策略进行额外的改造或者适配,可以直接复用现有的查询改写策略。由于所有针对查询语句的改写策略都可以应用到增删改语句中,从而使得增删改语句可以获得更大的优化空间,生成更好的执行计划。
图2是本公开实施例提供的数据库语句的处理方法。图2所示的方法可以由数据库管理系统执行,如数据库管理系统中的优化器执行。该数据库可以是普通数据库,也可以是分布式数据库。例如,用户可以利用数据库语句向数据库中插入数据,或者删除数据库中的数据,或者修改数据库中的数据。这里提及的数据库查询语句例如可以是SQL语句。该数据库中可以存储有一个或多个数据集合。该数据集合通常表现为数据库表的形式。
参见图2,在步骤S210、获取第一数据库语句。该第一数据库语句可用于在数据库中对目标数据执行第一操作。其中,第一操作包括插入、删除和/或更新操作。
第一数据库语句可以为用户输入的原始数据库语句。第一数据库语句可以为上文描述的插入语句、删除语句或更新语句。插入语句用于在数据库中插入目标数据。删除语句用于删除数据库中的目标数据。更新语句用于修改数据库中的目标数据。当然,第一数据库语句还可以为其他语句,例如,合并语句(MERGE语句)。目标数据可以指数据库表中的一行或多行数据。
如果第一操作为插入操作,则目标数据可以为需要插入的数据。如果第一操作为删除操作,则目标数据为数据库中需要删除的数据。如果第一操作为更新操作,则目标数据可以为数据库中需要更新的数据,如更新前的数据。
以更新语句为例,该更新语句的具体形式可以如下(称为UPDATE语句1):
UPDATE T1 SET VAL = VAL + 1 WHERE C1 = 1 OR C2 = 2.
上述语句的含义可以理解为:将T1表中满足“C1 = 1 OR C2 = 2”的行中的VAL修改VAL + 1。目标数据为满足“C1 = 1 OR C2 = 2”的数据。
在步骤S220、对第一数据库语句进行分离操作,得到第二数据库语句。该第二数据库语句包括内联视图和外层语句。内联视图和外层语句需要满足以下要求:内联视图用于输出目标数据,外层语句用于对内联视图输出的目标数据执行第一操作。
可以理解的是,第二数据库语句与第一数据库语句在语义上是等价的。分离操作也可以理解为等价改写。外层语句对应的操作与第一数据库语句对应的操作一致,即外层语句可用于描述第一操作。第一数据库语句的语义是对目标数据执行插入、删除和/或更新操作,而第二数据库语句的语义是通过内联视图先查找到需要操作的目标数据,然后由外层语句对查找到的目标数据执行插入、删除和/或更新操作,因此,第一数据库语句和第二数据库语句在语义上是一致的,即分离前后两者的语义是完全等价的。
以上述UPDATE语句1为例,对UPDATE语句1进行分离操作后,得到的第二数据库语句可以表示为如下形式(称为UPDATE语句2):
UPDATE
(SELECT PK, C1, C2, VAL, VAL + 1 AS NEW_VAL
FROM T1
WHERE C1 = 1 OR C2 = 2) V
SET V.VAL = V.NEW_VAL.
其中,括号内的SELECT语句为内联视图,括号外的UPDATE语句为外层语句。其中,PK表示T1表的主键或隐藏主键。需要说明的是,上述UPDATE语句2仅是一种可能的语句表现形式,实际的语句可能会有其他的表现形式,只要分离后的第二数据库语句能够满足上文描述的语义要求即可。
经过上述分离操作后,原始的UPDATE语句1拆分成了两部分,内层(即内联视图V)描述了从T1表读取满足“C1 = 1 OR C2 = 2”的行。内联视图V用于输出满足“C1 = 1 OR C2= 2”的行的数据。外层描述了UPDATE行为,该UPDATE用于执行SET V.VAL = V.NEW_VAL操作。
从分离前后的数据库语句可以看出,经过分离操作后,OR谓词从UPDATE语句中移动到了SELECT语句中。
如果第一操作为插入操作,则内联视图输出的数据可以包括需要插入的数据。如果第一操作为删除操作,则内联视图输出的数据可以包括需要删除的数据。如果第一操作为更新操作,则内联视图输出的数据可以包括需要更新的数据。
当然,内联视图除了用于输出上述数据之外,还可以输出其他的数据。作为一个示例,对于更新操作,内联视图还用于输出更新后的数据,也就是说,内联视图不仅可以输出数据库中需要更新的原始行数据,还可以输出每个原始行更新之后的新行数据。这样,外层语句可以根据内联视图输出的原始行数据和新行数据,进行数据的更新。
以上述UPDATE语句2为例,内联视图不仅输出T1表中满足“C1 = 1 OR C2 = 2”的行的数据,还输出更新后的数据(即VAL + 1)。也就是说,内联视图中包括用于确定更新后的数据的表达式。在一些实施例中,更新后的数据是通过表达式计算得到的,将该表达式移动到内联视图中,可以使得该表达式有更好的改写机会,即在内联视图中的该表达式可以支持任意一种查询语句的改写策略,从而可以得到更好的改写机会,生成更好的执行计划。
作为另一个示例,内联视图输出的数据不仅可以包括数据库中需要操作的原始行数据,还可以包括其他不需要操作的数据。在该情况下,外层语句可以针对内联视图输出的数据进行数据的过滤,从而过滤掉其他不需要操作的数据。举例说明,假设第一数据库语句用于对数据库中第一行的数据进行更新操作,则内联视图输出的数据不仅可以包括第一行的数据,还可以包括第二行的数据。外层语句可以对内联视图输出的数据进行过滤,以过滤掉第二行的数据,而保留第一行的数据,从而实现对第一行数据的更新。当然,数据的过滤操作也可以完全由内联视图来执行,外层语句不进行数据的过滤操作,而仅执行数据的插入、删除和/或更新操作。
外层语句除了描述第一操作之外,还可以包括目标数据所在的数据库表,即外层语句需要准确地描述待操作的目标表,该目标表为数据库中的实体表。以上述UPDATE语句2为例,外层语句还可以包括T1表的信息。目标数据所在的数据库表的主键以及内联视图输出的目标数据中的主键可用于确定目标数据在数据库表中的行,即确定第一操作针对的是数据库表中的哪行。仍以UPDATE语句2为例,T1中的主键以及V.PK可用于确定T1表中待操作的目标行。在获得T1表、T1表的主键以及V.PK后,优化器可以生成对应的更新算子,以将T1表中主键为V.PK的行进行更新。
在一些实施例中,分离后的外层语句和内联视图需要满足以下两个要求:
1、外层语句包括待操作的目标表信息,以及根据内联视图输出的结果构造的目标行的信息。对于更新操作,外层语句还可以包括根据内联视图输出的结果构造的新行的信息。根据上述信息,优化器可以生成对应的增删改算子,以进行正确的增删改操作。
2、内联视图需要准确地输出目标数据。对于更新操作,内联视图还需要准确地输出更新操作产生的新行数据。
在步骤S230、对第二数据库语句中的内联视图进行等价查询改写,得到第三数据库语句。
由于内联视图为查询语句,自然就可以在内联视图上进行任意的查询改写。该查询改写可以使用任意一种查询语句的改写策略。例如,该查询改写可以为OR展开改写,或者可以为GROUP BY上拉改写,或者也可以为Win Magic改写等。
举例说明,在对上述UPDATE语句2中的内联视图进行OR展开后,得到的第三数据库语句可以表示为如下形式(称为UPDATE语句3):
UPDATE
(SELECT PK, C1, C2, VAL, VAL + 1 AS NEW_VAL
FROM T1 WHERE C1 = 1
UNION ALL
SELECT PK, C1, C2, VAL, VAL + 1 AS NEW_VAL
FROM T1 WHERE LNNVL(C1 = 1) AND C2 = 2) V
SET V.VAL = V.NEW_VAL.
该UPDATE语句3是通过将UPDATE语句2中的内联视图进行了OR展开改写生成的。
在步骤S240、基于第三数据库语句对应的执行计划,确定目标执行计划。
本公开实施例对目标执行计划的确定方式不做具体限定。作为一个示例,可以直接将第三数据库语句对应的执行计划作为目标执行计划。
作为另一个示例,可以根据第一数据库语句和第三数据库语句对应的执行计划,确定目标执行计划。例如,可以比较第一数据库语句和第三数据库语句对应的执行计划的代价大小,将代价较小的执行计划作为目标执行计划。
下面结合图3,对本公开实施例的数据库语句的处理方法进行详细描述。
首先,接收用户输入的增删改语句310。进一步地,数据库管理系统可以对该数据库语句进行分离操作,得到的分离后的数据库语句。分离后的数据库语句320可以包括内联视图和基于内联视图的外层语句。该外层语句可用于描述增删改操作。得到内联视图后,在内联视图上执行任意的查询改写,得到改写后的内联视图。最终得到的改写后的数据库语句330可以包括改写后的内联视图和基于改写后的内联视图的外层语句。
数据库语句的改写,通常是在数据库语句解析后,对解析后的抽象语法树进行改写。抽象语法树可以理解为数据库语句在数据库中的内部表示结构。数据库语句的改写过程可以如图4所示。
数据库语句1为用户输入的原始SQL语句。数据库管理系统可以对数据库语句1进行解析,得到抽象语法树1,简称为状态1(statement,STMT1)。对STMT1进行分离操作后,得到STMT1’。在对STMT1’进行查询改写后,得到STMT2。进一步地,数据库管理系统可以分别生成STMT1和STMT2对应的执行计划1和执行计划2。本公开实施例的方案就是对第一数据库语句对应的抽象语法树进行的改写。上文描述的UPDATE语句2和UPDATE语句3分别为STMT1’和STMT2的一种可能的语句表现形式,UPDATE语句2和UPDATE语句3仅是为了方便理解而表示的数据库语句。在一些情况下,STMT1’和STMT2不一定能写出对应的数据库语句。
上述UPDATE语句2的抽象语法树可以描述为:
UPDATE
目标表:T1;
更新操作:对主键为 V.PK 的行将 VAL 列更新为 NEW_VAL;
读取:V;
过滤条件:空。
V 的定义
读取 T1;
输出: PK, C1, C2, VAL, NEW_VAL;
过滤: C1 = 1 OR C2 = 2。
下面以OR展开改写和分组上拉改写为例,对增删改语句的改写进行举例说明。
示例一、OR展开改写
原始数据库语句为:
UPDATE T1 SET VAL = VAL + 1 WHERE C1 = 1 OR C2 = 2.
在尝试OR展开改写时,数据库管理系统首先会通过分离操作产生类似于如下的内部表示结构:
UPDATE
(SELECT PK, C1, C2, VAL, VAL + 1 AS NEW_VAL
FROM T1
WHERE C1 = 1 OR C2 = 2) V
SET V.VAL = V.NEW_VAL.
在进行分离操作后,数据库管理系统会对内联视图V尝试进行OR展开改写,产生类似于如下的内部表示结构:
UPDATE
(SELECT PK, C1, C2, VAL, VAL + 1 AS NEW_VAL
FROM T1 WHERE C1 = 1
UNION ALL
SELECT PK, C1, C2, VAL, VAL + 1 AS NEW_VAL
FROM T1 WHERE LNNVL(C1 = 1) AND C2 = 2) V
SET V.VAL = V.NEW_VAL.
最后,优化器会生成如下的执行计划:
============================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
--------------------------------------------
|0 |UPDATE | |2 |218 |
|1 | SUBPLAN SCAN|VIEW1 |2 |183 |
|2 | UNION ALL | |2 |183 |
|3 | TABLE SCAN|T1(IDX_C1)|1 |92 |
|4 | TABLE SCAN|T1(IDX_C2)|1 |92 |
============================================
Outputs & filters:
-------------------------------------
0 - output(nil), filter(nil), table_columns([{T1: ({T1:(VIEW1.T1.PK, VIEW1.T1.C1, VIEW1.T1.C2, VIEW1.T1.VAL)})}]),
update([VIEW1.T1.VAL=column_conv(NUMBER,PS:(-1,0),NULL,VIEW1.T1.VAL + 1)])
1 - output([VIEW1.T1.PK], [VIEW1.T1.VAL], [VIEW1.T1.C1],[VIEW1.T1.C2]), filter(nil),
access([VIEW1.T1.PK], [VIEW1.T1.VAL], [VIEW1.T1.C1],[VIEW1.T1.C2])
2 - output([UNION([1])], [UNION([2])], [UNION([3])], [UNION([4])]),filter(nil)
3 - output([T1.PK], [T1.VAL], [T1.C1], [T1.C2]), filter(nil),
access([T1.PK], [T1.VAL], [T1.C1], [T1.C2]), partitions(p0)
4 - output([T1.PK], [T1.VAL], [T1.C1], [T1.C2]), filter([lnnvl(cast(T1.C1 = 1, TINYINT(-1, 0)))]),
access([T1.PK], [T1.VAL], [T1.C1], [T1.C2]), partitions(p0).
示例二、分组上拉改写
原始数据库语句为:
UPDATE T1,
(SELECT C1, MAX(T2.C2) AS NEW_VAL
FROM T2
GROUP BY C1) TMP
SET T1.VAL = TMP.NEW_VAL
WHERE T1.C1 = TMP.C1 AND T1.PK > 1 AND T1.PK < 10.
在尝试分组上拉改写时,数据库管理系统首先会通过分离操作产生类似于如下的内部表示结构:
UPDATE
(SELECT T1.PK, T1.C1, T1.VAL, TMP.VAL AS NEW_VAL
FROM T1,
(SELECT C1, MAX(T2.C2) AS VAL
FROM T2
GROUP BY C1) TMP
WHERE T1.C1 = TMP.C1 AND T1.PK > 1 AND T1.PK < 10) V
SET V.VAL = V.NEW_VAL.
在进行分离操作后,数据库管理系统会对内联视图V尝试进行分组上拉改写,产生类似于如下的内部表示结构:
UPDATE
(SELECT T1.PK, T1.C1, T1.VAL, MAX(T2.C2) AS NEW_VAL
FROM T1, T2
WHERE T1.C1 = T2.C1 AND T1.PK > 1 AND T1.PK < 10
GROUP BY T1.PK) V
SET V.VAL = V.NEW_VAL.
最后,优化器会生成如下执行计划:
===================================================
|ID|OPERATOR |NAME |EST. ROWS|COST |
---------------------------------------------------
|0 |UPDATE | |1 |60550|
|1 | SUBPLAN SCAN |VIEW1 |1 |60518|
|2 | MERGE GROUP BY | |1 |60518|
|3 | NESTED-LOOP JOIN| |7920 |60115|
|4 | TABLE SCAN |t1 |8 |46 |
|5 | TABLE SCAN |t2(idx_c1)|990 |7280 |
===================================================
Outputs & filters:
-------------------------------------
0 - output(nil), filter(nil), table_columns([{t1: ({t1:(VIEW1.t1.pk, VIEW1.t1.c1, VIEW1.t1.c2, VIEW1.t1.val)})}]),
Update([VIEW1.t1.val=column_conv(INT,PS:(11,0),NULL,VIEW1.TMP.NEW_VAL)])
1 - output([VIEW1.t1.pk], [VIEW1.t1.val], [VIEW1.TMP.NEW_VAL],[VIEW1.t1.c1], [VIEW1.t1.c2]), filter(nil),
access([VIEW1.t1.pk], [VIEW1.t1.val], [VIEW1.TMP.NEW_VAL],[VIEW1.t1.c1], [VIEW1.t1.c2])
2 - output([t1.pk], [t1.val], [T_FUN_MAX(t2.c2)], [t1.c1],[t1.c2]), filter(nil),
group([t1.pk]), agg_func([T_FUN_MAX(t2.c2)])
3 - output([t1.pk], [t1.val], [t1.c1], [t1.c2], [t2.c2]), filter(nil),
conds(nil), nl_params_([t1.c1])
4 - output([t1.pk], [t1.val], [t1.c1], [t1.c2]), filter(nil),
access([t1.pk], [t1.val], [t1.c1], [t1.c2]), partitions(p0)
5 - output([t2.c2]), filter(nil),
access([t2.c2]), partitions(p0).
上文结合图1至图4,详细描述了本公开的方法实施例,下面结合图5和图6,详细描述本公开的装置实施例。应理解,装置实施例的描述与方法实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。
图5是本公开实施例提供的数据库语句的处理装置的结构示意图。该装置500可应用于关系型数据库。该装置500可以为数据库中的优化器。装置500包括获取模块510、分离模块520、改写模块530和确定模块540。下面分别对这些模块的功能进行介绍。
获取模块510,用于获取第一数据库语句,所述第一数据库语句用于在数据库中对目标数据执行第一操作,所述第一操作包括插入、删除和/或更新操作。
分离模块520,用于对所述第一数据库语句进行分离操作,得到第二数据库语句,所述第二数据库语句包括内联视图和外层语句,所述内联视图用于输出所述目标数据,所述外层语句用于对所述目标数据执行所述第一操作。
改写模块530,用于对所述第二数据库语句中的所述内联视图进行等价查询改写,得到第三数据库语句。
确定模块540,用于基于所述第三数据库语句对应的执行计划,确定目标执行计划。
在一些实施例中,所述第一操作为更新操作,所述内联视图包括用于确定更新后的数据的表达式,所述内联视图输出的数据还包括所述更新后的数据。
在一些实施例中,所述外层语句包括所述目标数据所在的数据库表,所述数据库表的主键以及所述内联视图输出的所述目标数据中的主键用于确定所述目标数据在所述数据库表中的行。
可选地,所述第一数据库语句为SQL语句。
图6是本公开实施例提供的另一种数据库语句的处理装置的结构示意图。图6所述的管理数据库装置600可以包括存储器610和处理器620,存储器610可以用于存储可执行代码。处理器620可以用于执行存储器610中存储的可执行代码,以实现前文描述的各个方法中的步骤。在一些实施例中,该装置600还可以包括网络接口630,处理器620与外部设备的数据交换可以通过该网络接口630实现。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够读取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储装置。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,数字通用光盘(digital video disc,DVD))或者半导体介质(例如,固态硬盘(solid state disk,SSD))等。
以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。
Claims (9)
1.一种数据库语句的处理方法,包括:
获取第一数据库语句,所述第一数据库语句用于在数据库中对目标数据执行第一操作,所述第一操作包括插入、删除和/或更新操作;
对所述第一数据库语句进行分离操作,得到第二数据库语句,所述第二数据库语句包括内联视图和外层语句,所述内联视图用于输出所述目标数据,所述外层语句用于对所述目标数据执行所述第一操作;
对所述第二数据库语句中的所述内联视图进行等价查询改写,得到第三数据库语句;
基于所述第三数据库语句对应的执行计划,确定目标执行计划。
2.根据权利要求1所述的方法,所述第一操作为更新操作,所述内联视图包括用于确定更新后的数据的表达式,所述内联视图输出的数据还包括所述更新后的数据。
3.根据权利要求1所述的方法,所述外层语句包括所述目标数据所在的数据库表,所述数据库表的主键以及所述内联视图输出的所述目标数据中的主键用于确定所述目标数据在所述数据库表中的行。
4.根据权利要求1所述的方法,所述第一数据库语句为结构化查询语言SQL语句。
5.一种数据库语句的处理装置,包括:
获取模块,用于获取第一数据库语句,所述第一数据库语句用于在数据库中对目标数据执行第一操作,所述第一操作包括插入、删除和/或更新操作;
分离模块,用于对所述第一数据库语句进行分离操作,得到第二数据库语句,所述第二数据库语句包括内联视图和外层语句,所述内联视图用于输出所述目标数据,所述外层语句用于对所述目标数据执行所述第一操作;
改写模块,用于对所述第二数据库语句中的所述内联视图进行等价查询改写,得到第三数据库语句;
确定模块,用于基于所述第三数据库语句对应的执行计划,确定目标执行计划。
6.根据权利要求5所述的装置,所述第一操作为更新操作,所述内联视图包括用于确定更新后的数据的表达式,所述内联视图输出的数据还包括所述更新后的数据。
7.根据权利要求5所述的装置,所述外层语句包括所述目标数据所在的数据库表,所述数据库表的主键以及所述内联视图输出的所述目标数据中的主键用于确定所述目标数据在所述数据库表中的行。
8.根据权利要求5所述的装置,所述第一数据库语句为结构化查询语言SQL语句。
9.一种数据库语句的处理装置,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器被配置为执行所述可执行代码,以实现权利要求1-4中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210274491.3A CN114356966B (zh) | 2022-03-21 | 2022-03-21 | 数据库语句的处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210274491.3A CN114356966B (zh) | 2022-03-21 | 2022-03-21 | 数据库语句的处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114356966A CN114356966A (zh) | 2022-04-15 |
CN114356966B true CN114356966B (zh) | 2022-06-03 |
Family
ID=81094845
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210274491.3A Active CN114356966B (zh) | 2022-03-21 | 2022-03-21 | 数据库语句的处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114356966B (zh) |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103714058B (zh) * | 2012-09-28 | 2017-05-17 | Sap欧洲公司 | 用于数据库查询优化的方法以及使用该方法的系统 |
KR101432700B1 (ko) * | 2012-10-10 | 2014-08-25 | (주)티베로 | 쿼리의 최적화를 위한 방법 |
US11061901B2 (en) * | 2019-07-23 | 2021-07-13 | Oracle International Corporation | Influencing plan generation in the context of the two phase query optimization approach |
CN111026782B (zh) * | 2019-12-25 | 2024-02-06 | 上海达梦数据库有限公司 | 远程数据库对象的优化方法、装置、设备及存储介质 |
CN111813803B (zh) * | 2020-07-02 | 2023-07-21 | 上海达梦数据库有限公司 | 语句块执行计划的生成方法、装置、设备和存储介质 |
CN113656440A (zh) * | 2021-08-20 | 2021-11-16 | 中国工商银行股份有限公司 | 一种数据库语句优化方法、装置及设备 |
-
2022
- 2022-03-21 CN CN202210274491.3A patent/CN114356966B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN114356966A (zh) | 2022-04-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6278994B1 (en) | Fully integrated architecture for user-defined search | |
US5778354A (en) | Database management system with improved indexed accessing | |
US6098075A (en) | Deferred referential integrity checking based on determining whether row at-a-time referential integrity checking would yield the same results as deferred integrity checking | |
US6519597B1 (en) | Method and apparatus for indexing structured documents with rich data types | |
US6556986B2 (en) | Database management method of invoking a function retrieving index type definition, cataloging particular index which has not yet been supported by a database system | |
US8332389B2 (en) | Join order for a database query | |
US6338056B1 (en) | Relational database extender that supports user-defined index types and user-defined search | |
US8612421B2 (en) | Efficient processing of relational joins of multidimensional data | |
KR102177190B1 (ko) | 유연한 스키마를 사용한 데이터 관리 | |
JP3492247B2 (ja) | Xmlデータ検索システム | |
US20080256026A1 (en) | Method For Optimizing And Executing A Query Using Ontological Metadata | |
US7844633B2 (en) | System and method for storage, management and automatic indexing of structured documents | |
US6343286B1 (en) | Efficient technique to defer large object access with intermediate results | |
US8661022B2 (en) | Database management method and system | |
WO2020135613A1 (zh) | 数据查询处理方法、装置及系统、计算机可读存储介质 | |
CN110688397B (zh) | 一种基于sql的分布式数据统一访问系统及方法 | |
US8073843B2 (en) | Mechanism for deferred rewrite of multiple XPath evaluations over binary XML | |
US20110106836A1 (en) | Semantic Link Discovery | |
CN109885585B (zh) | 支持存储过程、触发器与视图的分布式数据库系统和方法 | |
CN110502532B (zh) | 远程数据库对象的优化方法、装置、设备和存储介质 | |
US20060161525A1 (en) | Method and system for supporting structured aggregation operations on semi-structured data | |
EP1195693A2 (en) | Defer dataset creation to improve system manageability for a database system | |
US9063957B2 (en) | Query systems | |
CN112231321A (zh) | 一种Oracle二级索引及索引实时同步方法 | |
CN111460000B (zh) | 一种基于关系型数据库的回溯数据查询方法及系统 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |