查询原生编译

MOT的另一个特性是,在预编译的完整查询需要执行之前,能够以原生格式(使用PREPARE语句)准备并解析这些查询。

这种原生格式方便后续更有效地执行(使用EXECUTE命令)。这种执行类型速度要快得多,因为原生格式在执行期间绕过多个数据库处理层,从而获得更好的性能。

这种分工避免了重复的解析分析操作。查询和事务语句可以交互执行。此功能有时称为即时(Just-In-Time,JIT)查询编译。

查询编译:PREPARE语句

若要使用MOT的原生查询编译,请在执行查询之前调用PREPARE客户端语句。MOT将预编译查询和(或)从缓存预加载先前预编译的代码。

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

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

PREPARE在数据库服务器中创建一个预处理语句,该语句是一个可用于优化性能的服务器端对象。

运行命令

发出EXECUTE命令时,将解析、分析、重写和执行预处理语句。这种分工避免了重复的解析分析操作,同时使执行计划依赖于特定的设置值。

下面是在Java应用程序中调用PREPARE和EXECUTE语句的示例。

  1. conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword);
  2. // Example 1: PREPARE without bind settings
  3. String query = "SELECT * FROM getusers";
  4. PreparedStatement prepStmt1 = conn.prepareStatement(query);
  5. ResultSet rs1 = pstatement.executeQuery())
  6. while (rs1.next()) {…}
  7. // Example 2: PREPARE with bind settings
  8. String sqlStmt = "SELECT * FROM employees where first_name=? and last_name like ?";
  9. PreparedStatement prepStmt2 = conn.prepareStatement(sqlStmt);
  10. prepStmt2.setString(1, "Mark"); // first name “Mark”
  11. prepStmt2.setString(2, "%n%"); // last name contains a letter “n”
  12. ResultSet rs2 = prepStmt2.executeQuery())
  13. while (rs2.next()) {…}

MOT编译支持的特性和不支持的特性见下文。

轻量执行支持的查询

以下查询类型适合轻量执行:

  • 简单点查询

    • SELECT (including SELECT for UPDATE)
    • UPDATE
    • DELETE
  • INSERT查询

  • 引用主键的完整前缀的范围UPDATE查询

  • 引用主键的完整前缀的范围SELECT查询

  • JOIN查询,其中一部分或两部分重叠为点查询

  • 引用每个连接表中主键的完整前缀的JOIN查询

轻量执行不支持的查询

任何特殊的查询属性都不适用于轻量执行。特别是如果以下条件中的任何一项适用,则该查询不适合轻量执行。有关更多信息,请参阅“原生编译和轻量执行不支持的查询”。

需要强调一点,如果查询语句不适用原生编译和轻量执行,不向客户端报告错误,查询仍以正常和规范的方式执行。

有关MOT原生编译功能的详细信息,请参阅 “查询原生编译”或“查询原生编译(JIT)”的有关内容。