CN107250983B - 查询即时jit编译和执行的装置和方法 - Google Patents
查询即时jit编译和执行的装置和方法 Download PDFInfo
- Publication number
- CN107250983B CN107250983B CN201680010877.6A CN201680010877A CN107250983B CN 107250983 B CN107250983 B CN 107250983B CN 201680010877 A CN201680010877 A CN 201680010877A CN 107250983 B CN107250983 B CN 107250983B
- Authority
- CN
- China
- Prior art keywords
- cpu
- parameterized
- query
- function
- parameters
- 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
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/24—Querying
- G06F16/245—Query processing
- G06F16/2453—Query optimisation
- G06F16/24534—Query rewriting; Transformation
- G06F16/24542—Plan optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
- G06F9/4552—Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Operations Research (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本文所提供的实施例用于将参数化中间表示IR用于数据库查询执行引擎中的即时JIT编译。在一实施例中,一种支持在数据库管理系统中查询JIT编译和执行的方法包括:识别查询中的中央处理器密集函数,并在所述CPU密集函数中识别一个或者多个参数,其中,所述一个或者多个参数代表在不同查询实例中可以变化的值的变量;将所述CPU密集函数编译成包括所述一个或者多个参数的参数化IR;将所述CPU密集函数的参数化IR保存在参数化IR的目录中。
Description
相关申请案交叉申请
本申请要求于2015年4月15日递交的发明名称为“在数据库查询执行引擎中利用参数化中间表示进行即时编译的装置和方法”申请号为14/687,473的美国非临时专利申请案的权益和在先申请优先权,该在先申请的内容以引入的方式并入本文。
技术领域
本发明涉及数据库处理,在特定实施例中,涉及在数据库查询执行引擎中利用参数化中间表示进行即时编译的装置和方法。
背景技术
在现代数据系统中,例如通过采用固态磁盘(solid state drive,简称SSD)设备很大程度上避免了慢磁盘访问时,查询执行的中央处理器(central processing unit,简称CPU)的成本变得越来越关键。即时(Just-in-time,简称JIT)编译是用于提高数据库系统中CPU性能的方法。JIT编译指的是在程序执行的运行时间而不是执行之前进行的查询执行中的编译方案。因为在代码优化、本地代码生成以及编译后的代码的质量方面的有效性,低级虚拟机(low level virtual machine,简称LLVM)编译器的结构对于JIT编译是很好的候选。所述LLVM包括用于在运行时间生成特定查询函数的中间表示(intermediaterepresentation,简称IR)的组合函数(称作IRBuilder)。相比编译后的特定查询函数,所述LLVM可以更加高效地从所述IR生成优化的机器代码。但是LLVM IR在运行时间通过LLVMIRBuilder生成代码在时间和/或计算资源例如内存等方面代价较高且容易出错。或者可以利用LLVM提供的clang/clang++等工具将C/C++代码编译成LLVM IR。如果所述C/C++代码不是专门用于传入查询,该方法可能不会受益于JIT编译。因此需要一种更加高效地为查询的JIT编译生成IR的方案。
发明内容
根据一实施例,一种支持在数据库管理系统中查询即时(just-in-time,简称JIT)编译和执行的方法包括:识别查询中的中央处理器(central processing unit,简称CPU)密集函数,并且在所述CPU密集函数中识别一个或者多个参数。所述一个或者多个参数代表在不同查询实例中可以变化的值的变量。将所述CPU密集函数编译成包括所述一个或者多个参数的参数化中间表示(intermediate representation,简称IR)。将所述CPU密集函数的参数化IR保存在参数化IR的目录中。
根据另一实施例,一种支持在数据库管理系统中查询JIT编译和执行的方法包括:将CPU密集函数编译成包括一个或者多个参数的参数化IR。所述一个或者多个参数代表在不同的查询实例中可以变化的的值的变量。所述方法还包括:将所述CPU密集函数的参数化IR保存在参数化IR的目录中;并且在准备执行传入查询时,从目录加载参数化IR。在所述参数化IR中利用所述传入查询的变量的常数值替代所述一个或者多个参数;通过所述JIT编译利用替代所述一个或者多个参数的常数值编译所述参数化IR,以生成执行所述传入查询的机器代码。
根据又一实施例,一种用于数据库查询执行引擎的装置包括:至少一个处理器以及用于存储供所述至少一个处理器执行的程序的非瞬时性计算机可读取存储介质。所述程序包括指令,用于识别查询中CPU密集函数,并且在所述CPU密集函数中识别代表在不同查询实例中可以变化的值的变量的一个或者多个参数。所述程序还包括指令,用于将所述CPU密集函数编译成包括所述一个或者多个参数的参数化IR,并且将所述CPU密集函数的参数化IR保存在参数化IR的目录中。
上述宽泛地概括了本发明实施例的特征,以便能够更好理解以下本发明详细描述。以下将描述本发明实施例其他的特征和优势,其构成本发明权利要求书的主体。本领域的技术人员应当理解,所公开的概念和特定实施例易被用作修改或设计其他实现与本发明相同目的的结构或过程的基础。本领域的技术人员还应当意识到,这种等同构造不脱离所附权利要求书所阐述的本发明的精神和范围。
附图说明
为了更完整地理解本发明及其优点,现在参考下文结合附图进行的描述,其中:
图1示出一种在数据库管理系统中进行查询处理的框架;
图2示出针对查询函数生成参数化IR的方法实施例;
图3示出对查询函数的参数化IR进行JIT编译的方法实施例;
图4是一种能够用于实现不同实施例的处理系统的示意图。
除非另有指示,否则不同图中的对应标号和符号通常指代对应部分。绘制各图是为了清楚地说明实施例的相关方面,因此未必是按比例绘制的。
具体实施方式
下文将详细论述当前优选实施例的制作和使用。然而,应了解,本发明提供可在各种具体上下文中体现的许多适用的发明性概念。所论述的具体实施例仅仅说明用以实施和使用本发明的具体方式,而不限制本发明的范围。
本文所提供的系统和方法实施例用于将参数化中间表示(intermediaterepresentation,简称IR)用于数据库查询执行引擎中的即时(just-in-time,简称JIT)编译。具体地,对于规定的查询函数,例如由所述数据库执行引擎处理的处理器(或者CPU)密集函数,识别所述函数中针对特殊查询可能不变(固定)的变量。所述变量在不同的查询实例中有可以变化的值,因此可以用作查询的参数。所述CPU密集函数可以是要求更多处理资源例如时间、内存或者其他处理资源的函数。所述CPU密集函数可以通过CPU性能分析识别。所述识别的变量可以包括模式信息、表达式或者与所述变量相关的数据类型等。识别为不变量的变量可以提供更多的编译器优化,例如不可达代码去除、循环展开、常量折叠和传播、内联的虚函数调用或者通过函数指针进行调用。所述识别的变量均设置在CPU密集函数的IR模板中用作所述IR的参数。在利用IR编译器例如LLVM JIT编译器等进行JIT编译时,利用所述查询特殊信息的常数值替代所述IR中的参数,以生成用于执行的优化的机器代码。
这里称作参数化IR的带有参数的IR模板是从初始函数(翻译码)静态编译,并且所述IR可以与唯一ID和参数名一起保存在目录表中。所述参数化IR在准备执行特殊查询的运行时间加载,因此利用常数值替代所述IR中的参数以获得修改后的IR。然后,对所述修改后的IR进行JIT编译,以生成用于所述函数的本地机器代码。利用查询函数中的一组指令同时生成和编译参数化IR可以避免在运行时间为查询特殊IR函数代价较高且容易出错的逐条生成指令。通过保存参数化IR函数的通用版本,在运行时间加载所述IR,在向所述参数化IR添加查询特殊信息之后,对所述IR函数进程JIT编译,不需要在运行时间针对每个JIT编译生成C/C++代码。相比针对查询生成C/C++代码并且利用C/C++编译器对查询进行JIT编译,生成和编译参数化IR的方案更快。
图1示出一种在数据库管理系统中进行查询处理的框架100的示例。首先由解析函数110对SQL查询进行解析,然后由改写函数120以适合执行的形式相应改写。可以由计划函数130对改写查询进行分析,以确定其执行参数或设置,然后生成查询计划。执行函数140在本文也称作查询执行引擎,其用于执行改写查询计划。所述执行函数140包括以下三个步骤:准备执行器步骤141:分配运行时间数据结构,并且准备查询执行;运行执行器步骤142:以迭代的方式执行所述查询;结束执行器步骤143:释放运行时间数据结构,并且结束所述查询执行。上述函数可以通过在CPU或者合适的处理器上运行的软件实现。
在一实施例中,所述执行器140(所述数据库查询执行引擎)利用参数化IR实现JIT编译。图2示出针对查询函数生成参数化IR的方法200的流程图。所述方法包括:在查询执行引擎启动之前,利用参数(参数化IR)识别并准备IR模板。通过CPU性能分析(步骤210)识别可能受益于数据库查询执行引擎中JIT编译的CPU密集函数(步骤211)。CPU性能分析包括:利用函数追踪之前运行的查询中的CPU性能,以确定随着时间的推移CPU利用率的百分比和/或其他CPU资源或者性能指标等;并且将追踪到的所述函数的CPU性能与其他函数或者预定阈值的CPU性能进行比较。相应地,高于CPU利用率的平均百分比或者资源的函数被归类为CPU密集函数。在利用数据库模式信息对每个CPU密集函数进行程序分析之后(步骤220),就可以识别所述函数中变量的参数(步骤221)。每个参数的值对于特定的传入查询是不变的,在IR中利用常数值替代所述参数期望能有益于JIT编译。然后,将所述函数静态编译成IR(步骤230),并且将所述参数信息添加至所述编译后的IR,以获得参数化IR,这些参数化IR均保存在目录表中(步骤240)。所述表格也包括每个参数化IR的唯一标识符(identifier,简称ID),如下面示例性的表1所示。
表1:用于保存参数化IR的IR目录表
ID(整数) | 姓名(文本类型) | IR(长度可变的二进制数据类型) | Parm_num(int) | P1(Varchar) | P2(Varchar) | P3(Varchar) |
1 | Sdt_loop | …… | 1 | NATTS | ||
2 | Comparetup_index_btree_IR | …… | 3 | NKEYS | ISNULL | KEYTYPE |
…… | …… | …… | …… | …… | …… | …… |
所述唯一ID可以有匹配其在表格中的IR的枚举数据类型,并且用于在后期查询执行引擎中(在执行运行时间)检索所述IR。所述枚举数据类型可以定义如下:
enum IRFunctionsID {
SDT_LOOP_IR = 1,
COMPARETUP_INDEX_BTREE_IR = 2,
…
}.
图3示出通过利用参数化IR的JIT编译方法300进行的查询进程。由于所述参数化IR是在查询执行之前准备,数据库查询执行引擎(执行器140)可以在准备执行器步骤141基于唯一ID从参数化IR的目录表加载需要的参数化IR(步骤351),并将特定查询信息添加至所述参数化IR中(步骤352)。然后所述执行引擎可以对修改后的IR进行JIT编译,以生成优化的机器代码(步骤353),并将JIT编译后的函数的指针保存在运行时间数据结构中(步骤354)。在运行执行器步骤142的执行查询时,所述执行引擎检查所述JIT编译后的函数是否存在(步骤361),以确定调用这个JIT编译后的函数(步骤362)还是调用初始的解释函数(步骤363)。
下面(C语言中的)代码示出从PostgreSQL提取出来的sdt_loop函数的示例:
sdt_loop (int natts, datum *values)
{
int i;
for (i=0; i < natts; i++) {
values[i] = …
}
}.
在本示例中,所述sdt_loop函数被简化并且从PostgreSQL的查询执行引擎提取。所述sdt_loop函数用于从内存元组中提取列值。变量natts的值针对查询中的特定关系是不变的,该值是需要从元组中提取的列值的数量。基于CPU性能分析和程序分析,所述sdt_loop函数识别为所述数据库查询执行引擎中JIT编译的候选。所述函数中的变量natts也识别为针对查询中特定关系的编译后的IR中的参数,在查询执行时natts的值保持不变。将所述函数静态编译成增加了参数natts的IR,如下所示:
define void @sdt_loop(i32 %natts, i64* %values) {
entry:
%cmp4 = icmp sgt i32 %natts, 0
br i1 %cmp4, label %for.body, label %for.end
for.body:
%indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
%arrayidx = getelementptr inbounds i64* %values, i64 %indvars.iv
%rhs_val = ... ; compute the value
store i64 %rhs_val, i64* %arrayidx, align 8
%indvars.iv.next = add i64 %indvars.iv, 1
%lftr.wideiv = trunc i64 %indvars.iv.next to i32
%exitcond = icmp eq i32 %lftr.wideiv, %natts
br i1 %exitcond, label %for.end, label %for.body
for.end:
ret void
}.
上述参数化IR保存在为PostgreSQL的查询执行引擎中的JIT编译加载的目录表中。在一种场景下,接收查询,其中natts等于3,如下所示:
sdt_loop (int natts, datum *values)
{
int i;
for (i=0; i < 3; i++) {
values[i] = …
}
};
从T中选择计数(*),其中C3>0;
在上述示例中,C3是表格T中的第三列。
因此所述参数化IR从目录表加载,在IR中利用常数3替代所述参数natts的引用,如下所示:
define void @sdt_loop(i32 %natts, i64* %values) {
entry:
%cmp4 = icmp sgt i32 3, 0
br i1 %cmp4, label %for.body, label %for.end
for.body:
%indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
%arrayidx = getelementptr inbounds i64* %values, i64 %indvars.iv
%rhs_val = ... ; compute the value
store i64 %rhs_val, i64* %arrayidx, align 8
%indvars.iv.next = add i64 %indvars.iv, 1
%lftr.wideiv = trunc i64 %indvars.iv.next to i32
%exitcond = icmp eq i32 %lftr.wideiv, 3
br i1 %exitcond, label %for.end, label %for.body
for.end:
ret void
}.
上述LLVM IR等效于下面的C代码:
sdt_loop (int natts, datum *values)
{
int i;
for (i=0; i < 3; i++) {
values[i] = …
}
}.
然后对所述函数进行JIT编译,并且生成用于执行该查询的本地机器代码。利用生成的优化代码对所述sdt_loop函数进行JIT编译变成:
define void @sdt_loop(i32 %natts, i64* %values) {
entry:
%rhs_val.0 = ... ; compute the first value
store i64 %rhs_val.0, i64* %values, align 8
%arrayidx.1 = getelementptr inbounds i64* %values, i64 1
%rhs_val.1 = ... ; compute the second value
store i64 %rhs_val.1, i64* %arrayidx.1, align 8
%arrayidx.2 = getelementptr inbounds i64* %values, i64 2
%rhs_val.2 = ... ; compute the third value
store i64 %rhs_val.2, i64* %arrayidx.2, align 8
ret void
}.
等效的C代码是:
sdt_loop (int natts, datum *values)
{
values[0] = …
values[1] = …
values[2] = …
}.
不失一般性,上述方法可以应用于数据库查询执行引擎中的其他CPU密集函数,例如哈希连接、按组排序或者合并、建立索引或其它。在该方法中,程序分析可以用于识别JIT编译的候选函数中的参数。如果变量的值对于特定查询(查询特定信息)是不变的,并且用常数替代所述变量期望引进针对所述函数更多的编译器优化,例如不可达代码去除、循环展开、常量折叠和传播、内联的虚函数调用或者通过函数指针进行调用,则该变量是用于JIT编译的函数的IR中的参数。查询特定信息可以从查询中关系的模式信息(例如表格、视图或者索引)中识别,或者从查询中表达式和数据类型中识别。例如,在上述sdt_loop函数中,在基于查询中的模式信息和访问列执行之前,可以针对特定查询确定变量natts的值。例如,NOT NULL等部分模式信息可以有利于去除不可达代码(查询中NOT NULL列的NULL值检查是多余的)。(模式或者查询本身的)数据类型信息可以有利于为函数指针或者虚拟函数解决函数。
在一实施例中,可以实现两种方法中的任意一种以将查询特定信息(常数值)添加至参数化IR。如上述sdt_loop函数的示例所示,第一种方法包括利用与特定查询相关的常数值替代每个参数的引用。从目录表中加载IR时,也可以获得参数的数量以及这些参数在IR中的姓名。解析所述IR,以利用相关常数值替代任意指令中参数的引用。第二种方法包括:在函数的开始部分,针对每个参数插入赋值语句,以下以sdt_loop函数作为示例:
sdt_loop (int natts, datum *values)
{
int i;
natts = 3;
for (i=0; i < natts; i++) {
values[i] = …
}
}.
然后JIT编译器利用常数值替代所述参数的引用。所述LLVM IR是静态单一指派形式(static single assignment form,简称SSA形式),并且在LLVM IR中没有分配指令。同样地,所述加法指令可以用于将所述常数加0作为分配给参数变量的常数。生成的代码变成:
define void @sdt_loop(i32 %natts1, i64* %values) {
entry:
%natts = add i32 0, 3 ;assign the value 3 to natts
%cmp4 = icmp sgt i32 %natts, 0
br i1 %cmp4, label %for.body, label %for.end
for.body:
%indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
%arrayidx = getelementptr inbounds i64* %values, i64 %indvars.iv
%rhs_val = ... ; compute the value
store i64 %rhs_val, i64* %arrayidx, align 8
%indvars.iv.next = add i64 %indvars.iv, 1
%lftr.wideiv = trunc i64 %indvars.iv.next to i32
%exitcond = icmp eq i32 %lftr.wideiv, %natts
br i1 %exitcond, label %for.end, label %for.body
for.end:
ret void
}.
所述JIT编译可以应用于函数,以生成优化的机器代码并返回JIT编译后的函数的函数指针。在一种场景下,CPU密集函数可以只包括CPU密集型的且有特定查询信息的相对较少的的代码(例如循环次数相对较少的多次迭代)。但是,相同函数中的其他代码可以不是CPU密集型的或者可以没有特定查询信息。在这种情况下,为了减少JIT编译的成本,CPU密集型的和特定查询部分的代码可以脱离初始函数,并针对此部分构造新函数。然后,对新构造的相对较小的函数而不是初始大函数进行JIT编译。
图4为一种可用于实现包括上述方法在内的各种实施例的处理系统400的方框图。所述处理系统400可以是数据库管理系统或者数据库查询执行引擎的一部分。特定设备可利用所有所示的部件或所述部件的仅一子集,且设备之间的集成程度可能不同。此外,设备可以包括部件的多个实例,例如多个处理单元、处理器、存储器、发射器、接收器等。所述处理系统400可以包括配备一个或者多个输入/输出设备,例如扬声器、麦克风、鼠标、触摸屏、按键、键盘、打印机、显示器等的处理单元401。所述处理单元401可以包括连接到总线的中央处理器(central processing unit,简称CPU)410、存储器420、大容量存储设备430、视频适配器440以及I/O接口460。所述总线可以为任何类型的几个总线架构中的一个或多个,包括存储总线或者存储控制器、外设总线或者视频总线等等。
所述CPU 410可以包括任意类型的电子数据处理器。所述存储器420可以包括任意类型的系统存储器,例如静态随机存取存储器(static random access memory,简称SRAM)、动态随机存取存储器(dynamic random access memory,简称DRAM)、同步DRAM(synchronous dynamic random access memory,简称SDRAM)、只读存储器(read-onlymemory,简称ROM)或其组合等等。在一实施例中,所述存储器420可以包括开机时使用的ROM以及在执行程序时使用的存储程序和数据的DRAM。在一实施例中,所述存储器420是非瞬时的。所述大容量存储设备430可以包括任意类型的存储设备,其用于存储数据、程序和其它信息,并使这些数据、程序和其它信息可以通过总线访问。所述大容量存储设备430可以包括如下项中的一种或多种:固态磁盘、硬盘驱动器、磁盘驱动器以及光盘驱动器等等。
所述视频适配器440和所述I/O接口460提供接口,以将外部输入和输出设备耦合到所述处理单元。如图所示,输入输出设备的示例包括耦合至所述视频适配器440的显示器490和耦合至所述I/O接口460的鼠标/键盘/打印机470的任意组合。其它设备可以耦合至所述处理单元401,并且可以利用附加的或更少的接口卡。例如,串行接口卡(未图示)可以用于为打印机提供串行接口。
所述处理单元401还包括一个或多个网络接口450,所述网络接口450可以包括以太网电缆等有线链路,和/或到接入节点或者一个或多个网络480的无线链路。所述网络接口450允许所述处理单元401通过所述网络480与远端单元通信。例如,所述网络接口450可以通过一个或多个发射器/发射天线以及一个或多个接收器/接收天线提供无线通信。在一实施例中,所述处理单元401耦合到局域网或广域网上用于数据处理以及与远端设备通信,其中所述远端设备是其它处理单元、因特网、远端存储设施等等。
在一示例性的实施例中,数据库管理系统包括:CPU识别模块,用于识别查询中的中央处理器(central processing unit,简称CPU)密集函数;参数识别模块,用于在所述CPU密集函数中识别一个或者多个参数,其中所述一个或者多个参数代表在不同查询实例中可以变化的值的变量;编译模块,用于将所述CPU密集函数编译成包括所述一个或者多个参数的参数化中间表示(intermediate representation,简称IR);以及保存模块,用于将所述CPU密集函数的参数化IR保存在参数化IR的目录中。在部分实施例中,所述数据库管理系统可以包括其他或者附加模块用于执行所述实施例中描述的任一或组合的步骤。
在一示例性的实施例中,数据库管理系统包括:CPU编译模块,用于将中央处理器(central processing unit,简称CPU)密集函数编译成包括一个或者多个参数的参数化中间表示(intermediate representation,简称IR),其中所述一个或者多个参数代表在不同的查询实例中可以变化的的值的变量;保存模块,用于将所述CPU密集函数的参数化IR保存在参数化IR的目录中;加载模块,用于在准备执行传入查询时,从所述目录加载参数化IR;替代模块,用于在所述参数化IR中利用所述传入查询的变量的常数值替代所述一个或者多个参数;参数化IR编译模块,用于通过所述JIT编译利用替代所述一个或者多个参数的常数值编译所述参数化IR,以生成用于执行所述传入查询的机器代码。在部分实施例中,所述数据库管理系统可以包括其他或者附加模块用于执行所述实施例中描述的任一或组合的步骤。
虽然本发明中已提供若干实施例,但应理解,在不脱离本发明的精神或范围的情况下,本发明所公开的系统和方法可以以许多其他特定形式来体现。本发明的实例应被视为说明性而非限制性的,且本发明并不限于本文本所给出的细节。例如,各种元件或部件可以在另一系统中组合或合并,或者某些特征可以省略或不实施。
此外,在不脱离本发明的范围的情况下,各种实施例中描述和说明为离散或单独的技术、系统、子系统和方法可以与其它系统、模块、技术或方法进行组合或合并。展示或论述为彼此耦合或直接耦合或通信的其它项也可以采用电方式、机械方式或其它方式通过某一接口、设备或中间部件间接地耦合或通信。其他变化、替代和改变的示例可以由本领域的技术人员在不脱离本文精神和所公开的范围的情况下确定。
Claims (18)
1.一种查询即时JIT编译和执行的方法,其特征在于,所述方法包括:
识别查询中的中央处理器CPU密集函数,所述CPU密集函数用于执行数据库查询;
在所述CPU密集函数中识别一个或者多个参数,其中所述一个或者多个参数代表在进行数据库查询时不同查询实例中可以变化的值的变量;
将所述CPU密集函数编译成包括所述一个或者多个参数的参数化中间表示IR;其中,所述一个或者多个参数用于在执行传入查询时被所述变量的常数值替代;
将所述CPU密集函数的参数化IR保存在参数化IR的目录中。
2.根据权利要求1所述的方法,其特征在于,还包括:
在准备执行传入查询时,从所述目录加载所述参数化IR;
在所述参数化IR中利用所述变量的常数值替代所述一个或者多个参数;
通过JIT编译利用替代所述一个或者多个参数的常数值编译所述参数化IR,以生成用于执行所述传入查询的机器代码。
3.根据权利要求2所述的方法,其特征在于,还包括:将所述参数化IR的唯一标识符ID保存在所述目录中,其中所述参数化IR是利用所述参数化IR的唯一标识符ID从所述目录加载。
4.根据权利要求2所述的方法,其特征在于,还包括:将所述编译的参数化IR的指针保存在用于通过所述机器代码执行所述传入查询的运行时间数据结构中。
5.根据权利要求1至4任一项所述的方法,其特征在于,在运行时间利用所述变量的值执行传入查询之前,将所述CPU密集函数编译成所述参数化IR。
6.根据权利要求1至4任一项所述的方法,其特征在于,所述识别所述CPU密集函数包括:通过CPU性能分析识别受益于数据库查询执行引擎中JIT编译的CPU密集函数;所述CPU性能分析包括:利用函数追踪之前运行的查询中的CPU性能,以确定随着时间的推移CPU利用率的百分比和/或CPU资源或者性能指标,并且将追踪到的函数的所述CPU性能与未追踪到的函数或者预定阈值的CPU性能进行比较,其中,高于所述CPU利用率的平均百分比或者资源的函数被归类为所述CPU密集函数。
7.根据权利要求1至4任一项所述的方法,其特征在于,所述在所述CPU密集函数中识别一个或者多个参数包括:利用数据库模式信息、表达式或者与查询中所述CPU密集函数相关的数据类型进行程序分析,以确定所述变量是否不变。
8.根据权利要求1至4任一项所述的方法,其特征在于,所述在所述CPU密集函数中识别一个或者多个参数包括:选择期望提供包括不可达代码去除、循环展开、常量折叠和传播、内联的虚函数调用或者通过函数指针进行调用等更多编译器优化的变量。
9.根据权利要求1至4任一项所述的方法,其特征在于,所述将所述CPU密集函数编译成所述参数化IR包括:在所述CPU密集函数中同时编译多个指令。
10.根据权利要求1至4任一项所述的方法,其特征在于,所述将所述CPU密集函数编译成参数化IR包括:
利用查询的CPU性能分析信息识别查询中的所述CPU密集函数;
利用程序分析、数据库模式信息、表达式或者与所述CPU密集函数相关的数据类型识别所述参数化IR的代表在不同查询实例中可以变化的值的变量的一个或者多个参数。
11.一种查询即时JIT编译和执行的装置,其特征在于,包括:
至少一个处理器;
一种非瞬时性计算机可读取存储介质,用于存储供所述至少一个处理器执行的程序,其中,所述程序包括指令,用于:
识别查询中的中央处理器CPU密集函数;
在所述CPU密集函数中识别一个或者多个参数,其中所述一个或者多个参数代表在不同查询实例中可以变化的值的变量;
将所述CPU密集函数编译成包括所述一个或者多个参数的参数化中间表示IR;其中,所述一个或者多个参数用于在执行传入查询时被所述变量的常数值替代;
将所述CPU密集函数的参数化IR保存在参数化IR的目录中。
12.根据权利要求11所述的装置,其特征在于,所述程序还包括指令,用于:
在准备执行传入查询时,从所述目录加载所述参数化IR;
在所述参数化IR中利用所述变量的常数值替代所述一个或者多个参数;
通过即时JIT编译利用替代所述一个或者多个参数的常数值编译所述参数化IR,以生成用于执行所述传入查询的机器代码。
13.根据权利要求12所述的装置,其特征在于,所述程序还包括指令用于:将所述参数化IR的唯一标识符ID保存在所述目录中,其中所述程序还包括指令,用于利用所述参数化IR的唯一标识符ID从所述目录加载所述参数化IR。
14.根据权利要求12所述的装置,所述程序还包括指令用于:将所述编译的参数化IR的指针保存在用于通过所述机器代码执行所述传入查询的运行时间数据结构中。
15.根据权利要求11至14任一项所述的装置,其特征在于,所述程序还包括指令用于:在运行时间利用所述变量的值执行传入查询之前,将所述CPU密集函数编译成所述参数化IR。
16.根据权利要求11至14任一项所述的装置,其特征在于,所述用于识别所述CPU密集函数的指令包括用于通过CPU性能分析识别受益于数据库查询执行引擎中JIT编译的CPU密集函数的指令;所述CPU性能分析包括:利用函数追踪之前运行的查询中的CPU性能,以确定随着时间的推移CPU利用率的百分比和/或CPU资源或者性能指标,并且将追踪到的函数的所述CPU性能与未追踪到的函数或者预定阈值的CPU性能进行比较,其中,高于所述CPU利用率的平均百分比或者资源的函数被归类为所述CPU密集函数。
17.根据权利要求11至14任一项所述的装置,其特征在于,所述用于在所述CPU密集函数中识别一个或者多个参数的指令包括用于利用数据库模式信息、表达式或者与查询中所述CPU密集函数相关的数据类型进行程序分析,以确定所述变量是否不变的指令。
18.根据权利要求11至14任一项所述的装置,其特征在于,所述用于在所述CPU密集函数中识别一个或者多个参数的指令包括用于利用查询的CPU性能分析信息识别查询中的所述CPU密集函数;利用程序分析、数据库模式信息、表达式或者与所述CPU密集函数相关的数据类型识别所述参数化IR的代表在不同查询实例中可以变化的值的变量的一个或者多个参数。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/687,473 US20160306847A1 (en) | 2015-04-15 | 2015-04-15 | Apparatus and Method for Using Parameterized Intermediate Representation for Just-In-Time Compilation in Database Query Execution Engine |
US14/687,473 | 2015-04-15 | ||
PCT/CN2016/078078 WO2016165562A1 (en) | 2015-04-15 | 2016-03-31 | Apparatus and method for using parameterized intermediate representation for just-in-time compilation in database query execution engine |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107250983A CN107250983A (zh) | 2017-10-13 |
CN107250983B true CN107250983B (zh) | 2020-12-15 |
Family
ID=57125741
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201680010877.6A Active CN107250983B (zh) | 2015-04-15 | 2016-03-31 | 查询即时jit编译和执行的装置和方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20160306847A1 (zh) |
EP (1) | EP3254191B1 (zh) |
CN (1) | CN107250983B (zh) |
WO (1) | WO2016165562A1 (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11341132B2 (en) * | 2015-09-01 | 2022-05-24 | Sybase, Inc. | Generating a producer-driven execution plan from a consumer-driven iterator-based execution plan |
US10534773B2 (en) * | 2017-03-30 | 2020-01-14 | Microsoft Technology Licensing, Llc | Intelligent query parameterization of database workloads |
US10936290B2 (en) | 2018-11-29 | 2021-03-02 | International Business Machines Corporation | Compile-time folding of assumed constant values |
CN109753306A (zh) * | 2018-12-28 | 2019-05-14 | 北京东方国信科技股份有限公司 | 一种预编译函数缓存引擎的大数据处理方法 |
WO2020172788A1 (en) * | 2019-02-26 | 2020-09-03 | Intel Corporation | Workload oriented constant propagation for compiler |
CN110781208B (zh) * | 2019-09-27 | 2022-02-11 | 支付宝(杭州)信息技术有限公司 | 数据处理方法、装置、设备及计算机可读存储介质 |
US11347736B2 (en) * | 2019-10-30 | 2022-05-31 | Boray Data Technology Co. Ltd. | Dynamic query optimization |
CN112100059B (zh) * | 2020-08-20 | 2021-09-14 | 浙江大学 | 一种c语言的指针类型分析方法 |
US11544261B2 (en) * | 2020-10-01 | 2023-01-03 | Bank Of America Corporation | System for optimizing electronic data requests in a data storage environment |
CN112905153B (zh) * | 2020-12-07 | 2023-10-27 | 中国科学院软件研究所 | 一种面向软件定义卫星的软件并行构建方法以及装置 |
EP4334822A4 (en) * | 2021-06-30 | 2024-06-05 | Huawei Technologies Co., Ltd. | METHOD AND SYSTEM FOR PROVIDING A CONTEXT-SENSITIVE NON-INTRUSIVE DATA PROCESSING OPTIMIZATION STRUCTURE |
US11934402B2 (en) * | 2021-08-06 | 2024-03-19 | Bank Of America Corporation | System and method for generating optimized data queries to improve hardware efficiency and utilization |
CN114721748B (zh) * | 2022-04-11 | 2024-02-27 | 广州宇中网络科技有限公司 | 一种数据查询方法、系统、设备及可读存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1848088A (zh) * | 2005-02-18 | 2006-10-18 | 国际商业机器公司 | 将本机接口函数调用转换为更简单操作的方法和系统 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6186677B1 (en) * | 1996-08-27 | 2001-02-13 | Compuware Corporation | Byte code instrumentation |
US6427234B1 (en) * | 1998-06-11 | 2002-07-30 | University Of Washington | System and method for performing selective dynamic compilation using run-time information |
US7213240B2 (en) * | 2001-10-05 | 2007-05-01 | Sun Microsystems, Inc. | Platform-independent selective ahead-of-time compilation |
US7383255B2 (en) * | 2003-06-23 | 2008-06-03 | Microsoft Corporation | Common query runtime system and application programming interface |
US7530059B2 (en) * | 2005-02-18 | 2009-05-05 | International Business Machines Corporation | Method for inlining native functions into compiled java code |
WO2007095642A2 (en) * | 2006-02-16 | 2007-08-23 | The Regents Of The University Of California | Dynamic incremental compiler and method |
WO2008002173A1 (en) * | 2006-06-20 | 2008-01-03 | Intel Corporation | Method and apparatus to call native code from a managed code application |
JP5614348B2 (ja) * | 2011-03-18 | 2014-10-29 | 富士通株式会社 | 命令処理方法、命令処理装置、及び命令処理プログラム |
US20150161266A1 (en) * | 2012-06-28 | 2015-06-11 | Google Inc. | Systems and methods for more efficient source code searching |
US8959495B2 (en) * | 2012-09-14 | 2015-02-17 | Oracle International Corporation | Unifying static and dynamic compiler optimizations in source-code bases |
-
2015
- 2015-04-15 US US14/687,473 patent/US20160306847A1/en not_active Abandoned
-
2016
- 2016-03-31 EP EP16779537.6A patent/EP3254191B1/en active Active
- 2016-03-31 CN CN201680010877.6A patent/CN107250983B/zh active Active
- 2016-03-31 WO PCT/CN2016/078078 patent/WO2016165562A1/en active Application Filing
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1848088A (zh) * | 2005-02-18 | 2006-10-18 | 国际商业机器公司 | 将本机接口函数调用转换为更简单操作的方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
EP3254191A1 (en) | 2017-12-13 |
EP3254191B1 (en) | 2020-09-02 |
EP3254191A4 (en) | 2018-03-07 |
US20160306847A1 (en) | 2016-10-20 |
CN107250983A (zh) | 2017-10-13 |
WO2016165562A1 (en) | 2016-10-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107250983B (zh) | 查询即时jit编译和执行的装置和方法 | |
CN110795455B (zh) | 依赖关系解析方法、电子装置、计算机设备及可读存储介质 | |
US9940229B2 (en) | Technologies for persistent memory programming | |
CN108369591B (zh) | 用于缓存和参数化ir的系统和方法 | |
US8458681B1 (en) | Method and system for optimizing the object code of a program | |
US20140281362A1 (en) | Memory allocation in a system using memory striping | |
US10635666B2 (en) | System, method and device for index compilation to optimize index usage | |
EP3605364B1 (en) | Query processing method, data source registration method and query engine | |
US11221890B2 (en) | Systems and methods for dynamic partitioning in distributed environments | |
US20200401592A1 (en) | Dynamic Rebuilding of Query Execution Trees and Reselection of Query Execution Operators | |
US10243798B2 (en) | Variable SNMP data collection with embedded queries | |
EP3779720B1 (en) | Transaction processing method and system, and server | |
US10339151B2 (en) | Creating federated data source connectors | |
CN111831301B (zh) | 支持无分叉升级的区块链运行时环境系统、方法 | |
Jiang et al. | VSGM: view-based GPU-accelerated subgraph matching on large graphs | |
CN108780452B (zh) | 一种存储过程处理方法及装置 | |
Zhang et al. | Design and implementation of a real-time interactive analytics system for large spatio-temporal data | |
CN114238469B (zh) | 数据提取接口开放方法、装置、计算机设备及存储介质 | |
US20210103478A1 (en) | Systems and methods for dynamic partitioning in distributed environments | |
CN112612530B (zh) | 类查询方法及装置 | |
KR102100513B1 (ko) | 프리미티브 생성 방법과 그를 이용한 질의처리 방법 | |
US7007016B2 (en) | Support for concurrent active SQL statements having shared SQL context information | |
CN111782667A (zh) | 一种MongoDB更新数据的驱动方法、系统及存储介质 | |
WO2015177056A1 (en) | Method and device fir allocating computing resources in the distributed processing of database queries | |
CN118819623A (zh) | 基于sql语法的软件部署方法、介质及电子设备 |
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 |