本申请要求于2019年10月30日提交的美国临时专利申请号62/928,108的权益,其全部内容通过引用结合于此。本公开涉及一种计算系统,并且具体地址,涉及优化计算系统中的查询。
背景技术:
::数据存储在诸如数据库的存储库中。数据存储在不同类型的数据库中(诸如,关系型数据库、非关系型数据库、流数据库等)。例如,关系型数据库将数据存储为一系列相关表中的行和列。相比之下,非关系型数据库基于表格关系以外的模型存储数据。例如,非关系型数据库可以包括文档数据库、键值存储、图形存储和列存储。查询用于访问(例如,写入和检索)存储在数据库中的数据。根据数据库的类型,使用不同的查询语言来访问存储在数据库中的数据。例如,用户可以使用关系型数据库查询(例如,结构化查询语言(sql))以查询关系型数据库。关系型数据库查询可以返回关系型数据库的行。或者,用户可以使用非关系型数据库查询(例如,nosql)以查询非关系型数据库(诸如,文档数据库)。非关系型数据库查询可以返回例如包含数据的文档(诸如,javascript对象表示法(json)或可扩展标记语言(xml)文档)。其他数据存储库包括数据湖、静态网页、数据流、存储到文件系统的文件等。技术实现要素:总体上,本公开描述了用于动态优化查询的技术。例如,查询系统可以访问存储满足由查询系统接收到的查询所需的数据的多个异构数据源。查询系统包括用于接收查询的公共接口,并且自适应地下推查询,以从异构数据源中检索数据。查询系统可以基于查询的属性或查询在不同数据源处的执行来动态地测量或以其他方式获得一个或多个度量。使用这些度量,查询系统可以优化查询或后续查询。例如,查询系统的查询编译器可以使用即时(jit)或其他编译器将当前或后续查询编译成字节码,该字节码可以基于查询的属性或用于在各种数据源处执行的查询的最新度量来优化当前或后续查询,从而动态地使查询编译适应例如动态资源或网络条件,该动态资源或网络条件影响查询执行或从数据源检索数据。以这种方式,在技术的一些示例中,至少部分因为查询的编译刚好发生在执行之前,所以查询系统可以执行jit编译,该编译基于查询的属性或指示在多个数据源处的先前查询的性能的度量而针对查询或数据源被优化。在一些示例中,查询系统的优化器可以指示编译器在编译查询时添加测控(instrumentation)代码(例如,计数器),以在经编译的查询被执行时获得一个或多个度量。度量可以包括操作数的大小(例如,从查询返回的行数)、谓词的选择性、来自表的基数或由编译查询的执行产生的其他度量。响应于接收到后续查询,优化器可以使查询系统基于先前执行的查询的度量来优化后续查询。本文描述的技术可以提供一个或多个技术优点,这些技术优点提供至少一个实际应用。例如,本公开中描述的技术混合使用较粗糙的散列查找技术,通过“较软的”学习模型(基于从过去相似查询获得的度量)产生从传统的基于成本的优化(当高置信度统计数据可用或已经获得时)到以或多或少基于查询本身的检查和应用一些一般规则的低置信度“预感”的范围的效果。在一个示例中,本文描述的技术包括由查询系统执行的方法,该方法包括:接收用于访问存储在多个数据源中的第一数据的查询;编译查询,以生成包括一个或多个指令的经编译的查询,该一个或多个指令用于在经编译的查询执行时获得一个或多个度量,该一个或多个度量用于在一个或多个数据源处执行经编译的查询的部分;接收用于访问存储在多个数据源中的第二数据的后续查询;并且基于一个或多个度量为后续查询优化查询计划。在另一示例中,本文描述的技术包括一种查询系统,包括:接口,被配置为接收用于访问存储在多个数据源中的第一数据的查询;多个连接器接口,用于与多个数据源接合;编译器,被配置为编译查询,以生成包括一个或多个指令的经编译的查询,该一个或多个指令用于在经编译的查询执行时获得一个或多个度量,该一个或多个度量用于在一个或多个数据源处执行经编译的查询的部分;以及优化器,被配置为响应于接口接收到访问存储在多个数据源中的第二数据的后续查询,基于一个或多个度量来为后续查询优化查询计划。在另一示例中,本文描述的技术包括一种非暂时性计算机可读介质,包括指令,该指令用于使一个或多个可编程处理器:接收用于访问存储在多个数据源中的第一数据的查询;编译查询,以生成包括一个或多个指令的经编译的查询,该一个或多个指令用于在经编译的查询执行时获得一个或多个度量,该一个或多个度量用于在一个或多个数据源处执行经编译的查询的部分;接收用于访问存储在多个数据源中的第二数据的后续查询;并且基于一个或多个度量为后续查询优化查询计划。例如,这些技术可以使查询系统能够使用用于在由查询系统访问的各种数据源处的查询执行的最新的度量来优化查询。动态地调整查询编译以例如从运行的查询(或从基于查询本身或数据源属性的假设)中获取信息(诸如,通过使用所获取的信息在数据源当中智能地应用或布置联接或其他操作和/或查询执行的方面),可以提高查询系统的性能。作为另一示例,通过将测控代码添加至向查询以获得该查询的一个或多个度量,该技术可以在执行查询时动态地获得度量,而不依赖于直方图或发送请求数据库的度量的附加查询。这可以促进查询系统访问用于查询执行的最新度量、可以提供对在使用传统数据库或其他数据源度量请求时不可用的度量的访问、可以减少查询系统和/或数据源的处理负担、和/或可以减少网络中的通信流量。在附图和以下描述中阐述一个或多个示例的细节。其他特征、目的和优点将从说明书和附图以及权利要求书中变得显而易见。附图说明图1是示出据公开的技术的一个或多个方面的示例计算系统的框图,该示例计算系统被配置为动态地优化对多个数据源的查询;图2是根据公开的技术的一个或多个方面更详细地示出查询系统的框图;图3a至图3c是根据本公开中的技术的一个或多个方面的示例优化操作的概念图;图4是示出根据公开的技术的一个或多个方面的被配置用于动态地优化查询的查询系统的操作的流程图;图5是根据本公开的一种或多种技术操作的示例计算装置的框图。具体实施方式图1是根据公开的技术的一个或多个方面的示例计算系统2的框图,该示例计算系统被配置为动态地优化对多个数据源的查询。在该示例中,计算系统2包括查询系统10,该查询系统10被配置为提供对数据源8a-8n(统称为“数据源8”)的统一访问。在一些示例中,数据源8可以表示异构数据源。如下文进一步描述的,在一些示例中,查询系统10由多个分布式节点实现。数据源8可以包括关系型数据库、非关系型数据库、数据流、诸如hadoop分布式文件系统(hdfs的文件系统、数据湖、网页或可由满足查询的查询系统10访问的任何其他类型的存储库或数据源。关系型数据库可以将数据存储为一系列相关表中的行和列。相反,非关系型数据库基于表格关系以外的模型存储数据。例如,非关系型数据库可以包括文档数据库、键值存储、图形存储和列存储。在一些示例中,数据源8是分布式的。在一些示例中,数据源8中的一个或多个可以在查询系统10的外部。在一些示例中,数据源8中的一个或多个可以在查询系统10的内部,诸如,将数据存储在与查询系统10的其他组件共享的存储器中的内存储器数据存储(in-memorydatastore)。查询系统10可以调整针对异构数据源8的运行的查询。查询系统10可以重构来自一个或多个用户(例如,用户4)的一个或多个查询,以访问存储在多个异构数据源8中的数据。例如,查询可以是中性方言(诸如,结构化查询语言(sql))。作为一个示例,响应于从用户4接收到查询,查询系统10可以确定要访问和处理的一种或多种类型的数据以及该数据存储的位置。例如,查询系统10可以确定查询请求存储在关系型数据库(例如,数据源8a)和非关系型数据库(例如,数据源8b)中的数据。查询系统10可以将查询(或查询的一部分)编译为该查询的相应子查询,以从数据源8中的对应一个数据源访问数据。例如,为了提取存储在关系型数据库8a中的数据,查询系统10可以编译查询(或查询的一部分),以生成关系型数据库查询(查询的子查询),从而从关系型数据库8a中检索数据(例如,表的行)。例如,关系型数据库查询可以包括sql查询。查询系统10还可以将查询(或查询的一部分)编译为非关系型数据库查询(查询的子查询),以从非关系型数据库8b(例如,诸如javascript对象表示法(json)或可扩展标记语言(xml)文档的文档)中检索数据。例如,非关系型数据库查询可以包括nosql查询。通常,为了编译接收到的查询,查询系统10生成查询计划(或“执行计划”)作为用于获得和处理存储在数据源8中的数据的一组步骤或任务。查询计划包括访问数据源8中的一个或多个的子查询。查询系统10可以将为查询生成的子查询并行地分发到多个数据源8。接收子查询的数据源8中的每个访问和/或处理与其对应的存储数据,以满足子查询并返回子查询结果数据。查询系统10可以接收从数据源8中的一个或多个单独返回的子查询结果数据,并为用户4整合数据。查询系统10可以对从一个或多个数据源8返回的单独的子查询结果数据,执行进一步的查询处理操作。例如,查询系统10可以对子查询结果数据的表执行联接或其他操作。作为其他示例,查询系统10可以聚集、修改、分析、计算或以其他方式处理返回的子查询结果数据,以响应于该查询生成整体查询结果。根据本文描述的技术,查询系统10包括优化器14,以动态地优化查询。在图1所示的示例中,查询系统10可以从用户4接收用于访问存储在一个或多个数据源8中的数据查询20。响应于从用户4接收到查询20,查询系统10可以确定要访问和处理的一种或多种类型的数据以及该数据存储的位置。例如,查询系统10可以确定查询20请求存储在数据源8b和数据源8n中的数据。为了提取存储在数据源8b和8n中的数据,查询系统10可以编译查询20,以生成经编译的查询,从而访问一个或多个数据源8。更具体地,查询系统10可以编译查询20,以生成查询计划,从而获得和处理存储在数据源8中的数据。查询20的查询计划包括用于访问数据源8中的一个或多个的子查询22a-22b(统称为“子查询22”),。在一些示例中,查询系统10可以基于在数据源8b和8n处执行子查询22来动态地测量或以其他方式获得一个或多个度量。例如,优化器14可以使查询系统10在编译查询20时添加测控代码,以在执行经编译的查询(例如,子查询22)时获得一个或多个度量。度量可以包括操作数的大小、谓词的选择性、表或列的基数、性能和执行度量(诸如,查询延迟或cpu使用率)以及执行查询所产生的其他度量。操作数的大小可以包括查询或子查询的提取大小。作为一个示例,优化器14可以使查询系统10将计数器添加至关系型数据库查询,以对从关系型数据库返回的表的每行进行计数。在一些示例中,优化器14可以使查询系统10将计数器添加至查询,以对来自存储在非关系型数据库中的文档中的每个元素数组或嵌套数组进行计数。在以上示例中,响应于来自优化器14的指示,查询系统10可以动态地生成查询执行代码,该代码包括用于实现这种计数器的指令和数据。在一些示例中,度量可以包括关于谓词的选择性的信息。谓词可以定义行应用于表中的条件。谓词的选择性是由谓词识别的数据集的子集。例如,优化器14可以指示查询系统10将计数器添加至查询,以对基于谓词(例如,来自所有年龄的客户的数据集的21岁以下的客户)返回的每行进行计数。在上述示例中,响应于来自优化器14的指示,查询系统10可以更新或生成查询执行代码,该查询执行代码包括用于实现这种计数器以获得关于谓词的选择性的信息的指令和数据。表的基数是表的列中包含的数据的唯一性。为了测量表的基数,优化器14可以例如指示查询系统10将计数器添加至查询,以对表的列中的每个重复条目(例如,位于特定状态的客户)进行计数。重复条目的数量可以表示基数的程度。例如,表的列中的重复条目的数量越多,基数就越低,而表的列中重复条目的数量越少,基数就越高。在上述示例中,响应于来自优化器14的指示,查询系统10可以更新或生成查询执行代码,该查询执行代码包括用于实现这种计数器以获得关于上述度量的信息的指令和数据。查询系统10接收返回的子查询结果数据24a-24b(统称为“结果数据24”),该子查询结果数据24a-24b包括一个或多个度量。获得的度量存储在度量存储库16(“度量16”)中,该度量存储库16可以包括内存储器、外存储器、本地或远程存储装置。在一些示例中,度量存储库16是分布式信息库。查询系统10为用户4整合结果数据24(例如,整合的结果数据26)。当查询系统10从用户4接收用于访问存储在一个或多个数据源8中的数据的后续查询28时,查询系统10可以基于从子查询22的执行中动态地获得的一个或多个度量来优化后续查询。为了优化后续查询28,查询系统10可以编译后续查询28,以为后续查询28生成查询计划,该查询计划与查询系统10在没有度量的情况下将生成的查询计划不同。例如,基于动态地获得的数据源8b和/或数据源8n的度量,查询系统10可以:(1)为数据集选择特定的数据源8;(2)确定发送至数据源8的子查询内的任务类型或排序;(3)确定由查询系统10而不是数据源8来处理查询的一个或多个任务;(4)确定查询或子查询的任务排序(诸如,联接操作);(5)确定是否压缩查询或子查询的运算符;(6)或影响查询计划和由查询系统10生成的已编译查询的其他确定(诸如,选择性地确定是否将联接操作数推送到数据源)。作为一个示例(并且如相对于图3a-图3c进一步描述的),优化器14可以使查询系统10基于从子查询22的执行中所获知的数据源8中获取的度量,对查询计划的联接操作数重新排序。例如,优化器14可以对后续查询28的查询计划的联接操作数重新排序,以首先处理具有最小表大小(例如,最少行数)的表的联接操作数,然后处理具有最大表大小(例如,最高行数)的表的联接操作数。以这种方式,通过调整查询编译,以从运行的查询(或从基于查询本身或数据源属性的假设)中获取信息,并通过使用所获取的信息在数据源之间智能地应用或设置查询执行的联接或其他操作和/或方面,可以提高查询系统的性能。作为另一示例,通过向查询添加测控代码,以获得该查询的一个或多个度量,该技术可以在执行查询时动态地获得度量,而不依赖于直方图或发送请求数据库的度量的额外查询。这可以有助于查询系统访问用于查询执行的最新度量、可以提供对在使用传统数据库或其他数据源度量请求时不可用的度量的访问、可以减少查询系统和/或数据源的处理负担、和/或可以减少网络中的通信流量。图2是根据所公开的技术的一个或多个方面的图1的查询系统10的更详细的框图。在图2的示例中,查询系统200可以表示图1的查询系统10的示例实现方式。查询系统200可以包括客户端应用编程接口(api)202、节点204a-204n(统称为“节点204”)、连接器接口206a-206n(统称为“连接器接口206”)、执行引擎210、编译器212、优化器214和度量存储库216。查询系统200可以提供对数据源208a-208n(统称为“数据源208”)的访问。在图2的示例中,数据源208可以是异构数据源。连接器接口206、执行引擎210、编译器212和优化器214中的每个可以表示具有可由处理电路执行的机器可读指令的软件。查询系统200包括与该查询系统200接合的节点集群(例如,节点204)。在一些示例中,节点204是分布式网络的一部分。用户可以经由客户端应用编程接口202访问节点204,以向查询系统200的节点204发送查询,从而访问存储在数据源208中的一个或多个中的数据。在一些示例中,客户端应用编程接口202可以包括基于网络的管理控制台、命令行界面(cli)或其他编程接口、客户端api、图形用户界面和/或使用java、scala、c++、python或其他语言构建的本地接口。在一些示例中,节点204可以实现分散的对等网络协议(例如,有线),以用于用户向查询系统200发送查询。编程接口的示例可以包括java数据库连接(jdbc)、java流畅api(javafluentapi)、无会话http(sql)、无会话http(组件)等。作为客户端应用编程接口202实现jdbc的一个示例,由客户端应用编程接口202接收的查询与先前构建的会话和用户相关联。客户端应用编程接口202可以解析sql文本,以创建解析树结构。遍历解析树以针对连接器接口产生表名预览(tablenamepreview)。遍历解析树,以利用由连接器接口提供的表运算符产生运算符图。作为客户端应用编程接口202实现java流畅api的另一示例,流畅型java代码组装查询组件树,该查询组件树包含文本或抽象规范元素以及可执行java元素的混合。遍历查询组件树,以针对连接器接口产生表名预览。遍历查询组件树,以利用由连接器接口提供的表运算符产生运算符图。在客户端应用编程接口202实现无会话http(sql)的又一示例中,在每个查询上提供会话和用户认证。解析sql文本,以创建解析树结构。遍历解析树,以针对连接器接口产生表名预览。遍历解析树,以利用由连接器接口供应的表运算符产生运算符图。作为客户端应用编程接口202实现无会话http(组件)的另一示例,在每个查询上提供会话和用户认证。解析xml文本,以创建解析树结构。遍历解析树,以针对连接器接口产生表名预览。遍历解析树,以利用由连接器接口供应的表运算符产生运算符图。在一些示例中,被称为分布式查询协调器(dqc)的一个或多个节点(例如,节点204a)可以经由客户端应用编程接口202接收查询。被称为分布式查询执行器(dqe)的其他节点(例如,节点204b-204n)可以执行查询执行,并用于经由连接器接口206连接到数据源208。虽然上面的示例描述了作为dqc操作的节点204a和作为dqe操作的节点204b-204n,但是每个节点都可以作为dqc、dqe或这两者操作。查询系统200可以包括编译器212,该编译器212编译输入的查询,以构建输入查询的查询计划。编译器212可以包括将输入查询编译成字节码的即时(jit)编译器。查询计划可以包括用于完成查询的有序步骤集。即,这些步骤描述了创建查询结果所采用的数据源操作。在一些示例中,查询计划被表示为抽象图(诸如,树结构)。抽象图可以包括表示操作数(例如,提取操作数)的节点,以访问存储在数据源208中的一个或多个中的数据。在一些示例中,查询计划可以使用面向对象的设计,在该设计中,叶节点(例如,提取运算符)由与相应数据源208相关联的连接器接口206提供。作为一个示例,查询系统200可以接收用于访问存储在关系型数据库(例如,数据源208a)和非关系型数据库(例如,数据源208b)中的数据的查询。编译器212编译该查询并构建查询计划,以利用关系型数据库208a和非关系型数据库208b的本机能力。在该示例中,编译器212可以构建查询计划(诸如,抽象图),在该抽象图中,第一节点表示访问存储在关系型数据库208a中的数据的操作数,并且第二节点表示访问存储在非关系型数据库208b中的数据的操作数。更具体地,编译器212可以将查询(例如,中性方言查询)重构为子查询(诸如,包括访问存储在关系型数据库208a中的数据的操作数的关系型数据库查询(例如,sql)以及包括访问存储在非关系型数据库208b中的数据的操作数的非关系型数据库查询(例如,nosql))。查询系统200的执行引擎210可以执行由编译器212生成的查询计划。例如,执行引擎210可以下推可由数据源208直接执行的查询计划的部分。继续上面的示例,执行引擎210可以下推要由关系型数据库208a直接执行的关系型数据库查询,并且可以下推要由非关系型数据库208b直接执行的非关系型数据库查询。执行引擎210还可以通过从底层数据源208上提完成查询的执行所需的数据来执行查询计划的剩余部分。例如,执行引擎210可以接收从数据源208a和208b返回的单独的子查询结果数据,并为用户整合该数据。执行引擎210可以使用多个连接器接口206来访问底层的数据源208,每个该连接器接口206提供到数据源208中的对应一个的接口。连接器接口206负责执行由优化器214生成的查询计划的部分(例如,子查询),并将从数据源208返回的子查询结果数据传递至执行引擎210。在一些示例中,连接器接口206可以向编译器212提供提取运算符(例如,作为查询计划的节点),以用于生成查询计划,从而访问连接到连接器接口206的数据源。在一些示例中,连接器接口206可以提供关于表的度量,在查询计划生成时连接器接口206可以针对该表访问编译器212。例如,当查询计划生成时,编译器212可以识别查询所请求的表,并调查连接器接口206,以确定连接器接口206是否可以访问所识别的表。在这些示例中,连接器接口206可以向编译器212提供其底层数据源中的数据结构的元数据(例如,诸如行计数的表的粒度信息、或诸如大文本文件的通用信息),以用于生成查询计划。在这些示例中,连接器接口206可以包括高速缓存或其他存储器以存储元数据。在一些示例中,连接器接口206可以向由数据库管理的数据提供标准的美国国家标准协会(ansi)3部分命名接口(例如,catalog.schema.table)。例如,关系型数据库(例如,数据源208a)可以支持ansi3部分命名接口,并且连接器接口206a可以使用3部分名称以识别每个表。在其中一个或多个数据源208不支持ansi3部分命名接口的一些示例中,连接器接口206可以提供ansi3部分名称的缺失部分。作为一个示例,数据源208a可以是例如名为“销售”(例如,模式)并包括名为“客户”、“项目”和“订单”的表的postgres数据库(例如,目录)。查询计划可以包括以下操作数:从postgres.sales.customers中选择*连接器接口206a可以通过<postgres>.<sales>.<customers>的3部分名称来识别用于客户信息的查询的表,并接收从所识别的表中提取出的数据。在某些示例中,某些数据源(例如,用于流数据的数据源)可能不支持ansi3部分命名接口。在该示例中,连接器接口206c可以提供ansi3部分名称的缺失部分(诸如,目录和模式名称)。根据所公开的技术,查询系统200可以包括用于动态地优化多个数据源208的查询的优化器214。例如,优化器214可以使查询系统200在执行经编译的查询时动态地获得经编译的查询的一个或多个度量,并且基于动态地获得的度量来优化后续查询。尽管优化器214被示为单独的模块,但是优化器214可以是任何其他模块(诸如,编译器212)的一部分,或者在分布式环境中实现(诸如,由节点204实现)。在图2的示例中,优化器214可以使编译器212在编译查询时添加测控代码,以在执行经编译的查询时获得一个或多个度量。例如,为了获得关于由查询的执行产生的操作数的大小和/或谓词的选择性的度量,优化器214可以指示编译器212将计数器添加至子查询(例如,关系型数据库查询)代码,以对从关系型数据库返回的每行进行计数(或者对基于谓词返回的每行进行计数)。可替代地或附加地,优化器214可以使编译器212将计数器添加至子查询(例如,非关系型数据库查询)代码,以对诸如json文档的文档中的数组元素或嵌套数组进行计数。在其他示例中,为了获得关于表的列的基数的度量,优化器214可以使编译器212添加测控代码以估计列的不同值的数量。执行引擎210可以处理获得的度量,例如,基于经编译的查询的执行将计数制成表格。所获得的度量可以存储在度量存储库216中,该度量存储库216可以包括内存储器、外存储器、本地或远程存储装置(如图2中的内存储器所示)。在一些示例中,度量存储库16是分布式信息库。当查询系统200接收到后续查询时,优化器214可以使查询系统200基于所获得的度量为后续查询优化查询计划。例如,优化器214可以请求存储在度量存储库216中的度量(例如,行计数信息),并确定如何优化后续查询。作为一个示例,优化器214可以将决策和/或声明因素、启发式模型、机器学习模型和/或特征学习模型应用于所获得的度量,以确定如何优化查询计划。决策因素可以包括运算符基数、列数据类型、列唯一性、谓词的选择性、联接密度、计划枚举益处、布隆过滤器益处(bloomfilterbenefit)、分布益处、复制益处、重新分区益处、连接器下推益处、缓存益处、函数成本(functioncost)、评估顺序(evaluationorder)、生成的类重用或jit去优化的可能性、索引策略(例如,散列对树、散列表格式、散列函数)、事务(transaction)范围、事务大小或持续时间、事务优先级等。声明的因素可以包括主键(primarykey)或外键(foreignkey)关系、唯一声明、声明的索引、查询提示等。在一些示例中,优化器214可以应用启发式(在本文中也称为“经验法则”)模型、机器学习模型和/或特征学习模型。启发式模型可以包括一致近似、多项式近似和/或其他启发式模型。机器学习模型可以包括种子学习、动态学习、决策树、朴素贝叶斯分类器、k-最近邻(knn)、支持向量机(svm)、随机森林或其他机器学习模型。特征学习模型使用特征(例如,变量)来构建预测模型。特征可以包括分布简档(distributionprofile)、工作负荷简档、会话或用户、表、列运算符、谓词表达、投影表达以及查询的其他属性。在一些示例中,度量存储库216包括一个或多个运算符属性。属性包括上下文属性、表属性、列贡献属性和谓词摘要。例如,上下文属性可以包括用于查询的api的类型(例如,jdbc、网络、sql、java等)、发起该查询的用户、执行该查询的时间和/或工作负荷简档(例如,cpu负荷、内存使用、活动用户、活动查询计数等)。表属性可以包括出现在图(例如,查询计划)的子图中的表或流的属性。例如,该属性由表或流的系统全局“特征-id”以及应用的任何显式查询提示形成。列贡献属性可以包括子图中使用的列的属性,诸如,列被声明为私键还是外键、列被声明为唯一的、列声明为索引列、列是投影表达(例如,列直接出现在查询的输出中)、列有助于投影表达、列用于子图中的联接谓词、列用于子图中的分组、列用于子图中的排序、和/或列被命名但未被使用。谓词摘要可以以简化的“摘要”形式包括子图中谓词的属性,该谓词的属性指示谓词的形状和谓词所应用的列。幅度比较(例如,小于、大于)被标准化为包含性的(例如,小于或等于、大于或等于)。列之间的比较以编号较低的列为主列进行标准化。与复杂表达的比较或复杂表达之间的比较被记录为“复杂”,或者,如果谓词涉及用户定义函数(udf),则该谓词被记录为“具有udf的复杂”。与具有相似名称的列相等(例如,基于levenshtein距离的变体)被标记为键关系的可能提示。谓词的属性还可以包括与另一列相等、与具有名称相似性的另一列相等、小于另一列、大于另一列、等于常数、小于常数、大于常数、范围(表示为基值和范围)、“类似(like)”或“正则(regex)”摘要、其他或复杂谓词、和/或具有udf的其他或复杂谓词。如上所述,优化器214可以使查询系统200基于获得的度量来优化当前查询计划或后续查询的查询计划。作为一个示例,优化器214可以执行谓词下推和约束传播。例如,在可能的情况下,查询谓词和过滤器运算符被重新定位以更接近于查询计划(例如,图)中的表运算符。通过查询计划推断并传播新谓词。作为另一示例,优化器214可以对当前查询计划或后续查询的查询计划中的多个联接操作数重新排序,使得具有最小表的联接操作数首先联接,而具有最大表的联接操作数最后联接。例如,度量存储库216可以存储执行先前查询时所获得的表的行计数。在其他示例中,优化器214可以在可能的情况下将外部联接转换成内部联接。使用这些度量,优化器214知道了表的大小,并且可以对查询计划的联接操作数进行重新排序或转换。在另一示例中,优化器214可以提供子查询去相关和去嵌套。例如,优化器214可以将嵌套的子查询转换成独立的查询,然后经由联接运算符将该独立的查询重新附加到主查询。作为又一示例,优化器214可以下推限制运算符。例如,优化器214可以将行限制运算符向下(例如,更靠近表运算符)朝向查询计划中可以限制行的最低表运算符重新定位。在又一示例中,优化器214可以对行排序运算符进行下推排序。例如,优化器214可以将行排序运算符朝向将对最小可能输入执行任何所需排序操作的点向下重新定位。作为另一示例,优化器214可以使查询系统200优化运算符的排序。例如,优化器214可以通过将运算符或查询计划拟合到从在先前查询中测量的度量(或由连接器接口提供的统计)中生成的模型或预加载的启发式模型来生成假设。这些假设可用于构建排序优先级和/或控制计划枚举的程度。即,优化器214可以通过检查查询本身的特征和属性来识别模式,使用查询的特征和属性来将查询(或查询的一部分)与先前看到的信息或示例相关联,并基于该信息生成假设,并询问连接器接口206来校正或确认假设。以这种方式,优化器214可以将查询配置为:(1)为相同或相似的后续查询收集信息,并且(2)如果假设差,则在可能的情况下,针对全部或部分查询重新开始。作为另一示例,优化器214可以使查询系统200压缩查询计划(或查询计划的一部分)的运算符。例如,优化器214可以将提取运算符和相关联的谓词压缩为仅提取谓词行的单个查询。在该示例中,优化器214可以基于存储在度量存储库216中的操作数的大小(例如,提取运算符和谓词运算符的提取大小)来确定将提取运算符和相关谓词压缩为单个查询。在连接器接口206为查询计划提供叶节点(例如,获取运算符)的一些示例中,连接器接口206(诸如,通过根据需要适配或转换压缩的运算符)可以调解压缩操作。在一些示例中,优化器214可以提供列优化。例如,优化器214可以向下推动表达组件,以允许在压缩阶段期间的连接器接口的最大可见性。在一些示例中,优化器214可以选择性地确定是否将用于后续查询的查询计划中的联接操作数推送到数据库。在某些示例中,优化器214可以基于要联接的表的基数来防止将联接操作数推送到数据库。例如,数据源208a可以包括具有大量重复条目的表。如果联接操作数被推送到数据源208a,则联接表可能导致比数据源208a更大的数据集,这在一些情况下在将数据返回给查询系统200时效率较低。在这些示例中,优化器214可以主动防止联接操作数被推送到数据源208。在又一示例中,优化器214可以识别产生相同或相似输出的子查询。如果找到相容的子图,则该子图被合并成单个子图。被删除的子图被替换为对经合并的子图的引用,并且在某些情况下,被替换为附加谓词、推断谓词或列剪枝投影(columnpruningprojection)。可替换地或附加地,优化器214可以使查询系统200基于从运算符的一个或多个属性生成的假设来优化当前查询或后续查询的查询计划。假设是基于属性(诸如行数、子图是否比另一子图产生更少的行、子图是否比另一子图具有更高的联接优先级和/或子图是否为列产生给定的基数)的关于子图的预测。可以使用模型(诸如,动态学习模型、预加载启发法、具有一组先前遇到的属性和度量的基本动态模型(例如,具有在n行中产生的列c上的范围谓词的表t))来生成假设。可以通过执行一系列散列查找来生成假设,以找到潜在的可应用的模型。如果找到可应用的模型,则优化器214生成关于子图的假设。基于拟合度和与模型相关联的一般置信度,给假设分配置信度水平。一些启发式模型具有高置信度(例如,因为它们基于声明的元数据或高置信度统计或度量)。其他模型是粗略的经验法则启发法(例如,具有更多谓词的表具有更高的联接优先级)。当生成了合适的高置信度假设时,或者当调用默认、简单的经验法则启发法时,散列查找终止,从而产生触发测控请求的低置信度假设。在一些示例中,冲突的假设基于冲突假设的置信水平而混合。当多个动态模型在散列查找期间匹配时,动态模型被标记。如果同一组元素被重复标记,则这些元素将被合并。实际上,单独的元素成为聚类或回归模型的训练集。这比基于置信水平混合假设时产生更准确的假设,并且为重复遇到的查询元素或元素的安排产生更好的模型。当涉及单个连接器接口的假设生成时,该假设被呈现给连接器接口。连接器接口可以拒绝假设、修改假设或更改假设的置信水平。对于高值、低置信度假设,连接器接口可以选择执行数据采样操作或数据收集查询,以获得高置信度度量以用于优化当前查询和后续查询。响应于优化查询计划,优化器214可以生成对假设(例如,高值、低置信度假设)的测控请求。基于粗略的启发法的假设为低置信度,这导致依赖于低置信度假设的查询或子图生成对度量的获取。假设的类型确定所请求的度量。例如,一致联接密度的假设(例如,基于启发式或松散匹配的相似联接)可以生成对受影响的联接的测量的请求。在一些示例中,当观察到的度量与初始优化期间做出的优化决策不一致时,执行引擎210可以停止正在运行的查询或其部分,并使优化器214重新优化该查询。例如,如果优化决策依赖于低置信度假设并且子图可重启,则监控查询的执行的一个或多个监控仪器(例如,测控代码)被标记为重新优化触发器。例如,监控仪器可以用期望值或比率来扩充。如果测量值或比率显著地偏离期望值,则监控仪器将触发重启。图3a-图3c是根据本公开中的技术的一个或多个方面的示例优化操作的概念图。图3a是根据本公开中的技术的一个或多个方面的对查询计划的操作进行重新排序的示例优化操作的概念性图示。相对于图2的查询系统200描述图3a。在图3a的示例中,查询系统200可以接收后续查询302。查询系统200的编译器212编译后续查询302,以构建后续查询的查询计划304。在该示例中,查询计划304包括分组运算符306,以对从数据源a、b和c(例如,分别为图2的数据源208a-208c)返回的数据进行分组。例如,查询计划304包括为查询302生成的子查询的提取运算符310a-310c(统称为“提取运算符310”),以(例如,经由相应的连接器接口206)分别访问存储在数据源208中的数据。查询计划304还包括联接运算符308a-308b(统称为“联接运算符308”),以联接从数据源208检索的数据。在初始查询计划304中,提取运算符310a从数据源208a提取数据,提取运算符310b从数据源208b提取数据。联接运算符308a联接作为执行提取运算符310a、310b的结果而返回的数据。联接运算符308b随后联接作为执行提取运算符310c的结果而返回的数据。在该示例中,优化器214可以使查询系统200基于从在任何数据源208上执行的先前查询中获得的一个或多个度量来对操作数重新排序。例如,优化器214可以对查询计划304中的联接运算符(图示为联接运算符308c-308d)进行重新排序,使得具有最小表的联接运算符首先联接,而具有最大表的联接运算符最后联接。在该示例中,优化器214可以基于在执行先前查询时获得的表的行计数来确定数据源208的表的大小。例如,数据源208a和208c的表可以具有比数据源208b的表更低的行计数。基于数据源208的表的大小,优化器214可以对查询计划312(“优化的查询计划312”)中的联接运算符进行重新排序,使得联接运算符308c首先联接作为执行提取运算符310a和310c的结果而返回的数据,并且然后联接运算符308d联接作为执行提取运算符310b的结果而返回的数据。图3b是根据本公开中的技术的一个或多个方面的压缩查询计划的操作的示例优化操作的概念性图示。相对于图2的查询系统200描述图3b。在图3b的示例中,查询系统200可以接收后续查询322。查询系统200的编译器212编译后续查询322,以构建后续查询的查询计划324。在该示例中,查询计划324包括分组运算符326,以对从数据源a、b和c(例如,分别为图2的数据源208a-208c)返回的数据进行分组。例如,查询计划324包括为查询322生成的子查询的提取运算符330a-330c(统称为“提取运算符330”),以(例如,经由相应的连接器接口206)分别访问存储在数据源208中的数据。查询计划324还可以包括谓词运算符331a-331b(统称为“谓词运算符331”),以访问存储在数据源208中的数据子集。例如,谓词运算符331a请求访问数据源208c中的数据子集,其中,z=8。谓词运算符331b请求访问数据源208b中的数据子集,其中,y<5。查询计划324还包括联接运算符328a-328b(统称为“联接运算符328”),以联接作为执行提取运算符330和/或谓词运算符331的结果而返回的数据。例如,联接运算符328a联接作为执行提取运算符330c、谓词运算符331a、提取运算符330a和谓词运算符331b的结果而返回的数据。联接运算符328b随后联接作为执行提取运算符330b的结果而返回的数据。在该示例中,优化器214可以使查询系统200将提取运算符330c和谓词运算符331a压缩为仅提取谓词行的单个查询(例如,子查询334)。优化器214可以基于从在任何数据源208上执行的先前查询中获得的一个或多个度量来压缩提取运算符330c和谓词运算符331a。例如,优化器214可以确定操作数的大小(诸如,提取运算符330c的提取大小和谓词运算符331a的提取大小)。基于操作数的大小,优化器214可以将谓词运算符331a(例如,“其中,z=8”)与提取运算符330c(例如,“从c中选择k”)进行压缩以形成单个子查询334(例如,“从c中选择k,其中,z=8”)。以这种方式,在数据源208c处应用预测,从而在一些实例中减少了获得查询数据所需的网络流量。图3c是根据本公开中的技术的一个或多个方面的压缩查询计划的操作的另一示例优化操作的概念性图示。相对于图2的查询系统200描述图3c。在图3c的示例中,查询系统200可以接收后续查询342。查询系统200的编译器212编译后续查询342,以构建后续查询的查询计划344。在该示例中,查询计划344包括分组运算符346,以对从数据源a、b和c(例如,分别为图2的数据源208a-208c)返回的数据进行分组。例如,查询计划344包括为查询342生成的子查询的提取运算符350a-350c(统称为“提取运算符350”),以(例如,经由相应的连接器接口206)分别访问存储在数据源208中的数据。查询计划344还可以包括谓词运算符351a-351b(统称为“谓词运算符351”),以访问存储在数据源208中的数据子集。例如,谓词运算符351a请求访问数据源208c中的数据子集,其中,z=8。谓词运算符351b请求访问数据源208b中的数据子集,其中,y<5。查询计划344还包括联接运算符348a-348b(统称为“联接运算符348”),以联接作为执行提取运算符350和/或谓词运算符351的结果而返回的数据。例如,联接运算符348a联接作为执行提取运算符350c、谓词运算符351a、提取运算符350a和谓词运算符351b的结果而返回的数据。联接运算符348b随后联接作为执行提取运算符350b的结果而返回的数据。在该示例中,优化器214可以使查询系统200将提取运算符350a、350c和谓词运算符351a、351b压缩为仅提取谓词行的单个查询(例如,子查询354)。优化器214可以基于从在任何数据源208上执行的先前查询获得的一个或多个度量来压缩提取运算符350a、350c和谓词运算符351a、351b。例如,优化器214可以确定操作数的大小(诸如,提取运算符350a、350c的提取大小和谓词运算符351a、351b的提取大小)。基于操作数的大小,优化器214可以将提取运算符350a、350c、谓词运算符351a、351b和联接运算符348a进行压缩以形成子查询354的单个运算符(例如,“从c中选择c.k,其中,c.k=a.k且c.z=8且a.y<5”),从而访问数据源208a和208c。图4是示出根据所公开的技术的一个或多个方面的被配置用于动态优化查询的查询系统的操作的流程图。相对于图2中描述的示例查询系统200来描述图4。在图4的示例中,查询系统200接收用于访问存储在多个数据源中的第一数据的查询(402)。例如,用户可以基于中性方言(诸如,sql)指定查询。与查询系统200接合的一个或多个节点204可以接收查询,以访问存储在一个或多个数据源208中的数据。查询系统200编译查询,以生成经编译的查询,该经编译的查询包括用于在执行经编译的查询时获得一个或多个度量的一个或多个指令(404)。例如,查询系统200的编译器212可以编译查询,以构建查询计划,从而利用数据源208的本机能力。更具体地,编译器212可以将查询(例如,中性方言查询)重构为子查询(例如,关系/非关系型数据库查询),以访问存储在多个数据源208中的数据。优化器214可以使编译器212在编译查询时添加测控代码(例如,计数器),以在执行经编译的查询时获得一个或多个度量。查询系统200获得一个或多个度量,并使用这些度量以在一个或多个数据源处执行经编译的查询的部分。例如,查询系统200的执行引擎210可以执行由编译器212生成的查询计划。例如,执行引擎210可以将子查询经由连接器接口206并行地分发到多个数据源208,每个该连接器接口206提供到对应的一个数据源208的接口。连接器接口206负责执行由优化器214生成的查询计划的部分(例如,子查询),并将从数据源208返回的子查询结果数据传递至执行引擎210。当查询系统200接收到访问存储在多个数据源中的第二数据的后续查询(406)时,查询系统200基于一个或多个度量为后续查询优化查询计划(408)。例如,当查询系统200接收到后续查询时,查询系统200的编译器212可以编译该后续查询,以生成后续查询的查询计划,该查询计划与查询系统200在没有度量的情况下将生成的查询计划不同。例如,基于数据源208的动态获得的度量,优化器214可以使查询系统200:(1)为数据集选择特定的数据源8;(2)确定发送给数据源8的子查询内的任务类型或排序;(3)确定由查询系统10而不是数据源8来处理查询的一个或多个任务;(4)确定查询或子查询的任务排序(诸如,联接操作);(5)确定是否压缩查询或子查询的运算符;(6)或影响查询计划和由查询系统10生成的经编译查询的其他确定(诸如,选择性地确定是否将联接操作数推送到数据源)。图5是根据本公开的一种或多种技术操作的示例计算装置500的框图。图5可以示出计算装置的具体示例,该计算装置包括用于执行图2中的任何一个节点204的一个或多个处理器502或者本文描述的任何其他计算装置。在图5的示例中,计算装置500可以是工作站、服务器、大型计算机、笔记本或膝上型计算机、台式计算机、平板电脑、智能电话、功能电话或任何种类的其他可编程数据处理设备。例如,图5的计算装置500可以表示如图2所示的查询系统200的任何节点。计算装置500的其他示例可以在其他实例中使用。尽管出于示例的目的在图5中示出为独立计算装置500,但是计算装置可以是包括用于执行软件指令的一个或多个处理器或其他合适的计算环境的任何组件或系统,并且例如不必包括图5中示出的一个或多个元件(例如,通信单元506;并且在一些示例中,诸如(一个或多个)存储装置508的组件可以不在计算装置500中)。如图5的具体示例所示,计算装置500包括一个或多个处理器502、一个或多个输入装置504、一个或多个通信单元506、一个或多个输出装置512、一个或多个存储装置508以及一个或多个用户界面(ui)装置510。在一个示例中,计算装置500还包括可由计算装置500执行的一个或多个应用程序522和操作系统516。组件502、504、506、508、510和512中的每个(物理地、通信地和/或可操作地)耦接以用于组件间通信。在一些示例中,通信信道514可以包括系统总线、网络连接、进程间通信数据结构或用于传送数据的任何其他方法。作为一个示例,组件502、504、506、508、510和512可以通过一个或多个通信信道514耦接。在一个示例中,处理器502被配置为实现用于在计算装置500内执行的功能和/或处理指令。例如,处理器502能够处理存储在存储装置508中的指令。处理器502的示例可以包括微处理器、控制器、数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)或等效的分立或集成逻辑电路中的任何一个或多个。一个或多个存储装置508可以被配置为在操作期间将信息存储在计算装置500内。在一些示例中,存储装置508被描述为计算机可读存储介质。在一些示例中,存储装置508是临时存储器,这意味着存储装置508的主要目的不是长期存储。在一些示例中,存储装置508被描述为易失性存储器,这意味着当计算机关闭时,存储装置508不维护存储的内容。易失性存储器的示例包括随机存取存储器(ram)、动态随机存取存储器(dram)、静态随机存取存储器(sram)和本领域已知的其他形式的易失性存储器。在一些示例中,存储装置508用于存储供处理器502执行的程序指令。在一个示例中,存储装置508由在计算装置500上运行的软件或应用程序使用以在程序执行期间临时存储信息。在一些示例中,存储装置508还包括一个或多个计算机可读存储介质。存储装置508可以被配置为存储比易失性存储器更大的信息量。存储装置508还可以被配置用于信息的长期存储。在一些示例中,存储装置508包括非易失性存储元件。这种非易失性存储元件的示例包括磁硬盘、光盘、软盘、闪存或各种形式的电可编程存储器(eprom)或电可擦除可编程(eeprom)存储器。在一些示例中,计算装置500还包括一个或多个通信单元506。在一个示例中,计算装置500利用通信单元506经由一个或多个网络(诸如,一个或多个有线/无线/移动网络)与外部装置通信。通信单元506可以包括网络接口卡(诸如,以太网卡)、光收发器、射频收发器或可以发送和接收信息的任何其他类型的装置。这种网络接口的其他示例可括3g、4g、5g和wifi无线电。在一些示例中,计算装置500使用通信单元506与外部装置通信。在一个示例中,计算装置500还包括一个或多个用户界面装置510。在一些示例中,用户界面装置510被配置为通过触觉、音频或视频反馈从用户接收输入。(一个或多个)用户界面装置510的示例包括存在敏感显示器(presence-sensitivedisplay)、鼠标、键盘、语音响应系统、摄像机、麦克风或用于检测来自用户的命令的任何其他类型的装置。在一些示例中,存在敏感显示器包括触敏屏幕。计算装置500中还可以包括一个或多个输出装置512。在一些示例中,输出装置512被配置为使用触觉、音频或视频刺激向用户提供输出。在一个示例中,输出装置512包括存在敏感显示器、声卡、视频图形适配器卡或用于将信号转换成人类或机器可理解的适当形式的任何其他类型的装置。输出装置512的附加示例包括扬声器、阴极射线管(crt)监视器、液晶显示器(lcd)或可以向用户生成可理解输出的任何其他类型的装置。计算装置500可以包括操作系统516。在一些示例中,操作系统516控制计算装置500的组件的操作。例如,在一个示例中,操作系统516促进一个或多个应用程序522与处理器502、通信单元506、存储装置508、输入装置504、用户界面装置510和输出装置512通信。应用程序522还可以包括可由计算装置500执行的程序指令和/或数据。优化器524可以包括用于使计算装置500执行本公开中的相对于图1的优化器14和图2的优化器214描述的技术的指令。作为一个示例,优化器524可以包括使计算装置500根据本公开的技术动态地优化查询的指令。本公开中描述的技术可以至少部分地以硬件、软件、固件或其任意组合来实现。例如,所描述的技术的各个方面可以在一个或多个处理器中实现,该处理器包括一个或多个微处理器、数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)、或任何其他等效的集成或分立逻辑电路以及这些组件的任何组合。术语“处理器”或“处理电路”通常可以指任何前述逻辑电路(单独或与其他逻辑电路组合)或任何其他等效电路。包括硬件的控制单元也可以执行本公开的一种或多种技术。这样的硬件、软件和固件可以在同一装置内或在单独的装置内实现,以支持本公开中描述的各种操作和功能。此外,任何描述的单元、模块或组件可以一起或单独实现为分立但可互操作的逻辑装置。将不同特征描述为模块或单元或引擎旨在突出不同的功能方面,并不一定意味着这样的模块或单元必须由单独的硬件或软件组件来实现。相反,与一个或多个模块或单元相关联的功能可以由单独的硬件或软件组件来执行,或者集成在公共或单独的硬件或软件组件中。本公开中描述的技术也可以在包含指令的计算机可读介质(诸如,计算机可读存储介质)中体现或编码。在计算机可读存储介质中体现或编码的指令可以使可编程处理器或其他处理器(例如,在执行指令时)执行该方法。计算机可读存储介质可以包括随机存取存储器(ram)、只读存储器(rom)、可编程只读存储器(prom)、可擦除可编程只读存储器(eprom)、电可擦除可编程只读存储器(eeprom)、闪存、硬盘、cd-rom、软盘、盒式磁带、磁介质、光学介质或其他计算机可读介质。当前第1页12当前第1页12