Class CompositeKeyOptimizer

Object
gudusoft.gsqlparser.sqlenv.CompositeKeyOptimizer

public class CompositeKeyOptimizer extends Object
Composite Key Optimizer (Phase 4 - ClickHouse/Couchbase 优化)

用于全大小写敏感数据库(ClickHouse, Couchbase)的单次 Map 查找优化。

核心思想:

  • 将多级标识符编码为单个复合键(避免 3 次 Map 查找)
  • 格式:len1#seg1|len2#seg2|len3#seg3|objectType
  • 例如:"3#db1|6#schema|5#table|dotTable"
  • 性能:分层索引 2-4μs → 复合键 <200ns(~10x 提升)

适用条件(必须全部满足):

  1. 数据库厂商:ClickHouse 或 Couchbase(全标识符大小写敏感)
  2. 标识符无引号(引号会改变大小写规则)
  3. USE_COMPOSITE_KEY_OPT = true(默认 false,谨慎开启)

性能特性:

  • 查找时间:~200ns(vs 2-4μs 分层索引)
  • 内存开销:每个对象额外 ~32 bytes(复合键字符串)
  • 构建时间:~100ns(长度前缀编码)

使用示例:

 CompositeKeyOptimizer optimizer = new CompositeKeyOptimizer(EDbVendor.dbvclickhouse);

 // 检查是否可以使用复合键
 if (optimizer.canUseCompositeKey("db.schema.table")) {
     // 构建复合键
     String key = optimizer.buildCompositeKey("db.schema.table", ESQLDataObjectType.dotTable);
     // 结果: "2#db|6#schema|5#table|dotTable"

     // 存储到单一 Map
     compositeKeyMap.put(key, tableObject);
 }
 
Since:
3.1.0.9
  • Constructor Details

  • Method Details

    • canUseCompositeKey

      public boolean canUseCompositeKey(String qualifiedName)
      判断是否可以使用复合键快速路径

      条件(必须全部满足):

      1. 复合键优化已启用(USE_COMPOSITE_KEY_OPT = true)
      2. 厂商支持(ClickHouse 或 Couchbase)
      3. 限定名没有引号字符(引号会改变大小写规则)
      Parameters:
      qualifiedName - 完整限定名(如 "db.schema.table")
      Returns:
      true 如果可以使用复合键
    • buildCompositeKey

      public String buildCompositeKey(String qualifiedName, ESQLDataObjectType objectType)
      构建复合键(使用长度前缀编码避免冲突)

      格式: len1#segment1|len2#segment2|len3#segment3|objectType

      例如: "3#db1|6#schema|5#table|dotTable"

      优势:避免分隔符冲突(标识符可能包含 '.' 或 '|')

      Parameters:
      qualifiedName - 完整限定名(如 "db.schema.table")
      objectType - 对象类型
      Returns:
      复合键
    • put

      public void put(String qualifiedName, ESQLDataObjectType objectType, TSQLSchemaObject object)
      添加对象到复合键索引
      Parameters:
      qualifiedName - 完整限定名
      objectType - 对象类型
      object - schema 对象
    • get

      public TSQLSchemaObject get(String qualifiedName, ESQLDataObjectType objectType)
      从复合键索引查找对象
      Parameters:
      qualifiedName - 完整限定名
      objectType - 对象类型
      Returns:
      找到的对象,未找到时返回 null
    • remove

      public TSQLSchemaObject remove(String qualifiedName, ESQLDataObjectType objectType)
      移除对象
      Parameters:
      qualifiedName - 完整限定名
      objectType - 对象类型
      Returns:
      被移除的对象,未找到时返回 null
    • size

      public int size()
      获取索引大小
      Returns:
      索引中的对象数量
    • clear

      public void clear()
      清空索引
    • isEnabled

      public boolean isEnabled()
      获取是否启用
      Returns:
      true 如果已启用
    • getVendor

      public EDbVendor getVendor()
      获取厂商
      Returns:
      数据库厂商
    • getStats

      public String getStats()
      获取统计信息(用于性能分析)
      Returns:
      统计信息字符串