CN110532288A - 迭代分析查询处理的统一优化 - Google Patents

迭代分析查询处理的统一优化 Download PDF

Info

Publication number
CN110532288A
CN110532288A CN201910432941.5A CN201910432941A CN110532288A CN 110532288 A CN110532288 A CN 110532288A CN 201910432941 A CN201910432941 A CN 201910432941A CN 110532288 A CN110532288 A CN 110532288A
Authority
CN
China
Prior art keywords
sentence
query
circulation
plan
program
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
CN201910432941.5A
Other languages
English (en)
Inventor
C.郑
S.Y.李
C.李
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.)
SAP SE
Original Assignee
SAP SE
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 SAP SE filed Critical SAP SE
Publication of CN110532288A publication Critical patent/CN110532288A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation
    • G06F16/24542Plan optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation
    • G06F16/24542Plan optimisation
    • G06F16/24545Selectivity estimation or determination
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Operations Research (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

企业应用的程序的优化能够在统一优化技术中考虑声明式查询语句和命令逻辑两者。输入程序能够实施复杂的分析查询,并且包括迭代控制流逻辑,诸如循环。通过经由提升和沉降操作将查询移出和移入循环边界,能够列举程序的备选查询执行计划。经由依赖图排除某些操作,能够保持程序正确性。也能够使用沉降子图。还能够支持查询内联,从而得到产生优越的执行计划的协同效应。能够认为各个备选的计算执行资源需求到达最优查询执行计划,然后该最优查询执行计划能够用于实际实施该程序的执行。因此,通过执行违反直觉的优化,能够极大地改进执行性能。

Description

迭代分析查询处理的统一优化
技术领域
本公开一般涉及数据库处理,并且更具体地涉及在迭代场景中利用查询语句来优化程序。
背景技术
已经使用各种优化策略来优化查询。例如,已知为SQL查询生成优化的方案并使用各种技术,包括利用索引、JOIN(连接)排序等。
类似地,已知要优化命令(imperative)计算逻辑。例如,能够将命令逻辑组织成基本块,并且能够基于控制流、数据依赖等来执行各种优化。
然而,由于对计算资源的需求增加,仍然需要超出本领域当前可用的更好的优化策略。
发明内容
提供本发明内容是为了以简化的形式介绍将在下面在具体实施方式中进一步描述的一些概念的选择。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
在一个实施例中,一种计算机实施的方法包括:接收包括多个语句的输入程序的中间表示,其中所述多个语句包括多个查询语句以及包括循环的多个命令语句;经由输入程序的中间表示,列举输入程序的多个执行计划候选,其中所述列举包括对查询语句执行至少一个沉降操作,其中所述沉降操作将查询语句移动到循环边界内;执行组合至少两个查询语句的查询内联;估计执行计划候选中的各个的计算执行资源需求;以及确定输入程序的最优执行计划,其中所述确定包括发现具有最低的估计的计算执行资源需求的候选执行计划。
在另一实施例中,一种计算系统包括:一个或多个存储器;耦合到一个或多个存储器的一个或多个处理单元;以及存储指令的一个或多个非暂时性计算机可读存储介质,所述指令在被执行时使得所述一个或多个处理单元执行以下操作:接收包括多个语句的输入程序的中间表示,其中所述多个语句包括多个查询语句以及包括循环的多个命令语句;经由输入程序的中间表示,列举输入程序的多个执行计划候选,其中所述列举包括对查询语句执行至少一个沉降操作,其中沉降操作将查询语句移动到循环边界内;执行组合至少两个查询语句的查询内联;估计执行计划候选中的各个的计算执行资源需求;以及确定输入程序的最优执行计划,其中所述确定包括发现具有最低的估计的计算执行资源需求的候选执行计划。
在另一实施例中,一个或多个非暂时性计算机可读存储介质存储计算机可执行指令,所述计算机可执行指令在由计算系统执行时使计算系统执行包括以下各项的方法:接收描绘包括多个语句的计算机实施程序的中间表示图,其中多个语句中的至少一个语句具有对多个语句中的另一语句的数据依赖,并且其中该程序还包括循环;识别多个语句中的位于能够被移动到循环边界外的在循环的边界内的第一语句;提升在循环边界外的第一语句;生成反映提升的初始执行计划;识别多个语句中的能够被移动到循环边界内的在循环边界外的第二语句;将第二语句沉降到循环边界内;生成反映沉降的备选执行计划;将至少一个查询语句内联到其他查询语句中;估计初始执行计划和备选(alternative)执行计划的计算执行资源需求;基于估计的计算执行资源需求确定最优执行计划,其中,所述确定包括:比较所述初始执行计划的估计的计算执行资源需求与所述备选执行计划的估计的计算执行资源需求;以及选择用于执行的最优执行计划。
通过参考附图进行的以下详细描述,本发明的前述和其他目的、特征和优点将变得更加清楚。
附图说明
图1是实施具有查询语句和命令语句两者的程序的优化的示例系统的框图。
图2是优化具有查询语句和命令语句两者的程序的另一示例方法的流程图。
图3是实施具有查询语句和命令语句两者的程序的优化的系统的数据流图。
图4是优化具有查询语句和命令语句两者的程序的示例方法的流程图。
图5是实施具有查询语句和命令语句两者的程序的优化的示例系统的框图。
图6是优化具有查询语句和命令语句两者的程序的另一示例方法的流程图。
图7是程序的示例中间表示的框图。
图8是用于示例程序的示例原始执行计划的中间表示的框图。
图9是在提升图8的原始执行计划中的可提升语句之后的示例备选执行计划的框图。
图10是用于识别可提升语句的示例系统的框图。
图11是用于识别可提升语句的示例方法的流程图。
图12是在沉降图8的原始执行计划中的可沉降语句之后的示例备选执行计划的框图。
图13是用于识别可沉降语句的示例系统的框图。
图14是用于识别可沉降语句的示例方法的流程图。
图15是示出使用内联组合两个查询的流程图。
图16是用于识别能够被内联的语句并且内联所识别的语句的示例方法的流程图。
图17是被数据依赖覆盖的另一示例程序的原始执行计划的框图。
图18是在提升图17的原始执行计划中的可提升语句之后的初始执行计划的框图。
图19是在沉降图18的初始执行计划中的可沉降语句之后的备选执行计划的框图。
图20是示出用于图8的原始执行计划中所示的示例程序的示例沉降子图的框图。
图21是示出用于发现用于图8的原始执行计划中所示的示例程序的沉降子图的示例搜索空间树的框图。
图22是用于计算备选执行计划的相对益处的示例方法的流程图。
图23是优化具有声明式查询构造和命令式代码的程序的另一示例方法的流程图。
图24是示出来自评估程序执行计划优化的不同示例方法的第一实验的执行时间的一组图。
图25是示出来自评估程序执行计划优化的不同示例方法的第二实验的执行时间的一组图。
图26是示出使用程序执行计划优化的示例方法执行的若干实验的编译时间的图。
图27是其中能够实施一些所描述的实施例的示例计算系统的图。
图28是能够结合本文描述的技术使用的示例云计算环境的图。
具体实施方式
示例1-概述
新颖的优化策略采用查询语句和命令式构造(例如,诸如循环的迭代结构)两者,在命令式构造中可以考虑这样的查询语句。输入程序能够包括查询语句和循环两者。能够为输入程序列举多种不同的查询执行计划,所述输入程序通常使用中间表示来表示。
所描述的一个列举策略是实施提升和/或沉降操作以重新定位查询语句在中间表示内所驻留的位置。换句话说,在保持程序正确性的同时,查询语句被尽可能地移动到程序内。
数据依赖图能够用于确定语句是否能够从程序的循环中提升出来和/或沉降到程序的循环内。沉降子图能够用于指示能够对子图中表示的语句执行沉降的程度。
能够执行查询内联(例如,作为已经将查询语句沉降到其他查询语句附近的结果),导致整体改进的计算性能。这样的内联能够如本文所述自动化。
能够估计特定列举的查询执行计划的计算执行资源需求,并将其与其他备选计划的需求进行比较,并且能够选择最佳计划用于后续使用。
虽然看似违反直觉,但实际上能够通过将一些查询语句移动到循环中来提高性能。因此,将查询优化与命令优化相结合(例如,将查询语句放入诸如循环的特定迭代构造中)能够导致新发现的优化(例如,经由内联已经沉降到循环中的语句)。实验结果表明,这样的策略能够在特定的计算场景中产生令人惊讶的性能增益。
示例2-实施统一优化的总体系统示例
图1是实施具有查询语句和命令语句两者的程序的统一优化的示例系统100的框图。在该示例中,系统100能够包括输入程序110,其被中间表示生成器115处理为输入程序110的中间表示120。
统一优化系统125能够接收中间表示120并且利用执行计划列举器130处理中间表示120以执行提升和沉降操作,以及利用查询内联器144处理中间表示120,如本文进一步描述的,以列举一个或多个执行计划候选145。
列举的执行计划候选145的计算执行资源需求能够用计算执行资源需求估计器150来估计。实际上,能够估计对单个操作的整个候选或部分估计的需求。
系统从列举的执行计划候选145中选择最优执行计划175。然后,最优执行计划能够被传递给程序编译器180,然后所得到的可执行代码能够在程序执行环境190中执行。
在本文的示例中的任何一个中,尽管一些子系统在单个框中示出,但实际上,它们能够实施为具有多于一个设备的计算系统。组件之间的边界能够变化。例如,尽管计算系统110被示出为单个实体,但是它能够由多个设备实施。
实际上,本文所示的系统,诸如系统100,能够在复杂性方面变化,能够具有附加功能、更复杂的组件等。例如,在优化系统100内能够存在附加功能。附加组件能够被包括以实施安全、冗余、负载平衡、报告设计等。
所描述的计算系统能够经由有线或无线网络连接进行联网。替换地,系统能够通过内联网连接(例如,在公司环境、政府环境中等)连接。
系统100和本文描述的其他系统中的任何一个能够结合本文描述的硬件组件中的任何一个来实施,所述硬件组件诸如下面描述的计算系统(例如,处理单元、存储器等)。在本文的示例中的任何一个中,输入、输出、查询执行计划候选、中间表示等能够存储在一个或多个计算机可读存储介质或计算机可读存储设备中。本文描述的技术能够是操作系统或硬件的细节所通用的,并且能够应用于任何种类的环境中以利用所描述的特征。
示例3-实施统一优化的示例总体方法
图2是优化程序的示例方法200的流程图,并且示例方法200能够例如由图1的系统执行。
在该示例中,在210处,接收包括多个语句的输入程序。如本文所述,多个语句能够包括多个声明式(declarative)结构化语言查询(structured language query,SQL)语句、以及包括至少一个循环的多个命令语句。
在220处,生成输入程序的中间表示。
在230处,列举一个或多个查询执行计划候选,能够执行查询内联(例如,在可能的情况下),针对(多个)执行计划候选估计计算执行资源需求,并且选择最优候选。
如本文所述,查询计划候选的列举可包括对循环边界外的查询执行至少一个提升操作。列举还能够包括对循环边界内的查询执行至少一个沉降操作。能够对每一个查询计划候选内的至少一个查询执行查询内联。为了选择最优候选查询执行计划,能够考虑对各种查询计划候选的各种计算执行资源需求估计。
在240处,能够根据已被选择作为最优候选的查询执行计划候选来编译程序。
在250处,能够如本文所述执行编译的程序。
方法200和本文描述的其他方法中的任何一个能够由存储在一个或多个计算机可读介质(例如,存储介质或其他有形介质)中的或存储在一个或多个计算机可读存储设备中计算机可执行指令执行(例如,使计算系统执行该方法)。能够在软件、固件、硬件或其组合中执行这样的方法。这样的方法能够至少部分地由计算系统(例如,一个或多个计算设备)执行。
能够从替代的角度描述所示动作,同时仍然实施所述技术。例如,“接收”也能够从不同的角度描述为“发送”。
示例4-实施统一优化的示例系统
图3是根据本文的示例中的任何一个实施统一优化的系统300的框图。在该示例中,查询执行计划列举器320接收输入程序的中间表示310,并输出多个查询执行计划候选330A-N,如本文所述。执行计划候选330A-N中的一个或多个能够通过自动查询内联器340进一步修改,其中自动查询内联器340将其中包含的一个或多个查询内联到其他查询内(例如,在可能的情况下,同时保持程序正确性),并输出修改的查询执行计划候选350A-N。
计算执行资源需求估计器360接收修改的查询计划候选350A-N,并输出针对候选350A-N中的各个的计算机资源益处估计370A-N。估计370A-N由查询执行计划选择器380接收,查询执行计划选择器380能够比较所述估计并确定如本文所述的最优查询执行计划。然后最优查询执行计划被输出作为所选择的候选390。
实际上,能够部分地执行优化,使得不需要为了内联和/或估计而生成整个查询执行计划候选。例如,能够通过内联来修改各种候选部分计划(例如,子计划),并且能够针对各种候选部分计划来估计计算执行资源需求。能够选择最优部分计划以便与其他最优部分计划组合以形成完整的最优计划。
示例5-实施统一优化的示例方法
图4是执行统一优化的示例方法400的流程图。方法400能够例如通过诸如图1或图3中所示的系统的系统来实施。
在410处,接收包括至少一个循环的程序的中间表示。
在420处,执行列举以从程序的中间表示生成多个查询计划候选。所述生成能够包括对包含在中间表示中的一个或多个查询语句执行提升和沉降操作,如本文进一步讨论的。作为所述生成的一部分,能够确定哪些提升/沉降是可能的(例如,在保持程序正确性的同时)。在一些实施方式中,能够首先执行提升,然后是沉降,在某些情况下可以沉降刚刚被提升的一些语句。然而,语句最终可能被沉降到与其最初所驻留(例如,在输入程序中)的循环不同的循环中。
在430处,对每个查询计划候选内的至少一个查询执行查询内联(例如,在可能的情况下,在保持程序正确性的同时)。查询内联对于作为沉降操作的目标的查询语句可能特别有益,因为被沉降到循环中的语句可能被多次迭代,并且内联能够例如减小必须执行所述语句的搜索空间,如本文进一步描述的。
在440处,生成用于执行各个查询计划候选的计算执行资源需求的估计。
在450处,确定输入程序的最优执行计划,诸如通过比较在440处生成的估计来从查询计划候选中确定具有最低估计的计算资源需求的候选查询执行计划,其能够是被称为如本文所述的最优查询执行计划候选。
示例6-示例计算执行资源需求估计
在本文的示例中的任何一个中,能够估计查询执行计划的执行的计算资源需求(例如,在计算资源方面的成本)。这样的估计能够估计在实际执行查询执行计划时消耗的计算资源的量。这样的估计能够指示在执行期间消耗的时间量、处理周期、存储量、线程数等。
另外,能够为整个执行计划或仅其部分(诸如由于给定操作而改变的部分)生成这样的估计。这样,能够在一些场景中使用相对需求估计来确定是否将特定操作(例如,沉降)合并到查询执行计划候选或所得到的最优计划中。
示例7-示例查询执行计划列举
在本文的示例中的任何一个中,列举能够包括考虑正确计算由输入程序指示的操作的多个备选查询执行计划。实际上,并不是每个可能的查询执行计划都需要被列举。然而,如本文所述,能够列举和测量从对不同查询语句的不同沉降操作得到的不同备选。
在本文的示例中的任何一个中,列举能够包括将中间表示中的查询语句移动到不同的循环中(例如,该移动导致性能提高)。在本文的示例中的任何一个中,列举能够包括将查询语句移动到已经具有另一查询语句的循环中(例如,然后对所述两个查询语句执行内联)。这样的查询语句的移动能够表示为候选查询执行计划,并且能够从中选择最优计划。因此,最优查询执行计划能够跨越迭代构造(诸如循环)集成查询运动。
例如,能够将多个查询语句视为循环的沉降操作候选。基于表示多个语句的至少一个数据依赖关系的数据依赖图,能够将沉降操作候选中的至少一个从考虑中排除。例如,如果移动这样的候选破坏程序正确性,则该候选能够从考虑中被排除,不被包括在候选查询执行计划中。
在一些实施方式中,通过对出现在输入程序的中间表示中的多个查询语句执行提升操作,能够生成初始查询执行计划候选。例如,能够在输入程序的IR中提升可能的(例如,所有可能的)可提升语句,从而得到初始查询执行计划。因此,能够检查语句以查看它们是否可提升,然后如果可提升的话就被提升。
能够如本文所述的对初始查询执行计划候选执行各种排列的沉降操作(例如,将不同的查询语句沉降到一个循环中或将查询语句沉降到不同的循环中)以生成用于估计的多个查询执行计划候选。如数据依赖图(例如,直接或间接地)所指示,能够从考虑中排除破坏(或潜在破坏)程序正确性的那些沉降操作。另外,如果一个语句可沉降到多于一个循环中,则能够认为它根本不可沉降。因此,响应于确定语句可沉降到多于一个循环中,能够从搜索空间中删除它。这减小了搜索空间,并导致了优化过程中的更高的效率。
另外,能够避免显式地创建所有潜在的候选执行计划,因为有可能仅列举给定计划的一部分(例如,通过使用本文进一步描述的沉降子图)并且对这样的一部分执行SQL内联和/或其他优化。另外,可以逐个生成用于生成计划的给定部分的各种不同选项,并且选择最优候选,而无需生成整个计划(例如,经由部分计划优化)。在这样的情况下,可能只需要保留为一部分选择的候选。因此,通过分别考虑沉降子图(例如,串行或并行)并通过在独立的基础上(例如,无需显式地考虑对许多其他可能性的影响)解决子图(例如,执行查询内联)来递增地解决优化,能够完成递增优化。因此,子图的最优布置能够被发现并与其他子图的最优布置组合,并且次优子图能够因与其他子图组合的可能性而被忽略。
示例8-示例查询执行计划
在本文的示例中的任何一个中,查询执行计划能够采用计算动作的有序集的表示的形式,以实现输入程序的计算。实际上,这样的计划可能非常复杂。诸如循环的预测迭代次数的附加元数据能够被包括在计划表示中,所述计划表示能够采用如本文所述的中间表示(例如,基本块)的形式。
实际上,每当描述查询执行计划时,能够使用弃用的查询执行计划。这样的弃用的计划实际上可能不是可执行的,但是列出了导致程序的正确结果的步骤的一般步骤和顺序。例如,候选查询执行计划可能不包含实现正确结果所必需的所有操作,而可能表示导致大量计算执行资源需求的那些步骤、或者由于执行一些操作(例如本文描述的操作)导致计算执行资源需求发生变化的那些步骤。
在执行之前的某个时刻,能够完成查询执行计划,使得它包含实际执行该程序的可执行指令(例如,软件代码)。例如,弃用的计划能够用作脚手架,所述脚手架被向其中插入更详细的操作。
为方便起见,查询执行计划有时在本文中简称为“查询计划”或“执行计划”。在本文的示例中的任何一个中,查询执行计划能够采用用于包含至少一个查询的程序的执行计划的形式。查询执行计划还能够包括与命令语句相关的操作。因此,查询执行计划能够采用包含查询的执行计划的形式,该包含查询的执行计划包含针对完成对多个查询语句的处理的操作、和针对完成对一个或多个命令语句的处理的操作两者。
示例9-实施用于统一优化的查询计划列举的示例系统
图5是实施用于统一优化的查询计划列举的系统500的框图,并且能够用于在本文的示例中的任何一个中实现查询计划列举。
在该示例中,查询执行计划列举器520接收用于包括多个语句的计算机实施的程序的中间表示图510,并输出多个查询执行计划候选590A-N。
在一些情况下,所述多个语句能够包括多个查询语句、以及包括至少一个循环的多个命令语句。在一些情况下,中间表示510中的多个语句中的至少一个具有对多个语句中的其他语句的数据依赖。
查询执行计划列举器520能够生成表示多个语句之间的依赖的数据依赖图530。基于所识别的依赖,提升识别器550能够识别循环中的多个语句中的、能够被提升到循环外的一个或多个语句。所述提升能够在任何沉降操作之前执行,或者它们能够与沉降操作一起执行,如本文进一步描述的。在首先执行可能的提升的情况下,能够生成初始执行计划540,反映这些提升。在其他情况下,初始执行计划540能够简单地反映从接收的中间表示510得出的原始执行计划。
基于所识别的依赖,沉降识别器560识别循环外的多个语句中的、能够被沉降到循环中的一个或多个语句。在执行一组初始提升操作之后、或者与所述提升操作一起,能够对初始执行计划执行这样的沉降,如本文进一步描述的。
计划修改器570包括用于执行提升操作的提升操作器575、以及用于执行沉降操作的沉降操作器577。计划修改器570能够对从接收的中间表示510得出的初始执行计划540执行提升和沉降操作。
附加地或替代地,沉降操作器577能够对初始执行计划540执行沉降操作,该初始执行计划540由于以下步骤而生成:提升操作器575首先执行由提升识别器550识别的所有可能的提升操作,接着是沉降操作器执行由沉降识别器560识别的一个或多个潜在沉降操作以生成多个查询执行计划候选590A-N,所述多个查询执行计划候选590A-N能够用作图3的查询执行计划候选330A-N。在具有多个循环的IR中,如本文进一步描述的,系统可以针对其他循环重复上述操作以潜在地生成附加查询计划候选。
示例10-实施用于统一优化的查询计划列举的示例方法
图6是实施用于统一优化的查询计划列举的示例方法600的流程图,并且能够例如由图5的系统实施。
方法600包括接收用于输入程序的中间表示图610,该输入程序包括多个语句和至少一个循环。在一些情况下,所述多个语句能够包括多个声明式查询语句、以及包括所述至少一个循环的多个命令语句。在一些情况下,所接收的中间表示中的多个语句中的至少一个具有对多个语句中的其他语句的数据依赖。
在620处,生成数据依赖图,其示出了语句之间的数据依赖。
列举能够在630处通过生成初始查询执行计划来进行,其中这样的生成包括使用数据依赖(诸如在数据依赖图中表示的那些)来识别可能的提升并且尽可能地执行提升。
随后,在640处,再次使用数据依赖来经由数据依赖图来识别可能的沉降操作。应该注意的是,某些沉降操作可能是不可能的,因为实施它们可能会干扰查询执行计划,诸如存在干扰语句的情况,其防止将循环外的语句沉降到循环中的其使用语句(usingstatement),因为将循环外的语句移动到循环中将影响语句的输出。这样的“干扰”语句在本文中被进一步描述。
在650处,通过执行不同排列的潜在的识别的沉降操作来生成各种查询执行计划候选,其中那些潜在沉降操作不受干扰语句的影响。在一些情况下,存在可以沉降给定语句或语句集合的多种可能性,并且能够执行进一步处理以确定哪个潜在沉降操作是最优的,如本文进一步描述的。在其他情况下,执行多个备选沉降以生成候选查询执行计划,然后能够输出该候选查询执行计划用于进一步处理,诸如查询内联、计算执行资源需求估计等。在一些情况下,沉降操作可以“撤消”先前的提升操作,诸如通过基于识别的数据依赖将先前已经从中间表示提升出来的语句沉降到初始执行计划中。
这些生成的候选查询计划能够用作图3的查询执行计划候选330A-N。在具有多个循环的IR中,系统能够对其他循环重复上述操作以潜在地生成附加的查询计划候选,如本文中进一步描述的。
示例11-示例程序
在本文的示例中的任何一个中,技术能够接受用于优化的输入程序。输入程序能够采用通常用于执行任务或功能的语句集合(例如,计算机源代码)的形式。能够支持使用控制流逻辑的复杂分析查询。实际上,所述技术在用户定义函数(UDF)场景中特别有用,因为这样的函数通常不会从一开始就从能够设计优化的开发人员资源中受益。然而,包括至少一个查询语句和至少一个循环的任何程序都能够从本文描述的技术受益。
在本文的示例中的任何一个中,程序能够包括至少一个查询语句和(例如,由命令语句实施的)至少一个循环。还能够包括一个或多个其他命令语句。
实际上,在程序的语句之间存在数据依赖,其能够由如本文所述的数据依赖图表示。
示例12-示例数据依赖图
在本文的示例中的任何一个中,数据依赖图能够表示输入程序(或其中间表示)的语句之间的依赖。节点能够表示语句,而边能够表示依赖。在一些情况下,两个节点之间可存在多种不同类型的边,并且位字段可用于编码这样的信息以表示边。
这样的图能够有助于在本文的示例中的任何一个中确定是否能够执行提升或沉降(例如,在保持程序正确性的同时)。在某些情况下,即使图形没有明确指示直接依赖,间接依赖也可以被指示。基于数据依赖图,能够从考虑中排除各种提升或沉降操作。
示例13-示例中间表示(IR)图
在本文的示例中的任何一个中,能够经由中间表示(IR)图在内部表示程序。这样的中间表示通常包括用于程序的基本块的节点、和用于反映块内的控制流(例如,执行路径)的边。实际上,能够使用许多工具来生成程序的中间表示。
图7是能够在本文的示例中的任何一个中使用的程序的示例IR图700的框图。在该示例中,第一基本块710由图700中的节点表示。其他节点包括720、730和740。基本块能够表示除了在其入口处没有分支且除了在出口处没有分支的直线语句序列。IR是有向图,并且节点之间的边表示控制流。因此,在所示示例中,第一基本块710和第二块720之间的边指示从第一块710到第二块720的过程流。
块能够包含可以包括查询语句的一个或多个语句,如下面进一步描述的。IR图还表示所谓的命令式程序代码和循环,其将在本文中进一步讨论。
示例14-示例查询语句
在本文的示例中的任何一个中,查询语句能够采用表示期望的查询操作的语句的形式。这样的语句能够包括例如SELECT(选择)或JOIN语句。例如,查询语句能够包括结构化语言查询(SQL)语句或根据其他习惯开发的查询语句。查询语句有时称为“声明式”,因为它们指定计算的逻辑而不描述实际控制流。因此,它们与本文描述的、其中能够指定实际的控制流构造(例如,循环)的命令语句区分开。如本文所述,当生成候选查询执行计划时,能够将查询语句移入或移出这样的循环。与原始的未优化程序相比,这样的查询运动能够导致表现出相当大且意想不到的优越计算性能的候选计划。
示例15-示例命令语句
在本文的示例中的任何一个中,命令语句能够包括执行各种非查询操作以实现处理的程序语句。迭代代码语句能够用于在程序中实施循环和条件。
条件代码能够表示为三个基本块:条件块、真(true)块和假(false)块。条件块能够具有逻辑语句和分支语句。逻辑语句能够包含逻辑运算符,并且逻辑语句为变量赋予真值或假值。分支语句根据逻辑变量指示下一个要执行的基本块。为了表示控制流,将条件块连接到IR图上的真块和假块。循环代码将在下面进一步讨论。
示例16-迭代示例
在本文的示例中的任何一个中,迭代和迭代语句能够包括涉及已知数量的迭代(例如,指定n个重复的for(针对的)场景)和未知数量的迭代(例如,取决于其他数据或条件)的编程场景。实际上,可能难以为某些迭代场景估计计算执行资源需求,但是所述技术能够在许多场景中实现改进。
示例17-示例循环和循环边界
在本文的示例中的任何一个中,循环能够采用重复执行的输入程序中的代码的形式。因此,循环在本文中也称为“迭代构造”,因为它们涉及重复多次地迭代代码。这样的重复执行能够经由编程习惯来实现,所述编程习惯诸如条件(例如,if)、while/do、do、for、repeat/until等。用于循环的代码能够在中间表示中被表示为两个基本块:循环头块,其也能够称为循环条件块,以及循环体块,其在本文中能够称为循环边界或“在循环中”(与能够称为“循环边界外”或“循环外”的、在循环体块外的代码相反)。循环头块具有用于决定迭代的数量的逻辑和分支语句。为了表示控制流,循环头块连接到IR图上的循环体块和另一块。循环体块也连接到循环条件块。
因此,再次返回到图7,第二块720能够被理解为循环头块,其除了跟随在控制流中的基本块710之后外,还连接到两个附加块——循环体锁730、以及第四块740,其中第四块740可以是例如退出块、或者可以指代包含在退出之前执行的额外语句的另一基本块。循环体块730内能够包含一个或多个语句。这样的语句能够被认为是“在循环中”或“在循环边界内”。类似地,位于循环体块730外的语句,诸如包含在基本块710内的任何语句,可以被认为是“在循环边界外”或者简单地“在循环外”。
如本文所述,能够执行提升和沉降操作以将查询语句移入或移出循环。
示例18-示例声明式结构化语言查询(SQL)语句
在本文的示例中的任何一个中,查询语句能够采用SQL语句的形式。结构化查询语言或SQL是用于数据库操作的国际标准。虽然有许多不同的数据库类型,但最常见的是关系数据库,它由一个或多个表格组成,所述表格由数据的记录或行组成。每行的数据被组织成离散的信息单元,称为字段或列。在关系数据库中,许多字段之间存在关系。为了利用来自数据库的数据,我们希望能够以各种方式分析数据。实现此目的的一种方式是使用SQL查询从数据库中选择某些数据。作为这样的查询的一部分,能够使用SQL赋值(assignment)语句。通常,赋值语句s表示为2元组(vs,es),其中es是表达式,vs是为es的结果赋值的变量。如果es是select查询的表达式,则查询执行的结果被赋值给vs。在这样的情况下,该语句称为SQL赋值语句,并且vs称为表格变量。如果es没有结果,则vs具有值。SQL SELECT语句可用于从SQL数据库中的一个或多个表格中检索记录。这样的语句不提供关于如何检索数据的指令,而仅提供期望检索的信息。因此,与上面讨论的命令式编程类型相比,SQL SELECT语句的使用常被称为声明式编程。
示例19-执行计划的示例IR
图8是用于示例程序的示例执行计划的IR 800的框图。由于尚未执行提升或沉降操作,因此它也可称为原始执行计划。
类似于IR 700,在IR 800中,第一基本块810由图中的节点表示并连接到第二节点——循环头块820。循环头块820还连接到两个节点——循环体块830和退出块840。基本块810内是多个语句815,其中包括语句s2和s3。这些语句在循环外,因为它们不在循环体块830内。循环体块830内是多个语句835,其中有语句s9。这些语句835-包括语句s9-被认为是在循环内,因为它们位于循环体块830内。
能够对中间表示800执行各种操作以实现列举。例如,提升和沉降操作能够用于在IR内移动语句。实际上,语句不能在IR内无差别地移动,因为这样的移动可能导致得到的图不正确(例如,所表示的操作不能实现与原始的相同的结果)。
然而,在保持程序正确性的同时能够执行许多操作。其中有提升和沉降操作、以及查询内联,其中的每一个都在本文中更详细地描述。
示例20-示例提升操作
图9是在对来自图8的中间表示的语句执行提升操作之后的示例IR 900的框图。通常,循环不变(invariant)语句能够被“提升”到循环外(移动到循环外部),如果它们具有循环的幂等性的话(无论循环被迭代多少次,它们的输出都不会改变)。循环不变语句在下面进一步描述。
与IR 800类似,IR 900具有由图中的节点表示并连接到第二节点——循环头块920的第一基本块910。循环头块920还连接到两个节点——循环体块930和退出块940。在基本块910内是多个语句915,其中包括语句s9。在IR 800中,如图所示,s9先前在循环中作为语句835。但是,它已经被“提升”到循环外。在提升操作中,“提升”语句通常附加在循环前面的块(这里是基本块910)中的最后一个语句之后。在一些情况下,可以存在多个“可提升”语句,并且如果它们被识别为“可提升”语句则可以类似地被放置在前面的块中。
示例21-识别可提升语句的示例系统
图10示出了识别给定语句是否可提升(例如,能够在保持程序正确性的同时被提升)的示例系统1000。在该示例中,计算环境1000能够包括中间表示1010,其能够包括多个SQL语句、以及包括至少一个循环的多个命令语句。IR 1010能够由提升识别器1050处理。提升识别器还可以将示出语句之间的依赖的数据依赖图1030(本文进一步描述)作为输入。然后,提升识别器1050可以,诸如通过执行下面描述的示例方法,来识别一个或多个可提升语句的集合1090,并且返回可提升语句的集合1090作为输出。
实际上,能够逐个检查单个语句以查看它们是否是可提升的。
示例22-识别可提升语句的示例方法
图11是识别中间表示中的循环中的给定语句或语句集合是否可提升的示例方法1100的流程图。操作1100开始于1110,诸如通过接收包括至少一个循环的程序的中间表示。IR能够包括多个语句,其在一些情况下能够包括多个声明式结构化语言查询(SQL)语句、以及包括至少一个循环的多个命令语句。在1120,生成可提升语句(H')的空集合。在1130,检查循环中的每个语句,以确定它是否依赖于循环中、除了先前添加到H'的那些语句之外的任何其他(多个)语句。在1140处,如果对于给定语句而言不存在这样的依赖,则将该语句添加到H'。在1150,重复1130和1140的过程,直到已经评估了循环中的语句。一旦已经评估了语句,在1160,返回可提升语句H'的集合。如果给定IR中存在多个循环,则能够针对每个这样的循环重复该相同过程,直到所有循环都已穷举。
在一些示例中,能够对循环内包含的SELECT语句执行该过程,并且能够在循环边界内识别对循环边界内的任何其他语句没有任何依赖的一个或多个SELECT语句,并是因此将这一个或多个SELECT语句认为是可提升语句。在某些情况下,可能存在多个这样的语句。在更进一步的情况下,可以使用该过程将循环内的所有SELECT语句识别为可提升语句。
示例23-示例沉降操作
图12是在对来自图8的中间表示的语句执行沉降操作之后的示例IR 1200的框图。通常,如果满足以下各项,则循环外的语句能够“沉降”到循环内(移动到循环内):a)循环中存在依赖于循环外的语句的一个语句,并且b)没有干扰语句(即如果循环外的语句被移动到循环中的消费(consuming)语句之前的话,可能会影响所述循环外的语句的结果的循环外的其他语句)。本文进一步描述了数据依赖,其包括流依赖和干扰语句。
与IR 800类似,IR 1200具有由图中的节点表示并连接到第二节点——循环头块1220的第一基本块1210。循环头块1220还连接到两个节点——循环体块1230和退出块1240。循环体块1230内有多个语句1235,其中有语句s2和s3。在IR 800中,如图所示,s2和s3先前在循环外作为语句815。然而,它们已经“沉降”到循环内。在沉降操作中,“沉降”的语句通常放置在循环中的使用它们的语句(在这种情况下,循环体块1230内的其他语句)之前——并且在可能的情况下与循环中的使用它们的语句内联。在某些情况下,只存在一个这样的“可沉降”的语句,而在其他情况下,可能存在两个或更多这样的语句。在一些情况下,可能存在用于执行沉降操作的多个选项,并且可以执行列举所有这样的备选的过程,诸如准备沉降子图,如本文进一步描述的。
示例24-识别可沉降语句的示例系统
图13示出了识别给定语句或语句集合是否可沉降(例如,能够在不破坏程序正确性的情况被沉降)的示例系统1300。在该示例中,计算环境1300能够包括中间表示1310,其能够包括多个SQL语句、以及包括至少一个循环的多个命令语句。IR 1310能够由沉降识别器1350处理,其中沉降识别器1350能够将数据依赖图1330作为输入,并且能够诸如通过执行下面描述的示例方法,使用数据依赖来识别一个或多个可沉降语句。在这样做时,沉降识别器能够列举并返回一个或多个沉降子图1390A-N作为输出,所述一个或多个沉降子图1390A-N反映可以被沉降到循环内的可沉降语句的不同潜在组合。
不同的子图可以导致不同的语句集合被沉降到循环中。不同的沉降操作可以导致不同的或备选的执行计划,并且可以单独地评估备选执行计划以确定相比于在执行相应的沉降操作之前在的执行计划而言在最小化计算资源方面的相对益处,如本文进一步描述的。
示例25-识别可沉降语句的示例方法
图14是识别给定语句是否可沉降(例如,能够在保持程序正确性的同时被沉降)的示例方法1400的流程图。操作1400在1410处通过接收包括至少一个循环的程序的中间表示开始。IR能够包括多个语句,其在一些情况下能够包括多个声明式结构化语言查询(SQL)语句、以及包括至少一个循环的多个命令语句。在一些情况下,这个IR可以是从中间表示得到的初始执行计划,而在其他情况下,这个IR可以是通过对所接收的程序的中间表示执行所有可能的提升操作而生成的初始执行计划。
在1420处,生成可沉降语句(S')的空集合。
在1430处,检查循环中的每个SELECT语句S,以识别是否存在由S直接或间接地使用的在循环外的语句T。
在1440处,对于在1430中识别的语句T确定是否存在任何干扰语句,如果不存在,则将T添加到可沉降语句S'的集合。在1450处,重复该过程,直到已经评估了循环中的语句S。一旦确定已经评估了语句,在1460处就返回可提升语句S'的集合。
在执行该方法时,可沉降语句S'的集合可以包括一个或多个沉降子图,其反映可以沉降到该循环中的可沉降语句的不同潜在组合。这些沉降子图中的每一个可以表示可以沉降到循环中的可沉降语句的不同子集。这些不同的潜在沉降操作中的每一个可以导致不同的或备选的执行计划,并且可以单独地评估这些备选执行计划中的每一个,如本文进一步描述的,以确定其相比于在执行相应的沉降操作之前的执行计划而言在最小化计算资源方面的相对益处。
在一些情况下,识别循环边界外的由循环边界内的至少一个SELECT语句使用的、不存在对于其的干扰语句的语句T包括:确定将语句T移动到循环边界内将不会影响该语句的操作,所述影响该语句的操作诸如通过由于一个或多个干扰语句(例如,T也对其具有依赖的语句)的存在而改变其输出。在某些情况下,识别这样的语句T包括识别多个语句T。
在一些情况下,中间表示可以包括多个循环,并且可以针对循环中的每个重复该程序。在一些实例中,所述操作可以包括识别可以将循环沉降到其中的两个不同循环,并且所述两个不同循环中的任一个返回针对每个循环的可沉降语句的集合,其中所述返回包括沉降语句T,或者,在一些情况下,所述操作可以包括:识别将循环沉降到所述循环中的哪一个是最高效的,诸如通过评估预期通过执行将语句移动到第一循环的沉降操作来实现的计算资源的估计益处、和预期通过执行将语句移动到第二循环中的沉降操作来实现的计算资源的估计益处,以及识别提供最优的相对的预期的计算资源的益处的沉降操作,诸如使用本文进一步描述的技术。
示例26-查询内联示例
在本文的示例中的任何一个中,查询内联可以合并到查询执行计划中。实际上,该计划表示提出的查询内联,并且能够基于内联来估计计算执行资源需求。
为了优化程序中的声明式查询语句,存储的程序能够提供称为“查询内联”(或简称为“内联”)的特征,该特征将具有数据依赖的查询语句放置于单个查询内,或者“内联“他们。SQL内联能够通过应用更多查询优化规则来改进查询计划的质量。这样的扩展允许通过将复杂查询划分为多个更小且易于理解的查询来管理复杂查询。将划分的查询的结果赋值给表格变量,并且通过这些表格变量组合划分的查询以具有与原始复杂查询相同的语义。这样的扩展先前还未应用于具有循环和条件逻辑的命令式程序代码。
查询内联能够有利地应用于具有循环和/或条件逻辑的命令式程序代码。为此,优化技术能够考虑传统的编程优化和内联查询的执行计划两者。考虑到声明式查询语句和命令式程序代码,查询内联在应用于交叉优化技术时会带来挑战。并且,重写与查询语句混合的命令式程序代码以改进查询的执行计划可能是困难或耗时的。因此,解决方案能够集中于命令式程序代码内的循环优化,因为程序中的循环占据程序的总体计算执行资源需求的大部分。
循环不变代码运动优化通过将包含在该循环内的循环不变代码移动到循坏外来改进程序的性能。然而,在循环外的查询被内联到循环中的查询时,某些情况下也能够改进程序的性能。虽然这样的方法可能看似违反直觉,因为将循环外的程序移动到循环内可能导致该程序被迭代很多次,这似乎效率较低,但是在某些情况下查询内联到分析查询中能够增强内联的查询的执行计划的质量,这将在本文中更详细地描述。
查询语句内联(本文有时称为“SQL语句内联”)能够增强用于内联的语句的执行计划的质量。如果独立地执行查询,则仅考虑每个关系运算符来执行查询优化。但是如果内联多个查询,则在更广泛的搜索空间中执行查询优化,因为能够包括许多运算符。能够在内联的语句上应用各种优化规则,诸如连接重新排序(join reordering)、谓词下推(predicatepush down)和分组简化(group by simplification)。通常,如果两个查询语句具有流数据依赖(在本文中进一步说明),则它们能够被内联并且作为单个查询被执行。
图15是示出使用内联来组合两个查询的方法1500的流程图。用于第一查询v1的第一查询执行计划在1510处示出。用于第二查询v2的第二查询执行计划在1520处示出。内联的执行计划1530示出了用于被内联的查询v1和v2的查询语句的优化执行计划。在本文提供的详细示例中提供了关于查询语句内联的进一步细节。
在一些情况下,可以执行内联以将作为先前的沉降操作的对象的语句内联到循环边界内的其使用语句中。
图16是用于识别能够被内联的语句并且内联所识别的语句的示例方法1600的流程图。操作1600通过接收包括多个选择语句和至少一个循环1610的程序的中间表示开始。在一些情况下,这可以是初始执行计划,而在其他情况下,它可以是对通过执行例如如本文所述的沉降操作列举的备选执行计划中的一个或多个执行的内联。在1620处,识别IP中的一个或多个SELECT语句。在1630处,对于在1620处识别的每个SELECT语句,可以识别依赖于该语句的语句,其在此称为“使用语句”。在本文提供的详细示例中进一步讨论了使用语句。可以只在存在单个使用语句的情况下执行查询内联。如果存在多个这样的语句,则内联到使用语句中的一个可能会导致不正确的输出。在1640处,对于每个识别的、针对其仅识别了单个使用语句的SELECT语句,所识别的SELECT语句被内联到其使用语句中。
在一些实例中,诸如通过下面描述的方法识别多个语句,其中所述多个语句中每个仅具有一个使用语句,并且所述多个语句中的每个内联到其使用语句。我们注意到,通常,将循环外的语句与循环内的语句内联会导致不必要的计算。然而,我们观察到,特别是在本文描述的示例中,取决于查询优化和循环迭代的数量,能够从SQL内联得到益处,所述示例利用沉降操作和SQL内联来提供相对计算执行资源需求益处,所述益处可以使用计算执行资源需求估计来确定,如本文进一步描述的。
示例27-内联的示例应用
在本文的示例中的任何一个中,内联能够应用于已经如本文所述被沉降的语句。例如,已经将查询语句沉降到循环中之后,所述查询语句能够有可能与循环中的另一语句内联(例如,接近沉降的语句)。这样的查询内联能够改进程序的相对性能(例如,与其中查询未被内联的查询执行计划候选相比)。
示例28-另一执行计划的示例IR
图17是用于示例程序的另一示例执行计划的IR 1700的框图,这次提供多个循环和嵌套循环。由于尚未执行提升或沉降操作,因此它也可称为原始执行计划。
类似于IR 800,第一基本块1710由图中的节点表示并连接到第二节点——第一循环头块1720。同样类似于IR 800,第一循环头块1720还连接到两个节点。第一个是第一循环体块1730。与IR 800中的出口块不同,第二个是第一循环条件块1770。又与IR 800不同的是,第一循环体块1730本身还连接到第二循环头块1740,第二循环头块1740进一步连接到两个节点——第二循环体块1750和第二循环条件块1760。该中间表示计划表示所谓的“嵌套循环”,即放置在其他循环中的循环,如本文提供的详细示例中进一步讨论的。
在第一基本块1710内是多个语句1715,其中包括语句s1。这些语句既在第一循环外(因为它们不在第一循环体块1730内)又在第二循环外(因为它们也不在第二循环体块1750内)。在第一循环体块1730内是多个语句1735,其中有语句s3。这个语句被认为是在第一循环内,因为它位于循环体块1730内。第二循环体块1750还包含多个语句。
除了表示各种块和块内的语句外,IR 1700还展示各种语句之间的多个依赖1780。如本文所述,在生成示出了包含在中间表示中的语句之间的各种依赖的数据依赖图时可以考虑这些依赖。这里,这些依赖在IR 1700中被覆盖,如图示的依赖1780。所示示例中的特定依赖是流依赖,但是应该理解其他依赖-包括直接和间接依赖-可能存在,并因此可能影响可以对IR 1700中示出的语句执行的各种操作。
与IR 800一样,能够执行各种操作以实现列举。例如,如本文进一步描述的,提升和沉降操作可用于在IR内移动语句。另外,还可以执行查询内联以最大化由本文描述的示例提供的计算系统资源的益处。
示例29-示例初始执行计划
图18是在对来自图17的中间表示的语句执行提升操作之后的IR 1800的框图,其可以被称为初始执行计划。
与IR 1700类似,第一基本块1810由图中的节点表示并连接到第二节点——第一循环头块1820。第一循环头块1820还连接到两个节点——第一循环体块1830和第一循环条件块1870。第一循环体块1830本身还连接到第二循环头块1840,第二循环头块1840进一步连接到两个节点——第二循环体块1850和第二循环条件块1860。
在第一基本块1810内的是多个语句,其中包括语句s1 1812和s3 1815。这些语句既在第一循环外(因为它们不在第一循环体块1830内)又在第二循环外(因为它们也不在第二循环体块1850内)。
在IR 1700中,s3先前在循环中作为语句1735。然而,如图所示,它已经被“提升”到循环外,使得它现在在第一基本块1810内。在提升操作中,被“提升”的语句通常附加到循环前面的块(这里,第一基本块1810)中的最后一个语句之后。在提升之后,只有一个语句s4保持在第一循环体块1830内。
第二循环体块1850还包含不受提升影响的多个语句。
注意,尽管进行了提升,但各种语句之间的依赖1880保持不变。现在在诸如通过生成多个沉降子图(如本文进一步描述的)列举一个或多个备选执行计划时,能够考虑这些依赖(在一些情况下,具有未示出的附加依赖)。
示例30-示例备选执行计划
图19是在从图18中的初始执行计划中沉降多个可沉降语句之后的IR 1900的框图。IR 1900可以被称为“备选执行计划”。虽然在所示的示例中提供了完整的中间表示,但是应当理解,备选执行计划不需要表示整个中间表示,而是可以例如仅包括受给定操作(例如本文描述的沉降操作)影响的那些语句和/或循环。
与IR 1800类似,第一基本块1910由图中的节点表示并连接到第二节点——第一循环头块1920。第一循环头块1920还连接到两个节点——第一循环体块1930和第一循环条件块1970。第一循环体块1930本身还连接到第二循环头块1940,第二循环头块1940还连接到两个节点——第二循环体块1950和第二循环条件块1960。
在第一基本块1910内不再存在多个语句,而是仅存在单个语句s0。先前的语句s11812和s3 1815位于第一循环外,但是,如图所示,它们现在已经分别被沉降到第一循环体块1930内作为语句1932和1935。
在沉降操作中,被“沉降”的语句通常被放置在循环中的使用它们的语句(在这种情况下,第一循环体块1930内的其他语句)之前——并且在可能的情况下与循环中的使用它们的语句内联。在一些情况下,只有一个这样的“可沉降”语句可以存在,而在其他情况下(诸如在这个情况下),可以存在两个或更多个这样的语句。在一些情况下,能够存在用于执行沉降操作的多个选项,并且可以执行列举所有这样的备选的过程,诸如准备沉降子图,如本文进一步描述的。
第二循环体块1950还包含不受沉降影响的多个语句。
注意,尽管存在沉降,但各种语句之间的依赖1980保持不变。
示例31-示例列举沉降子图
图20是用于由IR 800表示的示例性程序的示例沉降子图(SG)2000的框图2000。沉降子图(SG)是用于考虑可以在数据依赖图(DDG)中表示的如本文进一步描述的其相对数据依赖来选择要沉降的查询的结构。例如,可以基于识别IR 800的DDG(未示出)的所有可沉降语句来生成沉降子图。IR 800中的可沉降语句S2、S3、S4、S5、S6、S7和S8被示为节点2010,其由SG 2000内的有向边2020连接,并且可以从SG 2000提取,并且沉降到循环中,如本文进一步描述的。有向边指示哪些语句“使用”其他语句(例如,依赖于其他语句的输出)。因此,从第一语句X指向第二语句Y的箭头指示Y使用(例如,依赖于)X。
能够通过发现第一可沉降查询(其可以是循环内的给定语句所依赖的循环不变查询)、然后将边扩展到与其相关的那些其他可沉降语句,根据DDG来列举沉降子图。可以递归地重复这个过程以列举所有沉降子图,直到不再有要扩展的边。在下面提供的详细示例中进一步描述了沉降子图。
为了发现所有沉降子图,可以使用诸如在频繁子图挖掘中使用的模式增长方法,通过按深度优先顺序一次添加一个边来扩展子图,并且列举其他沉降子图直到已经为给定的循环列举了所有潜在的子图。对于给定的循环,可以存在多个沉降子图,这取决于其中包含的各种语句之间的依赖。在这样的情况下,能够生成多个查询执行计划以反映每个单独的沉降子图。
为了发现给定IR的所有沉降子图,可以通过使用有序遍历发现所有循环体块并构建数据依赖图。然后,对于每个循环体块l,列举所有沉降子图。然后,根据需要,可以针对多个循环重复该过程。然后能够评估这些各种沉降子图,以确定其中表示的沉降操作中的哪个将为计算资源提供最大益处,如本文所述。
图21是可用于发现上述示例程序的所有沉降子图的示例搜索空间树2100的框图。在所示示例中,列举算法能够从包含语句S8的节点2110开始搜索,并且将一个边扩展到其邻居节点2120S7以访问相应的语句。类似地,算法继续从一个节点遍历到另一节点,直到它访问到没有邻居的节点。一旦该过程完成,就识别出一个沉降子图,在所示的例子中,该沉降子图是图20所示的沉降子图2000。
示例32-示例相对计算执行资源需求估计
图22是用于估计给定备选查询执行计划的相对计算执行资源需求的示例方法2200的流程图。操作2200通过接收反映沉降操作的备选查询执行计划而在2210开始。在2220,计算已经执行了到其的沉降的给定循环的估计计算资源(CR')。例如,可以通过将用于循环的给定迭代的资源乘以循环的迭代数量来执行这个步骤。在2230,在执行沉降之前的给定循环的估计计算资源(CR)被计算(诸如通过上面步骤2220中描述的示例计算),并且被添加到用于循环外的被沉降的语句的估计计算资源中。在2240,确定CR和CR'之间的差异(如果有的话)。能够将这样的差异视为对所讨论的沉降操作的计算资源的相对益处。在2250处,能够返回这个相对益处作为该方法的输出。
虽然在所示示例中,这个方法是对沉降操作执行的,但是应该理解,能够使用类似的方法来确定本文描述的其他示例性操作(诸如提升或查询内联)的相对计算益处。
示例33-最优执行计划确定示例
在选择最优查询执行计划时,能够在各种备选执行计划之间比较在计算执行资源需求方面的相对益处。在某些情况下,最优计划能够被简单地识别为使用最少量的计算资源的计划,在某些情况下,该技术能够是各种备选方案中具有计算执行资源需求的最大相对益处(诸如在上面的示例计算执行资源需求估计2200中识别的相对计算执行资源需求益处)的执行计划。本文使用的术语“最优”、“优化的”等不一定意味着理论上最好的可能备选,而是可以简单地是两个备选方案中的更好的一个,或者有限数量的列举的备选中最好的。
示例34-实施具有声明式查询构造和命令式代码的程序
的优化的另一示例方法
图23示出了能够被执行以优化具有声明式查询构造(例如,查询语句)和命令式代码的程序的操作2300的另一示例。
操作2300开始于2310,诸如通过接收描绘包括多个语句的计算机实施的程序的中间表示图。在一些情况下,多个语句中的至少一个语句具有对多个语句中的另一语句的数据依赖,并且其中该程序还包括循环。
在2315,识别“可提升”语句,其能够包括识别多个语句中的、在循环的边界内的能够被移动到循环边界外的至少一个语句,如本文进一步描述的。在2320处,在2315中识别的(多个)语句被提升到循环边界外以生成反映提升的初始执行计划。在某些情况下,在有可能生成多个提升操作的情况下,能够生成多于一个的初始执行计划,如本文进一步描述的。
在2325处,识别“可沉降”语句,其能够包括识别多个语句中的在循环边界外的能够被移动到循环边界内的至少一个语句,如本文进一步描述的。在2330,生成备选执行计划,其表示将在2325中识别的(多个)语句中的每个沉降到循环中,即,沉降到循环边界内。在2335,确定能够将多个语句中的哪一个内联到其他语句中,并且在适用的情况下,在2340处执行内联。
在2345,生成用于执行相应备选执行计划的计算执行资源需求的估计。在2350,选择输入程序的最优执行计划以用于执行,诸如通过比较在2345处生成的估计来确定初始执行计划和备选执行计划中的具有最低的估计的计算执行资源需求的执行计划。在一些情况下,随后可以编译和执行这个最优执行计划,如本文进一步描述的。
示例35-示例编译程序
在本文的示例中的任何一个中,能够根据所选择的查询执行计划来编译输入程序。实际上,选择的查询执行计划能够提供执行编译时将语句放在何处的概要,而不是完整的查询执行计划。然后能够基于这样的概要和/或原始输入程序来构造实际的查询执行计划。
编译能够以各种方式完成。例如,能够生成实际的机器代码或字节代码以在真实的机器或虚拟机上执行,能够生成较低级别的语言以用于进一步编译,或者能够生成更高级别的指令以用于解释。能够支持即时和其他编译场景。
示例36-示例执行程序
在本文的示例中的任何一个中,接下来能够在数据库环境中执行编译程序以实现其中的计算(例如,生成结果)。因为该程序已被优化,所以与原始的未优化程序相比,这样的执行所消耗的计算资源减少了。资源利用率改进的示例如下所示。
示例37-示例详细实施方式
为了提供关于本文公开的概念的进一步细节,提供了更详细的示例。本文描述的技术能够应用于本文描述的其他示例中的任何一个或多个。
在现代企业应用中,数据分析包括具有复杂分析查询的迭代任务。存储的程序被用于使用控制流逻辑来表示那些复杂的分析查询。优化复杂的程序要求理解命令式编程语言以及声明式SQL查询语言。因此,考虑到程序优化技术和SQL优化技术两者的统一优化技术对于实现最优查询性能是必要的。查询运动的新概念允许SQL查询被移入和移出循环边界,这与仅在循环外移动代码的现有的循环不变代码运动技术不同。然后,基于查询运动来描述新颖的统一优化技术,以便在存储的程序中进行高效的迭代查询处理。能够列举查询运动的各种可能性以生成备选执行计划,并利用考虑到分析查询和循环迭代的执行计划的质量的新的计算执行资源需求(有时称为“成本”)模型来选择最优查询执行计划。使用标准决策支持基准的实验结果表明,与现有的循环不变代码运动算法相比,基于成本的查询运动算法可实现高达7倍的高效率。
关系数据库管理系统(RDBM)中的商业逻辑被表示为命令式编程构造和声明式结构化查询语言(SQL)查询的组合。为了支持该表示,许多RDBMS提供不同语言的存储的程序或用户定义函数(UDF),所述语言诸如PL/SQL、SQL脚本、和T-SQL。典型地,存储的程序和UDF通常用于线上交易处理(OLTP)系统中的数据操纵,因此程序优化主要集中在具有相对简单的SQL查询、数据操纵语言(DML)和命令逻辑的OLTP工作负载上,例如,TPC-C。
然而,由于在单个程序中使用具有命令式构造的复杂分析查询变得流行,因此对声明式SQL查询和命令式程序的处理提出了重要的优化问题。现代商业应用的程序通常过于复杂而无法优化。例如,在典型的应用中,SQL脚本程序的复杂度非常高。例如,物料需求计划(MRP)程序能够在单个程序中涉及大约100个连接(join)操作,100个分组(group by)操作和2个循环。
已经隔离并分开研究了用于存储的程序的传统优化方法。虽然声明式SQL优化已得到改进,但命令式代码优化依赖于传统的基于编译器的优化,例如,常量传播和死码消除。一些研究已经专注于将命令式代码转换为声明式SQL,以便利用声明式优化。虽然这些方法提供了一些性能改进,但使用转换能够改变的命令式代码和查询是有限的。因此,需要改进的程序优化,特别是对于包括具有命令式构造的分析查询的计算机实施的程序而言。
为了优化程序中的声明式SQL,存储的程序能够提供称为SQL内联的特征,其将具有数据依赖的查询放置在单个查询内,或者“内联”它们。SQL内联能够通过应用更多查询优化规则来提高查询计划的质量。这些扩展允许专家通过将复杂查询划分为多个更小且易于理解的查询来创建和管理复杂查询。将划分的查询的结果赋值给表格变量,并且通过这些表格变量组合划分的查询以具有与原始复杂查询相同的语义。然而,这些扩展先前还没有应用于具有循环和条件逻辑的命令式程序代码。
在本公开中,SQL内联有利地应用于具有循环和/或条件逻辑的命令式程序代码。为此,优化技术能够考虑传统编程优化和内联查询的执行计划两者。SQL内联在应用于考虑到声明式SQL和命令式程序代码的交叉优化技术时会带来挑战。并且,程序员手动重写与SQL查询混合的命令式程序代码以改进查询的执行计划可能是困难的或耗时的。因此,可以专注于提供专注于命令式程序代码内的循环优化的解决方案,因为程序中的循环占据程序的总体计算执行资源需求的大部分。
循环不变代码运动优化通过将包含在循环内的循环不变代码移动到循坏外来改进程序的性能。然而,已经确定了,在循环外的查询被内联到循环中的查询时,某些情况下也能够改进程序的性能。虽然这个方法可能看似违反直觉,因为将循环外的程序移动到循环内可能导致该程序被迭代很多次,这似乎效率较低,但是在某些情况下SQL内联到分析查询中能够增强内联的查询的执行计划的质量,这将在本文中更详细地描述。在考虑循环不变代码的运动时,能够观察以下场景:
i.循环外的查询被移动到循环中。我们称此运动为沉降。如果循环外的查询与循环中的查询内联,则内联的查询的执行计划质量被改进。例如,如果循环中的查询中存在选择性连接(selective join)操作,则连接操作重新排序规则被应用以降低循环外的查询的连接操作的成本。
ii.循环中的循环不变查询被移动到循环外。能够称这个运动为提升。如果将循环不变查询移动到循环外并且与外部的查询内联,循环外的查询的执行计划质量被改进。此外,这个查询运动通过移除用于循环不变查询的冗余迭代执行来改进循环的性能。
iii.通过将循环不变查询与循环中的其他查询内联,改进循环中查询的执行计划质量。
本文描述的是一种新的循环代码运动优化技术,其考虑了所有上述查询运动场景。在本公开中,我们提出了考虑这些查询运动场景中的每一个的在存储的程序中进行的高效迭代查询处理的优化技术。一种优化技术能够描述新的计算执行资源需求模型(例如,用来估计需求),其考虑查询处理器的查询执行成本和循环成本,以基于其成本确定用于提升和沉降的语句。一种技术能够通过使用模式增长方法发现用于提升和沉降的所有语句。基于来自TPC-DS基准的真实世界示例的实验结果表明,与当前的技术水平相比,在执行时间方面有显著改进。
为了改进现有的编程优化技术,我们需要分析程序的控制流和数据依赖。数据依赖是指语句的执行如何影响另一语句的执行结果。在本公开中,能够将SQL结构扩展到传统编译器中使用的中间表示(IR)结构,以分析关于程序的控制流和数据依赖。能够使用该IR结构-在本文中有时称为IR图-作为程序的执行计划。
表1描述了在本公开中频繁使用的一些符号:
表1:符号
用于存储的程序的执行计划的中间表示(IR)
在该部分中,能够将用于存储的程序的中间表示中的符号形式化。基本块B是直线语句序列(si1,si2,...sin),其除了在入口处没有分支并且除了在出口处没有分支。赋值语句s表示为2元组(vs,es),其中es是表达式,vs是赋值es结果的变量。如果es是用于选择查询的表达式,则查询执行的结果将被赋值给vs。在这样的情况下,该语句被称为SQL赋值语句,并且vs称为表格变量。如果es没有结果,则vs具有值。
IR图表示用于程序中语句的控制流。IR图IG是有向图,其表示为4元组(B,E,L,l),其中B表示基本块的集合,表示边的集合,L表示标签的集合,并且l:N∪E→L表示将标签赋值给节点和边的函数。每个节点n∈N表示基本块B。一对顶点ni和nj的边表示一对基本块Bi和Bj之间的控制流。为了简化所有数据依赖,IR图被表示为单个静态赋值(SSA)形式,它要求每个变量只被赋值一次。
IR图还表示命令式程序代码,诸如条件代码和循环代码。条件代码被表示为三个基本块:条件块、真块和假块。条件块具有逻辑语句和分支语句。逻辑语句包含逻辑运算符,并且逻辑语句为变量赋予真值或假值。分支语句根据逻辑变量指示下一个要执行的基本块。为了表示控制流,将条件块连接到IR图上的真块和假块。循环代码被表示为两个基本块:循环头块、循环体块,在本文中能够被称为循环边界或“循环内部”(与能够被称为“在循环边界外”或“在循环外”的在循环体块外部的代码相对)。循环头块具有逻辑和分支语句以决定迭代数量。为了表示控制流,循环头块连接到IR图上的循环体块和其他块。循环体块也连接到循环条件块。
程序1(示例SQL脚本)(下面引用的语句号(s0)被示出在中括号[]中):
图8表示用于程序1的程序的执行计划,其能够被称为“原始执行计划”。由于从si到s7的语句没有分支,所以这些语句被分配给基块B1。将B2中的逻辑语句s8插入循环条件块B2以检查循环条件是否为i<k-1。语句s9、s10、s11和s12(程序1中的第10行和第13行查询)被添加到循环体块B3。然后,我们向B4添加一个exit语句来终止程序,因为在循环执行后不再有要执行的语句。为了表示循环的控制流,B2被连接到B3和B4两者。
数据依赖分析
应该考虑查询之间的数据依赖以执行查询运动和内联。数据依赖图(DDG)解决了这个重新排序问题。DDG是有向图,其被表示为4元组(V,E,L,l),其中V表示节点的集合,是边的集合,L是标签的集合,并且1:V∪E→L表示将标签分配给节点和边的函数。节点v∈V表示语句或表格或输入参数。如果在一对节点vi和vj之间存在数据依赖,则我们将该对节点连接到边e。e的方向和标签分别表示数据依赖方向和类型。数据依赖图能够包括许多不同类型的数据依赖,诸如流依赖(FD,写后读)、反依赖(AD,读后写)、输出依赖(OD,写后写)和输入依赖(ID,读后读)。考虑到SQL语句的依赖也必须在DDG中表达,因为存储的程序包含SQL查询以及算术表达式。因此,我们通过考虑查询的读/写操作和查询中的表格变量来连接边。
我们提出的循环优化算法通过仅考虑读取和写入数据依赖来执行循环不变代码运动和SQL语句内联。我们在箭头上在依赖类型后面使用+符号来表示DDG包含从一个语句到另一语句的、只有该依赖类型的边的路径。
例如,是指包含从s1到s3的、仅具有流类型依赖的边的路径的DDG。
SQL语句内联
SQL语句内联增强了内联语句的执行计划的质量。如果独立地执行查询,则仅考虑每个关系运算符来执行查询优化。但是如果内联多个查询,则在更广泛的搜索空间中执行查询优化,因为许多运算符能够被包括。能够在内联语句上应用各种优化规则,诸如连接重新排序(join reordering)、谓词下推(predicate push down)和分组简化(group bysimplification)。
如果两个SQL语句具有流数据依赖,则能够将它们进行内联和作为单个查询执行。能够使用公共表格表达式(CTE)语句来表示内联的语句。我们如下定义SQL语句内联。
定义1.(SQL语句内联)
设s1=(v1,q1)a和s2=(v2,q2)为两个语句。当且仅当时,SQL语句内联将q2中v1的引用替换为q1。然后我们将s2定义为内联的语句。
图15表示用于程序2的v1和v2的所有执行计划。我们假设图15中B1和B3中的所有语句分别用s=(v1,e1)和内联。分组操作由表示。执行计划s 1510和执行计划1520分别显示了s和的优化执行计划。内联的执行计划1530显示了用于内联的v1和v2的SQL语句的优化执行计划。由于v2对于由v1的查询访问的表格中的date_dim表具有谓词dyear=2000^dyear=2001,因此σdyear=2000^dyear=2001操作被下推到以创建更优化的查询计划。
示例程序2:
v1=Select count(*)cnt,d.d_year,d.d_date,
it.i_item_sk,it.i_item_desc from store_sales ss,
date_dim d,item it where ss.ss_sold_date_sk=
d.d_date_sk and ss.ss_item_sk=it.i_item_sk and
d.d_year=2000 and d.d_year=2001 group by
d_year,d_date,i_item_sk,i_item_desc;
v2=Select v1.cnt,v1.d_year,v1.d_date,
v1.i_item_sk,v1.i_item_desc from:v1 v1
where v1.d_year=2000 and v1.d_year=2001
group by v1.cnt,v1.d_year,v1.d_date,
v1.i_item_sk,v1.i_item_desc having sum(cnt)=3;
在针对s1=(v1,el)和s2=(v2,e2)的SQL内联期间,我们需要检查两个语句之间的数据依赖。如果在读取s1语句之前对另一语句中的s1或v1中的表格执行了更新或插入或删除语句,则在具有写操作的语句之前执行s1中的查询el。因此,如果通过将s1内联到s2中来执行查询,则查询结果被改变。例如,假设在执行程序2中的v2之前,插入语句将一些行插入store_sales表格。如果v1被内联到v2,则v2的查询结果无效,因为在执行v1之前store_sales表格被更新。如果语句s1和s2是选择语句,则在数据依赖图中对应于s1和s2的两个节点之间存在路径。如果该路径中的语句不具有对其他语句的写入依赖,则我们应用SQL语句内联。
我们注意到将循环外的语句与循环内的语句内联可能导致不必要的计算。然而,我们观察到源于SQL内联的益处,其取决于查询优化和循环迭代数量。因此,我们不将外部循环语句内联到内部循环SQL语句中。而是通过查询运动将具有益处的查询移动到循环内部,并应用SQL内联。我们将在下面更详细地讨论这个问题。
查询运动
由于分析查询由大量关系运算符组成,因此查询执行计划极大地影响执行时间。SQL语句内联提供了通过将具有数据依赖的查询内联到单个查询中来进一步应用优化规则的机会。为了利用SQL语句内联,应将具有依赖的查询一起放在循环内。另一方面,循环中的幂等查询(即,其结果不依赖于循环的迭代的查询)由于冗余迭代而具有低效率。因此,需要精准的查询移动算法,其在减少循环中查询的重复的同时通过SQL语句内联来改进查询执行计划的质量。
在本节中,我们首先考虑SQL和程序优化两者来定义查询运动的概念。通过使用这些定义,在以下部分中,我们提出了一种新的算法,该算法发现具有最高益处的执行计划。通过基于查询估计成本的查询运动的益处来估计执行计划的益处。
由于SQL语句内联,查询运动方法、提升和沉降改变查询执行计划。我们通过执行提升或沉降运动来列举执行计划,并通过执行SQL语句内联来优化分析查询。
提升运动
在本节中,我们扩展了传统的循环不变代码运动技术,以便它能够与SQL语句一起使用。给定循环l,如果循环不变语句对l具有幂等性,则其能够从l中将所述循环不变语句提升出去。我们将循环不变语句用公式表示为以下定义。设Bl为用于循环l的循环体块,并且设Bp为循环头块的前面的基本块。
定义2.(循环不变语句)
设l是循环,并且让s=(vs,es)成为SQL语句。然后,当且仅当以下语句为真时,我们将s定义为用于l的循环不变语句。这里T是在es的FROM子句中访问的所有表格的集合。
·es对l中的语句没有任何流依赖或输入依赖。
引用t∈Bl的语句s'是循环不变的。
定义3.(可提升语句)
设l为循环,让s=(vs,es.)为SQL赋值语句。可提升语句s是循环体块B1内的循环不变语句。
我们用公式表示用于可提升语句的集合H的提升运动。给定B1中的可提升语句的集合H和执行计划IG,提升运动将每个s∈Bl移动到Bp,是B1的前面的块,并且被表示为HM(H,IG)。我们在Bp中的最后一个语句后面附加s。
图9表示用于程序1的通过提升运动的可能执行计划之一。s9是循环不变语句。在S中,s9被提升到Bl中的s7的后面。
沉降运动
定义4.(可沉降语句)
设l为循环,并且设s为SQL赋值语句。当且仅当时,语句s是可下降的。
我们用公式表示用于沉降运动的可沉降语句。给定可沉降语句的集合S、循环体块B1和执行计划IG,沉降运动将S中的每个语句s移动到B1中。S紧邻在Bl中相应的依赖语句之前被插入。
给定循环l,我们分别将可提升语句的集合和可沉降语句的集合表示为HS(l)和SS(l)。假设SOL(l)和SIL(l)分别是l外的语句的集合、以及l内的语句的集合。图12示出了用于程序1的通过沉降运动的可能执行计划之一。s2、s3、...和s7是可沉降语句,因为所有这些语句都具有对于循环中的s9的流依赖。
设IGi为针对H和S中的所有语句的执行计划,无论是否应用查询运动。我们为H和S中的可能组合列举备选执行计划,并选择具有最高收益的执行计划。
查询运动方法取决于用户编写程序中语句的位置。例如,如果用户在循环外写了循环不变查询,则该查询能够沉降到循环中。在相反的情况下,查询能够提升到循环外。为了简化移动查询的问题,基于用户编写的程序创建的最初IR图被改变为标准化形式,而不管程序中语句的位置如何。
循环外的循环不变语句的提升不会影响程序的结果,因为循环不变代码的输出独立于该循环。此外,如果多个查询具有流依赖,则那些查询的查询结果无论是否应用SQL语句内联都是等同的。因此,程序的结果决不会受到提升运动的影响。类似地,可沉降语句对于沉降运动也是循环不变的,并且不影响程序的结果。
执行计划列举
本节展示如何列举源于提升和沉降运动的不同组合的执行计划。在所描述的策略中,为了简化算法,能够首先导出初始执行计划,该初始执行计划提升所有循环体块中的所有可提升语句。然后,能仅考虑初始执行计划的可沉降语句。能够用IG0表示初始执行计划。
在执行用于优化的循环不变查询运动时,一种方法利用查询分解技术来增加用于每个循环的循环不变语句。查询分解技术将一个表格划分成两个表格——可修改的和不可修改的,并通过使用两个表格来表达查询。然后能够将关于不可修改表格的查询移出循环。为了增加发现可提升或可沉降语句的机会,我们使用类似的技术。为了进一步增加机会,能够另外将查询中的每个子查询表达为表格变量。如果表达式el在语句s1=(v1,e1)中具有子查询,则我们为子查询创建语句s2=(v2,e2),并将子查询替换为e1中的v2
能够在循环中使用条件语句、分支语句和循环语句。对于条件语句或分支语句,如果SOL可沉降,则将SOL沉降到循环内不会影响程序的结果。
能够注意到,能够将可提升语句s移动到循环体块外,以根据数据依赖将其置于先前块中或下一基本块中。对于循环l和如果则s仅被移动到循环体块的先前块。如果s不具有对SIL(l)的任何依赖,则s被移动到的基本块
对于嵌套循环,如果SOL对于多个循环体块是可沉降的,则SOL被沉降到具有益处的循环体块中。
如果沉降到内部循环中有益处,则仅沉降到内部循环中在某些情况下可能导致对外部循环中的未分配变量的不正确访问。在这样的情况下,我们维护循环外部语法,并分配相同的语法以沉降到内部循环中。如果SOL仅被沉降到内部循环而不是外部循环中,则此查询运动将导致对外部循环中的未分配变量的不正确访问。为了避免这样的情况,我们分配一个新的SOL然后沉降到内部循环。
如果语句能够沉降到数量为n的连续循环,则我们针对每个循环测量沉降的益处,然后将语句沉降到具有益处的循环中。然而,列举所有可能的执行计划和针对所有可能的执行计划进行测量是不可行的。在这样的情况下,在不沉降的情况下实现SOL而不是迭代地执行数量为n的循环通常更有益。因此,为了减少查询运动的搜索空间,如果查询s可沉降到多个循环中,则从查询运动的搜索空间中删除它。
图17-图19表示用于具有嵌套循环的程序的备选执行计划。图17表示用户编写的程序的执行计划,显示了语句之间的流依赖。这样,也能够通过利用数据依赖图(DDG)来确定包括在执行计划的中间表示中的语句之间的依赖来创建这个表示。DDG创建能够基于多遍线性遍历以确定语句之间的依赖关系。实际上,数据依赖图可以只表示直接依赖,因此能够使用附加处理来确定间接依赖(如果有的话)。
图18表示初始执行计划,其能够通过对所有可提升语句执行提升操作来用公式表示。假设,s3是循环不变语句。为了构建初始执行计划,s3被移动到B1,因为s3是可提升语句并且4(c)是当s3和s1从初始执行计划沉降到B3时的备选执行计划。s0没有被沉降,因为s0具有对于B3和B5的流数据依赖。
能够考虑到数据依赖图来选择要沉降的语句。我们注意到,如果不考虑数据依赖而沉降语句,那么一些语句可能被暴露为访问未分配的变量。
定义5.(沉降子图)
沉降子图是用于考虑到数据依赖图来选择要沉降的查询的结构。给定初始IR图IG0,沉降子图SG=N',E')是其中节点的集合N'和边的集合E'都是IG0的子集的图。节点n∈N'的语句被沉降到IG0中的邻居节点n的语句。
从数据依赖图DDG中列举了沉降子图。对于每个不变语句,我们在循环体块的节点n∈N中发现循环不变语句。然后,能够从DDG检索用于循环不变查询的节点n',并发现以n'的邻居节点的集合Nn'开始的沉降子图的集合。为了发现所有沉降子图,能够采用频繁子图挖掘中使用的模式增长方法。能够以Nn'开始通过按深度优先一次添加一个边来扩展子图,并且列举沉降子图。
图20表示用于程序1的沉降子图SG。SG基于DDG的所有可沉降语句而被生成。从SG提取可沉降语句S2、S3、S4、S5、S6、S7和S8。
算法LoopOptimization(循环优化)输入初始执行计划IG0并返回优化的执行计划IG*。我们通过使用有序遍历从Bo发现所有循环体块,并构建数据依赖图DDG(第1-2行)。然后,对于每个循环体块l,所有沉降子图被列举。最后,算法选择具有最高益处的沉降子图,并将这个子图沉降到循环体块中(第5-10行)。
算法DiscoverSinkSubgraphs(发现沉降子图)列举s的所有沉降子图G。通过在s和s的邻居节点当中的可沉降语句之间扩展边(第2-9行)来列举沉降子图。它递归地列举所有沉降子图,直到没有更多的要扩展的边。
图21示出了用于发现程序1的所有沉降子图的搜索空间树。列举算法从包含语句S8的节点开始搜索,然后将一个边扩展到其邻居节点以访问相应的语句。类似地,算法从一个节点遍历到另一节点,直到它访问到没有邻居的节点。
在最坏的情况下,执行计划中的语句当中存在仅有的流数据依赖。在最坏的情况下,算法2花费时间其与在最坏的情况下在有向非循环图上从节点s开始的深度优先搜索算法的时间复杂度相同,其中m是祖先节点中的边的数量。设j是所有循环的可沉降语句的数量。算法2花费时间因为算法调用算法DiscoverSinkSubgraphsj次。
算法1:LoopOptimization(IG0)
输入:初始执行计划IG0
输出:优化的执行计划IG*
算法2:DiscoverSinkSubgraphs(s,sg,DDG)
输入:语句s,可沉降子图sg,数据依赖图DDG
输出:沉降子图的集合G
在现有编程优化技术中使用的其他优化技术能够改进我们的查询运动算法的性能。在这里,我们描述了所述优化技术中的一些。
展平(flatten)程序是指将被调用者程序的主体打开到调用者程序的主体中。能够注意到,程序的输出表格参数能够是另一SELECT语句的输入。通过展平嵌套程序调用,优化器能够有更多机会应用SQL语句内联。因此,如果SS(1)和HS(1)中存在调用者语句,则调用展平能够增强查询运动的性能改进。
当语句中的变量在编译时间具有常量值时,我们用该值替换该变量。我们传播所述替换,以便随后也替换引用被替换的变量的变量。常量传播移除了程序中的不必要的控制流。此外,如果通过常量传播将循环迭代的数量确定为常量值,则能够提高成本模型的准确度。
如果我们能够保证在脚本中永远不会使用语句的生成的结果,则还能够消除该语句。如果我们确定在常量传播之后不可达分支的条件被评估为假,则还能够消除该分支。如果在循环l的SS(l)和HS(l)中存在死码,则能够减小查询运动算法的搜索空间。
计算执行资源需求估计
估计的由查询运动引起的成本能够对总体查询优化具有很大影响。程序的执行计划的成本(在本文中称为程序的“计算执行资源需求”)能够被估计为每个基本块中的语句的成本的总和。对于具有循环1的程序,我们通过将s的成本乘以循环迭代的数量来估计语句s∈SIL(1)的成本。
在一个示例实施例中,我们提出的算法提升初始执行计划中的所有可提升语句,然后针对每个循环列举可提取语句。因此,没有必要针对程序中的所有语句计算成本。我们只针对由于沉降而改变其执行计划的语句计算成本。当s沉降到1时,用于1外的语句和1中的语句的执行计划被改变。此外,与s内联的语句被执行Kn次,因为s被沉降到循环体块。给定沉降的语句的集合S和循环1,我们将总成本Cost(S,l)定义为等式(1):
其中Kn是基本块n的迭代数量。
能够将查询成本Costq(s)计算为实现s的结果的成本和对s执行计划执行整个子树的成本的总和。优化器通过考虑查询算法来估计对表格的访问时间。例如,在索引连接的情况下,成本估计反映了在扫描左边表格中的N个记录的同时在右边表格中的M个记录上查找所述索引的时间。
所提出的成本模型的准确度取决于通过优化器估计的成本的准确度。由于SQL语句内联,分析查询中的关系运算符的数量可能会变得非常大。因此,作为查询执行的结果的元组的大小的预测不准确,并且通过优化器估计的成本的准确度可能恶化。在这种情况下,使用基于随机采样的成本估计。这是用于构建近似直方图的标准技术。这是一种通过随机采样n%的块来构建数据集并对这个数据集执行查询来估计成本的方法。
在查询运动算法中为每个可沉降子图调用成本(S,l)是非常昂贵的,因为Cost(S,l)驱动查询优化器编译SOL(1)和SIL(1)的每个查询。为了减少优化器调用的数量,我们将编译的执行计划存储到计划高速缓存并重新使用它。
能够注意到,迭代数量Kn极大地影响了成本模型的准确度。如果能够在编译时从循环条件计算Kn,则能够准确地估计成本。然而,如果循环条件使用从循环中的语句计算的结果,或者如果循环中存在分支语句(GOTO,EXIT,CONTINUE),则可能无法在编译时准确测量Kn。因此,我们使用混合方法在准确度和处理时间之间进行权衡。通过设置计时器,我们对给定的一组参数执行一次程序,以测量所有循环的迭代数量。如果它在超时之前完成,则我们使用计数的数量。否则,我们通过使用现有的循环迭代预测技术来估计Kn
S和l的成本B(S,l)是Cost(S,l)的成本与的成本之间的差异。我们注意到表示沉降前的成本。因此,益处测量被定义为以下等式(2)。
实验
这个部分描述了在效率方面评估所提出的优化算法的实验结果。能够在下面描述实验设置。实验的目标有四重。首先,能够表明,与其他算法(诸如,“仅沉降运动”(SM)算法和“仅提升运动”(HM)算法)相比,所提出的算法的性能更优越。其次,能够表明,我们提出的算法的性能受到诸如索引之类的物理特性的影响。第三,能够表明,所提出的算法的执行和编译时间受查询运动的场景和数据大小的影响。最后,能够表明证明了所提出的算法的可行性的、基于查询估计的成本模型的误差率。
实验设置
实验在具有512GB RAM和Intel Xeon 2.4GHz处理器的系统中进行。操作系统是Suse Linux 11。为了评估所提出的算法的性能,我们使用了SAP HANA的SQLScript。通过应用SQL HANA优化器来针对每个配置测量成本估计。
由于没有发现用于迭代分析查询的基准,我们已经在TPC-DS基准中扩展了查询,其通过引用合并于此,并且能够在http://www.tpc.org/tpcds/上发现。考虑到单个循环情况和嵌套循环情况两者,我们生成了四个程序。为了创建具有循环的程序,我们从TPC-DS基准中选择了四个代表性查询-查询23、34、49、78-并通过根据给定参数递归地变换(translate)这些查询来以循环形式扩展它们。我们将这四个程序表示为P1、P2、P3、P4。我们考虑两种真实世界的应用场景,诸如客户分析和趋势分析。P1在若干时段上基于频繁项目来发现最佳客户。P2、P3和P4分别分析各种维度的趋势,诸如购买项目、最差收益率和渠道规模比率。我们扩展此查询以在若干时段上递归计算。
例如,场景之一是被扩展为在query23.tpl查询中具有循环的程序。在搜索了前5%的购买历史评级中的优质客户之后,该程序报告。它输出购买频繁项目的周期性结果作为优质客户。我们扩展此查询以在三年上递归计算。
我们创建了具有不同大小(诸如10GB、50GB、100GB)的三个数据库,。我们使用这些不同大小的数据库观察了所提出的算法的可扩展性。此外,我们表明,即使对于相同的程序,算法的性能也根据表格统计而变化。
现有技术能够将命令式程序代码提取到等效的声明式SQL,但是不能被采用到程序中,因为循环中的一些语句不是幂等的。我们实施了现有的循环不变代码运动方法来评估性能并且将性能与我们提出的优化算法进行比较。我们考虑了以下四种算法来比较性能:
·基于提升的查询运动(HM):该算法源自循环代码不变代码运动。对于所有循环,所有可提升语句都被提升到循环外。
·基于沉降的查询运动(SM):该算法源自算法2。对于所有循环,从可沉降子图中提取的所有可沉降语句都被沉降到循环中。
·基于估计的成本的查询运动(CM):查询计划列举算法是上文中的段落[0222]到[0245](即,从“执行计划列举”段落开始到“计算执行资源需求估计”段落的前一段)中提出的一个算法。我们使用在上文中的段落[0246]-[0253](即,从“计算执行资源需求估计”段落开始到“实验”段落的前一段)中提出的成本模型。
·基于精确成本的查询运动(ECM):查询计划列举算法与CM相同。为了选择具有精确益处的最佳执行计划,我们通过查询执行来列举执行计划的益处。我们使用ECM来示出使用精确查询执行成本的我们提出的算法的最佳性能。
我们进行了实验以评估查询运动算法在以下参数上的性能:各种程序、数据库规模、和索引。
·实验A:这个实验被设计为比较各种数据库和程序的执行时间。我们示出了所提出的算法的可扩展性。
·实验B:这个实验示出了根据是否用于程序2和4的索引的所提出的算法的性能影响。
·实验C:这个实验被设计为示出根据各种数据库和程序的所提出的算法的编译时间。
·实验D:这个实验示出了针对所有程序的、提出的成本模型的误差率。
实验结果
实验A
在这个实验中,我们观察了针对不同程序和不同数据库的执行时间。我们比较了针对三个数据库10GB、50GB、100GB和三个程序P1、P2、P3的执行时间。实验结果被绘制在图24中的一系列表格2400中。图24示出了与HM和SM相比所提出的方法(CM)表现最佳。
在P1中,对于所有数据库,SM具有比HM更快的执行时间。CM选择具有所有可沉降语句的执行计划作为最佳计划。在10GB和50GB数据库中,由于可沉降语句的查询成本估计的误差,CM不会选择最佳执行计划。
在P2、P3中,对于所有数据库,CM具有比HM和SM更快的执行时间。特别是在P2和100GB数据库中,CM的执行时间比SM快6倍。我们观察到CM通过提升移除了冗余的循环不变查询执行。CM还检测到上升选择性谓词的有益的可沉降语句通过SQL语句内联被下推到循环中的语句。
实验B
在这个实验中,我们基于索引比较程序P2和P4的执行时间。我们在所有表格的主键两者上构建索引,并在所有循环中的语句中使用筛选器列。我们比较了10GB数据库的执行时间。我们称具有索引的数据库为P2.a和P4.a。否则,我们将不具有索引的数据库称为P2.b和P4.b。我们将实验结果绘制在图25中所示的表格2500中。图25示出了在P2的情况下SM总是比HM更快。然而,在P4.a的情况下,CM和SM示出了比HM快3倍的执行时间。相反,在P4.b的情况下,HM的执行时间提高了30%。我们观察到,沉降和内联语句帮助查询优化器列举更高效的连接运算符,其具有使用索引的哈希连接运算符。我们还观察到,即使采用相同的程序,具有最高益处的执行计划也会受到索引的可用性的影响。我们注意到,在P2.a和P2.b的情况下,CM的成本模型无法准确估计益处。因此,CM仅仅不能为这两种情况选择最佳执行计划。
实验C
在这个实验中,我们评估了不同程序的整个编译时间。我们对程序应用了不同的规则,诸如常量传播、控制流简化和SQL语句内联。然后,我们针对每个应用的规则评估了程序的编译时间,并与我们提出的算法的编译时间进行了比较。评估的结果绘制在图26中。图26包括表格2600,其示出了对不同大小的数据库执行的各种程序的执行时间。除了我们提出的算法外的所有优化技术都需要不到1秒的时间,这能够被认为是无关紧要的。我们观察到成本估计占总体编译时间的很大一部分。随着数据库的大小增加,由于基于采样的查询成本估计,成本估计也增加。然而,我们注意到编译过程是一次性活动,因此通常被认为是一个微不足道的问题。
实验D
在这个实验中,我们通过与精确成本模型(ECM)进行比较来评估我们的成本模型(CM)的质量。精确成本模型通过执行查询来列举实际执行成本。然而,提出的成本模型通过使用查询优化器来估计执行成本。通过使用均方根误差(RMSE)计算误差率。
表2表示10GB和100GB的数据集的误差率。该表格示出了对于两个数据集而言提出的CM的误差率小于0.05。我们注意到,我们提出的CM所获得的误差率是可接受的,并且明显低于其他技术所获得的误差率。
表格2:误差率的比较
示例38–示例计算系统
图27描绘了合适的计算系统2700的一般化示例,其中能够实施所描述的创新。计算系统2700不旨在对本公开的使用或功能的范围提出任何限制,因为能够在各种的通用或专用计算系统中实施所述创新。
参考图27,计算系统2700包括一个或多个处理单元2710、2715和存储器2720、2725。在图27中,该基本配置2730包括在虚线内。处理单元2710、2715执行诸如用于实施上述示例中描述的特征的计算机可执行指令。处理单元能够是通用中央处理单元(CPU)、专用集成电路(ASIC)中的处理器或任何其他类型的处理器。在多处理系统中,多个处理单元执行计算机可执行指令以增加处理能力。例如,图27示出了中央处理单元2710以及图形处理单元或协处理单元2715。有形存储器2720、2725能够是可由(多个)处理单元2710、2715访问的易失性存储器(例如,寄存器、高速缓存、RAM)、非易失性存储器(例如,ROM、EEPROM、闪存等)、或者两者的某种组合。存储器2720、2725以适合于由(多个)处理单元2710、2715执行的计算机可执行指令的形式来存储实施本文所述的一个或多个创新的软件2780。
计算系统2700能够具有附加特征。例如,计算系统2700包括储存器2740、一个或多个输入设备2750、一个或多个输出设备2760、以及一个或多个通信连接2770,包括用于与用户交互的输入设备、输出设备和通信连接。诸如总线、控制器或网络的互连机制(未示出)互连计算系统2700的组件。通常,操作系统软件(未示出)为在计算系统2700中执行的其他软件提供操作环境,并且协调计算系统2700的组件的活动。
有形储存器2740能够是可移动的或不可移动的,并且包括磁盘、磁带或盒式磁带、CD-ROM、DVD或可用于以非暂时性方式存储信息以及能够在计算系统2700内被访问的任何其他介质。储存器2740存储用于实施本文描述的一个或多个创新的软件2780的指令。
(多个)输入设备2750能够是触摸输入设备,诸如键盘、鼠标、笔或轨迹球、语音输入设备、扫描设备或向计算系统2700提供输入的另一设备。(多个)输出设备2760能够是显示器、打印机、扬声器、CD刻录机或提供来自计算系统2700的输出的另一设备。
(多个)通信连接2770使得能够通过通信介质与另一计算实体进行通信。通信介质在调制的数据信号中传送诸如计算机可执行指令、音频或视频输入或输出或其他数据的信息。调制的数据信号是其特性中的一个或多个以对信号中的信息进行编码的方式被设置或改变的信号。作为示例而非限制,通信介质能够使用电、光、RF或其他载体。
能够在计算机可执行指令的一般上下文(诸如程序模块中包括的那些)中描述创新,所述计算机可执行指令在目标真实或虚拟处理器上的计算系统中执行。通常,程序模块或组件包括执行特定任务或实施特定抽象数据类型的例程、程序、库、对象、类、组件、数据结构等。在各种实施例中,能够根据需要在程序模块之间组合或分割程序模块的功能。用于程序模块的计算机可执行指令能够在本地或分布式计算系统内执行。
术语“系统”和“设备”在本文中可互换使用。除非上下文另有明确说明,否则这两个术语都不暗示对计算系统或计算设备的类型的任何限制。通常,计算系统或计算设备能够是本地的或分布式的,并且能够包括专用硬件和/或通用硬件与实施本文描述的功能的软件的任何组合。
在本文描述的各种示例中,模块(例如,组件或引擎)能够被“编码”以执行某些操作或提供某些功能,以指示能够执行用于模块的计算机可执行指令以执行这样的操作、使得这样的操作被执行、或以其他方式提供这样的功能。尽管关于软件组件、模块或引擎描述的功能能够作为离散软件单元(例如,程序、功能、类方法)被执行,但是不需要将其实施为离散单元。也就是说,功能能够合并到更大或更通用的程序中,例如更大或通用的程序中的一行或多行代码。
为了呈现,详细描述使用诸如“确定”和“使用”的术语来描述计算系统中的计算机操作。这些术语是计算机执行的操作的高级抽象,并且不应与人类执行的操作混淆。对应于这些术语的实际计算机操作根据实施方式而变化。
示例39-示例云计算环境
图28描绘了其中能够实施所描述的技术的示例云计算环境2800,包括例如图1的环境100。云计算环境2800包括云计算服务2810。云计算服务2810能够包括各种类型的云计算资源,诸如计算机服务器、数据存储库、网络资源等。云计算服务2810能够集中定位(例如,由企业或组织的数据中心提供)或被分布式(例如,由位于不同位置的和/或位于不同的城市或国家的各种计算资源(诸如不同的数据中心)来提供)。
云计算服务2810被各种类型的计算设备(例如,客户端计算设备)使用,所述计算设备诸如计算设备2820、2822和2824。例如,计算设备(例如,2820、2822和2824)能够是计算机(例如,桌上型计算机或膝上型计算机)、移动设备(例如,平板计算机或智能电话)或其他类型的计算设备。例如,计算设备(例如,2820、2822和2824)能够利用云计算服务2810来执行计算操作(例如,数据处理、数据存储等)。
示例40-示例实施方式
尽管为了方便呈现,以特定的顺序次序描述了所公开的方法的一些操作,但应该理解,这样的描述方式包括重新排列,除非本文所阐述的特定语言要求特定排序。例如,在某些情况下,顺序描述的操作能够重新排列或同时执行。此外,为了简单起见,附图不能示出所公开的方法能够与其他方法结合使用的各种方式。
所公开的方法中的任何一个能够实施为存储在一个或多个计算机可读存储介质上并在计算设备(例如,任何可用的计算设备,包括智能电话或其他包括计算硬件的移动设备)上执行的计算机可执行指令或计算机程序产品。有形计算机可读存储介质是可在计算环境内访问的任何可用有形介质(例如,诸如DVD或CD的一个或多个光学介质盘、易失性存储器组件(诸如DRAM或SRAM)、或非易失性存储器组件(诸如闪存或硬盘))。作为示例并且参考图27,计算机可读存储介质包括存储器2720和2725、以及储存器2740。术语计算机可读存储介质不包括信号和载波。另外,术语计算机可读存储介质不包括通信连接(例如,2770)。
用于实施所公开的技术的计算机可执行指令中的任何一个以及在所公开的实施例的实施期间创建和使用的任何数据能够被存储在一个或多个计算机可读存储介质上。计算机可执行指令能够是例如专用软件应用或经由网络浏览器访问或下载的软件应用、或其他软件应用(诸如远程计算应用)的一部分。这样的软件能够例如在单个本地计算机(例如,任何合适的商用计算机)上或在网络环境中(例如,经由因特网、广域网、局域网、使用一个或多个网络计算机的客户端-服务器网络(诸如,云计算网络或其他此类网络))执行。
为清楚起见,仅描述了基于软件的实施方式的某些所选方面。省略了本领域公知的其他细节。例如,应该理解,所公开的技术不限于任何特定的计算机语言或程序。例如,所公开的技术能够通过用C++、Java、Perl、JavaScript、Python、Ruby、ABAP、SQL、Adobe Flash或任何其他合适的编程语言编写的软件来实施,或者在一些示例中,能够通过用诸如html或XML的标记语言或合适的编程语言和标记语言的组合编写的软件来实施。同样地,所公开的技术不限于任何特定计算机或硬件类型。合适的计算机和硬件的某些细节是众所周知的,并且不需要在本公开中详细阐述。
此外,能够通过合适的通信装置上载、下载或远程访问基于软件的实施例(包括,例如,用于使计算机执行所公开的方法中的任何一个的计算机可执行指令)中的任何一个。这样的合适的通信装置包括,例如,因特网、万维网、内联网、软件应用、电缆(包括光纤电缆)、磁通信、电磁通信(包括RF、微波和红外通信)、电子通信、或其他这样的通信装置。
示例41-进一步的示例实施方式
所公开的方法、装置和系统不应被解释为以任何方式进行限制。相反,本公开针对各种公开的实施例的所有新颖和非显而易见的特征和方面,单独地以及彼此各种组合地和子组合地。所公开的方法、装置和系统不限于任何特定方面或特征或其组合,所公开的实施例也不要求存在任何一个或多个特定优点或解决问题。
实施例42-示例备选
来自任何示例的技术能够与在其他示例中的任何一个或多个中描述的技术组合。鉴于能够应用所公开的技术的原理的许多可能的实施例,应该认识到,所示实施例是所公开技术的示例,并且不应该被视为对所公开的技术的范围的限制。相反,所公开的技术的范围包括所附权利要求的范围和精神所覆盖的范围。

Claims (20)

1.一种计算机实施的方法,包括:
接收包括多个语句的输入程序的中间表示,其中所述多个语句包括多个查询语句、以及包括循环的多个命令语句;
经由输入程序的中间表示列举输入程序的多个查询执行计划候选,其中所述列举包括对查询语句执行至少一个沉降操作,其中所述至少一个沉降操作将查询语句移动到循环边界内;
执行组合至少两个查询语句的查询内联;
估计所述多个查询执行计划候选中的各个的计算执行资源需求;和
确定输入程序的最优查询执行计划,其中所述确定包括发现具有最低估计的计算执行资源需求的候选查询执行计划。
2.根据权利要求1所述的计算机实施的方法,其中所述列举包括:
将中间表示中的查询语句移动到不同的循环中或将中间表示中的查询语句移动到已经具有其他查询语句的循环中;
由此,最优查询执行计划跨迭代构造集成查询运动。
3.根据权利要求1所述的计算机实施的方法,还包括:
对查询语句执行至少一个提升操作,从而将查询语句移动到循环边界外。
4.根据权利要求1所述的计算机实施的方法,其中所述列举包括:
生成初始查询执行计划候选,其中所述生成包括对出现在中间表示中的多个查询语句执行提升操作。
5.根据权利要求4所述的计算机实施的方法,其中所述列举包括:
生成多个备选查询执行计划候选,其中所述生成包括对初始查询执行计划候选执行各种不同排列的沉降操作,以得到所述多个备选查询执行计划候选中的不同候选。
6.根据权利要求5所述的计算机实施的方法,其中,执行查询内联包括:
对至少一个沉降的查询语句执行查询内联。
7.根据权利要求6所述的计算机实施的方法,其中:
查询内联相对提高了输入程序的性能。
8.根据权利要求4所述的计算机实施的方法,其中所述列举包括:
根据基于数据依赖图的考虑排除沉降操作。
9.根据权利要求1所述的计算机实施的方法,其中所述列举包括:
考虑多个查询语句作为循环的沉降操作候选;
基于表示所述多个语句的至少一个数据依赖关系的数据依赖图,从考虑中排除沉降操作候选中的至少一个。
10.根据权利要求1所述的计算机实施的方法,其中所述列举包括:
基于表示所述多个语句的至少一个数据依赖关系的数据依赖图,构建用于循环的沉降子图,其中沉降子图表示循环中的多个语句之间的沉降依赖。
11.根据权利要求10所述的计算机实施的方法,其中所述列举包括:
列举其他沉降子图,其表示其他循环中的多个语句之间的沉降依赖。
12.根据权利要求1所述的计算机实施的方法,其中列举所述多个查询执行计划候选包括生成反映针对所述输入程序的不同查询语句的多个沉降操作的多个备选执行计划。
13.根据权利要求1所述的计算机实施的方法,其中,所述查询内联包括:内联被沉降在所述循环边界内的语句以得到所述多个查询执行计划候选之一。
14.根据权利要求13所述的计算机实施的方法,其中,所述查询内联包括,对于仅被所述多个语句中的另一语句使用的选择语句,将该选择语句内联到其使用语句。
15.根据权利要求14所述的计算机实施的方法,其中,所述查询内联包括:
识别仅被所述多个语句中的另一语句使用的多个选择语句;和
将所识别的、仅被所述多个语句中的另一语句使用的多个选择语句中的每一个内联到其使用语句。
16.根据权利要求1所述的计算机实施的方法,还包括:
根据最优执行计划编译和执行输入程序。
17.一种计算系统,包括:
一个或多个存储器;
耦合到一个或多个存储器的一个或多个处理单元;和
存储指令的一个或多个非暂时性计算机可读存储介质,所述指令在被执行时使得所述一个或多个处理单元执行以下操作:
接收包括多个语句的输入程序的中间表示,其中所述多个语句包括多个查询语句、以及包括循环的多个命令语句;
经由输入程序的中间表示列举输入程序的多个查询执行计划候选,其中所述列举包括对查询语句执行至少一个沉降操作,其中所述至少一个沉降操作将查询语句移动到循环边界内;
执行组合至少两个查询语句的查询内联;
估计所述查询执行计划候选中的各个的计算执行资源需求;和
确定输入程序的最优查询执行计划,其中所述确定包括发现具有最低估计的计算执行资源需求的候选查询执行计划。
18.根据权利要求17所述的计算系统,其中所述列举包括:
识别循环边界内的选择语句,所述选择语句不依赖于循环边界内的任何其他语句;和
提升所述选择语句。
19.根据权利要求17所述的计算系统,其中:
发现具有最低估计的计算执行资源需求的候选查询执行计划包括确定循环中的语句所使用的系统资源并乘以循环迭代的次数;和
确定循环中每个语句所使用的系统资源包括,对于至少一个这样的语句,确定用于被所述语句访问的任何表格的访问时间。
20.存储计算机可执行指令的一个或多个非暂时性计算机可读存储介质,所述指令当由计算系统执行时使得计算系统执行包括以下步骤的方法:
接收描绘包括多个语句的计算机实施的程序的中间表示图,其中所述多个语句中的至少一个具有对所述多个语句中的其他语句的数据依赖,并且其中所述计算机实施的程序还包括循环;
识别所述多个语句中的、位于循环的边界内、能够被移动到循环边界外的第一语句;
将第一语句提升到循环边界外;
生成反映所述提升的初始查询执行计划;
识别所述多个语句中的、在循环边界外的、能够被移动到循环边界内的第二语句;
将第二语句沉降到循环边界内;
生成反映所述沉降的备选查询执行计划;
将至少一个查询语句内联到其他查询语句中;
估计初始查询执行计划和备选执行计划的计算执行资源需求;
基于估计的计算执行资源需求来确定最优查询执行计划,其中,所述确定包括:将所述初始查询执行计划的估计的计算执行资源需求与所述备选执行计划的估计的计算执行资源需求进行比较;和
选择最优查询执行计划以便执行。
CN201910432941.5A 2018-05-24 2019-05-23 迭代分析查询处理的统一优化 Pending CN110532288A (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US15/988,862 2018-05-24
US15/988,862 US10922315B2 (en) 2018-05-24 2018-05-24 Unified optimization of iterative analytical query processing

Publications (1)

Publication Number Publication Date
CN110532288A true CN110532288A (zh) 2019-12-03

Family

ID=66676197

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910432941.5A Pending CN110532288A (zh) 2018-05-24 2019-05-23 迭代分析查询处理的统一优化

Country Status (3)

Country Link
US (2) US10922315B2 (zh)
EP (1) EP3572952A1 (zh)
CN (1) CN110532288A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112162995A (zh) * 2020-09-17 2021-01-01 北京人大金仓信息技术股份有限公司 过程化语言sql语句处理方法、装置、介质和电子设备
CN112286964A (zh) * 2020-11-19 2021-01-29 上海达梦数据库有限公司 一种sql语句优化方法、装置、设备及存储介质
CN113535771A (zh) * 2021-06-21 2021-10-22 跬云(上海)信息科技有限公司 持续迭代优化的预计算方法和装置
CN114168620A (zh) * 2022-02-11 2022-03-11 北京奥星贝斯科技有限公司 执行计划的处理方法及装置
WO2023138665A1 (zh) * 2022-01-24 2023-07-27 北京奥星贝斯科技有限公司 分布式数据库的查询优化方法和装置

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP7031627B2 (ja) * 2019-03-13 2022-03-08 オムロン株式会社 解析装置、解析方法、及び解析プログラム
US11593506B2 (en) * 2019-06-03 2023-02-28 Immuta, Inc. Systems and methods for privacy-enhancing transformation of a SQL query
US11556531B2 (en) * 2019-10-31 2023-01-17 Sap Se Crux detection in search definitions
US11960624B2 (en) 2020-02-21 2024-04-16 Immuta, Inc. Systems and methods to enhance privacy through decision tree based suppression rules on relational databases
US11783077B2 (en) 2020-06-19 2023-10-10 Immuta, Inc. Systems and methods for privacy-enhancing modification of a database query
US11481390B2 (en) * 2020-07-24 2022-10-25 Microsoft Technology Licensing, Llc Optimizing cursor loops in relational database systems using custom aggregates
US11693636B2 (en) * 2021-01-15 2023-07-04 Reservoir Labs Inc. Static versioning in the polyhedral model
US11573960B2 (en) * 2021-03-18 2023-02-07 International Business Machines Corporation Application-based query transformations
CN115827930B (zh) * 2023-02-15 2023-05-05 杭州悦数科技有限公司 一种图数据库的数据查询优化方法、系统和装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6026240A (en) * 1996-02-29 2000-02-15 Sun Microsystems, Inc. Method and apparatus for optimizing program loops containing omega-invariant statements
US20080010240A1 (en) * 2006-06-30 2008-01-10 Mohamed Zait Executing alternative plans for a SQL statement
CN105279286A (zh) * 2015-11-27 2016-01-27 陕西艾特信息化工程咨询有限责任公司 一种交互式大数据分析查询处理方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10515075B2 (en) * 2017-05-15 2019-12-24 Microsoft Technology Licensing, Llc Method for optimization of imperative code executing inside a relational database engine
KR102195103B1 (ko) * 2017-06-26 2020-12-24 삼성전자주식회사 프로그램 컴파일 방법

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6026240A (en) * 1996-02-29 2000-02-15 Sun Microsystems, Inc. Method and apparatus for optimizing program loops containing omega-invariant statements
US20080010240A1 (en) * 2006-06-30 2008-01-10 Mohamed Zait Executing alternative plans for a SQL statement
CN105279286A (zh) * 2015-11-27 2016-01-27 陕西艾特信息化工程咨询有限责任公司 一种交互式大数据分析查询处理方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
VENKATESH EMANI K等: "Cobra: A Framework for Cost Based Rewriting of Database Applications", 《ARKIV.ORG》 *
VENKATESH EMANI K等: "Cobra: A Framework for Cost Based Rewriting of Database Applications", 《ARKIV.ORG》, 15 January 2018 (2018-01-15), pages 689 - 700 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112162995A (zh) * 2020-09-17 2021-01-01 北京人大金仓信息技术股份有限公司 过程化语言sql语句处理方法、装置、介质和电子设备
CN112162995B (zh) * 2020-09-17 2024-04-26 北京人大金仓信息技术股份有限公司 过程化语言sql语句处理方法、装置、介质和电子设备
CN112286964A (zh) * 2020-11-19 2021-01-29 上海达梦数据库有限公司 一种sql语句优化方法、装置、设备及存储介质
CN113535771A (zh) * 2021-06-21 2021-10-22 跬云(上海)信息科技有限公司 持续迭代优化的预计算方法和装置
WO2022267182A1 (zh) * 2021-06-21 2022-12-29 跬云(上海)信息科技有限公司 持续迭代优化的预计算方法和装置
CN113535771B (zh) * 2021-06-21 2023-11-28 跬云(上海)信息科技有限公司 持续迭代优化的预计算方法和装置
WO2023138665A1 (zh) * 2022-01-24 2023-07-27 北京奥星贝斯科技有限公司 分布式数据库的查询优化方法和装置
CN114168620A (zh) * 2022-02-11 2022-03-11 北京奥星贝斯科技有限公司 执行计划的处理方法及装置

Also Published As

Publication number Publication date
EP3572952A1 (en) 2019-11-27
US10922315B2 (en) 2021-02-16
US20190362007A1 (en) 2019-11-28
US11604796B2 (en) 2023-03-14
US20210165793A1 (en) 2021-06-03

Similar Documents

Publication Publication Date Title
CN110532288A (zh) 迭代分析查询处理的统一优化
US11620574B2 (en) Holistic optimization for accelerating iterative machine learning
US9454571B2 (en) Optimization of parallelization of user-defined functions with flexible partitioning
CN101685449B (zh) 一种用于连接多个异构分布式数据库中的表的方法和系统
US7716167B2 (en) System and method for automatically building an OLAP model in a relational database
US10503781B2 (en) Extending graph traversals with application logic
US10248688B2 (en) Annotations for parallelization of user-defined functions with flexible partitioning
US7739269B2 (en) Incremental repair of query plans
US9043764B2 (en) Cross-platform compiler for data transforms
EP2439656A1 (en) Hybrid query execution plan
CN107111617A (zh) 数据库中的图处理
JP5791149B2 (ja) データベース・クエリ最適化のためのコンピュータで実装される方法、コンピュータ・プログラム、およびデータ処理システム
CN102915237A (zh) 根据用户应用程序要求改写数据质量规则的方法和系统
US11099841B2 (en) Annotations for parallelization of user-defined functions with flexible partitioning
US11960479B2 (en) Processing iterative query constructs in relational databases
Izsó et al. Towards precise metrics for predicting graph query performance
US11144549B2 (en) Dynamic generation of join statements for database operations
CN111078705A (zh) 基于Spark平台建立数据索引方法及数据查询方法
US8914782B2 (en) Optimization of declarative queries
US20230048391A1 (en) Operator movement optimization technique for procedures
US9135302B2 (en) Query rewrite with a nested materialized view
Le et al. A methodology for refined evaluation of neural code completion approaches
Munir Storage format selection and optimization for materialized intermediate results in data-intensive flows
Laptev et al. Smarter Warehouse
US11386087B2 (en) Benchmark framework for cost-model calibration

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