首页 > 其他分享 >openGauss MOT查询原生编译_JIT

openGauss MOT查询原生编译_JIT

时间:2024-04-29 14:55:43浏览次数:27  
标签:LLVM 查询 编译 JIT MOT openGauss 执行

MOT查询原生编译(JIT)

MOT使您可以在执行之前以原生格式(使用PREPARE语句)准备并分析预编译的完整查询。

这种本机格式以后可以更有效地执行(使用EXECUTE命令)。这种类型的执行效率要高得多,因为在执行期间,本机格式绕过了多个数据库处理层。这种分工避免了重复的解析分析操作。Lite Executor模块负责执行预准备查询,其执行路径比封装执行的常规通用计划要快得多。这是通过LLVM使用实时(JIT)编译来实现的。此外,以伪LLVM的形式提供具有潜在相似性能的类似解决方案。

下面是SQL中的PREPARE语法示例–

PREPARE name [ ( data_type [, ...] ) ] AS statement 

下面是一个如何在Java应用程序中调用PREPARE和EXECUTE语句的示例:

conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword); 

// Example 1: PREPARE without bind settings 
String query = "SELECT * FROM getusers"; 
PreparedStatement prepStmt1 = conn.prepareStatement(query); 
ResultSet rs1 = pstatement.executeQuery()) 
while (rs1.next()) {…} 

// Example 2: PREPARE with bind settings 
String sqlStmt = "SELECT * FROM employees where first_name=? and last_name like ?"; 
PreparedStatement prepStmt2 = conn.prepareStatement(sqlStmt); 
prepStmt2.setString(1, "Mark"); // first name “Mark” 
prepStmt2.setString(2, "%n%"); // last name contains a letter “n” 
ResultSet rs2 = prepStmt2.executeQuery()) 
while (rs2.next()) {…}

Prepare

Prepare创建一个预处理语句。预处理语句是服务器端对象,可用于优化性能。执行PREPARE语句时,将解析、分析和重写指定的语句。

如果查询语句中提到的表是MOT表,则MOT编译负责对象准备,并基于LLVM将查询编译成IR字节码进行特殊优化。

每当需要新的查询编译时,都会分析查询,并使用实用程序GsCodeGen对象和标准LLVM JIT API (IRBuilder)为查询生成合适的IR字节代码。完成字节代码生成后,代码将被JIT编译到单独的LLVM模块中。编译的代码生成一个C函数指针,以后可以调用该指针直接执行。请注意,这个C函数可以被许多线程并发调用,只要每个线程提供不同的执行上下文(详细信息如下)。每个这样的执行上下文称为“JIT上下文”。

为了进一步提高性能,MOT JIT对其LLVM代码结果应用缓存策略,使它们能够被在不同会话中的相同查询重用。

执行

当发出EXECUTE命令时,会计划并执行预准备语句(上文所述)。这种分工避免了重复的解析分析工作,同时使执行计划依赖于提供的特定设置值。

当生成的执行查询命令到达数据库时,它使用相应的IR字节代码,在MOT引擎中直接执行该代码,并且执行效率更高。这称为“轻量级执行”。

此外,为了可用性,Lite Executor维护了一个预先分配的JIT源池。每个会话预分配自己的会话本地JIT上下文对象池(用于重复执行预编译查询)。

有关更多详细信息,请参阅“支持Lite执行的查询”和“不支持Lite执行的查询”部分。

JIT编译对比-opengauss盘表与MOT表

目前,openGauss包含针对其基于磁盘的表的JIT/CodeGen查询优化的两种主要形式:

  • 加速表达式计算,例如在WHERE子句、目标列表、聚合和投影中
  • 内联小函数调用。

这些优化是局部的(从某种意义上说,它们不优化整个解释的运算符树或完全替换它),并且主要针对CPU绑定的复杂查询,通常在OLAP用例中可见。查询的执行是在使用解释运算符树的拉模型(Volcano样式处理)中执行的。激活后,每次执行查询时都会执行编译。目前,尚未提供生成的LLVM代码的缓存及其跨会话和查询的重用。

相反,MOT JIT优化为符合MOT JIT优化条件的整个查询提供了LLVM代码。结果代码用于直接执行MOT表,而解释的运算符模型则完全放弃。结果实际上是为整个特定查询执行生成的手写LLVM代码。

另一个显着的概念差异是MOT LLVM代码只在查询的PREPARE阶段为准备查询生成,而不是在查询执行时生成。由于OLTP查询的运行时间相当短,因此这对于OLTP场景尤其重要,这无法在每次查询执行期间生成代码和执行较长的查询编译时间。

最后,在openGauss中,激活PREPARE意味着于同一个会话中具有不同参数的执行之间重用生成的计划。同样,MOT JIT对其LLVM代码结果应用了缓存策略,并扩展了缓存策略,以便在不同会话之间重用。因此,单个查询可以只编译一次,其LLVM代码可以在多个会话中重用,这同样有利于OLTP场景。

详情查看:https://opengauss.org

详情查看:https://docs-opengauss.osinfra.cn

标签:LLVM,查询,编译,JIT,MOT,openGauss,执行
From: https://www.cnblogs.com/renxyz/p/18165505

相关文章

  • openGauss MOT性能基准
    MOT性能基准我们的性能测试是基于业界和学术界通用的TPC-C基准。测试使用了BenchmarkSQL(请参见MOT样例TPC-C基准),并且使用交互式SQL命令而不是存储过程来生成工作负载。说明:使用存储过程方法可能会产生更高的性能结果,因为它需要大大减少网络往返和数据库封装SQL处理周期。......
  • openGauss MOT外部支持工具
    MOT外部支持工具为了支持MOT,修改了以下外部openGauss工具。请确保使用的工具是最新版本。下面将介绍与MOT相关的用法。有关这些工具及其使用方法的完整说明,请参阅《工具与命令参考》。gs_ctl(全量和增量)此工具用于从主服务器创建备服务器,以及当服务器的时间线偏离后,将服务器与其......
  • openGauss MOT索引
    MOT索引MOT索引基于最先进的Masstree[对比:磁盘与MOT]的免锁索引,用于多核系统的快速和可扩展的键值(KV)存储,通过B+树的Trie实现。在多核服务器和高并发工作负载上,性能优异。它使用各种先进的技术,如乐观锁方法、缓存感知和内存预取。在比较了各种最先进的解决方案(如[对比:磁盘与MOT],[......
  • openGauss MOT特性及价值
    MOT特性及价值MOT在高性能(查询和事务延迟)、高可扩展性(吞吐量和并发量)甚至在某些情况下成本(高资源利用率)这些方面拥有显著优势。低延迟(LowLatency):提供快速的查询和事务响应时间。高吞吐量(HighThroughput):支持峰值和持续高用户并发。高资源利用率(HighResourceUtilization):充......
  • openGauss MOT统计
    MOT统计统计信息主要用于性能分析或调试。在生产环境中,通常不打开它们(默认是关闭的)。统计信息主要由数据库开发人员使用,数据库用户较少使用。对性能有一定影响,特别是对服务器。对用户的影响可以忽略不计。统计信息保存在数据库服务器日志中。该日志位于data文件夹中,命名为postg......
  • openGauss MOT使用
    MOT使用使用MOT非常简单,以下几个小节将会进行描述。openGauss允许应用程序使用MOT和基于标准磁盘的表。MOT适用于最活跃、高竞争和对吞吐量敏感的应用程序表,也可用于所有应用程序的表。以下命令介绍如何创建MOT,以及如何将现有的基于磁盘的表转换为MOT,以加速应用程序的数据库相......
  • openGauss MOT使用概述
    MOT使用概述MOT作为openGauss的一部分自动部署。有关如何计算和规划所需的内存和存储资源以维持工作负载的说明,请参阅MOT准备。参考MOT部署了解MOT中所有的配置,以及服务器优化的非必须选项。使用MOT的方法非常简单。MOT命令的语法与基于磁盘的表的语法相同,并支持大多数标准,如Pos......
  • openGauss MOT数据采集速度
    MOT数据采集速度该测试模拟海量物联网、云端或移动端接入的实时数据流,快速持续地把海量数据注入到数据库。本次测试涉及大量数据采集,具体如下:1000万行数据由500个线程发送,2000轮,每个insert命令有10条记录(行),每条记录占200字节。客户端和数据库位于不同的机器上。数据库服......
  • openGauss MOT配置
    MOT配置预置MOT用于创建工作MOT。为了获得最佳效果,建议根据应用程序的特定要求和偏好自定义MOT配置(在mot.conf文件中定义)。该文件在服务器启动时只读。如果在系统运行中编辑此文件,则必须重新加载服务器才能使修改内容生效。mot.conf文件与postgres.conf配置文件在同一文件夹下......
  • openGauss MOT日志记录-WAL重做日志概念
    MOT日志记录:WAL重做日志概念概述预写日志记录(WAL)是确保数据持久性的标准方法。WAL的主要概念是,数据文件(表和索引所在的位置)的更改只有在记录这些更改之后才会写入,即只有在描述这些更改的日志记录被刷新到永久存储之后才会写入。MOT全面集成openGauss的封装日志记录设施。除持久......