Class BucketedIndex

Object
gudusoft.gsqlparser.sqlenv.BucketedIndex

public class BucketedIndex extends Object
分桶索引(SQL Server COLLATION_BASED 专用)

用于优化 SQL Server 的 schema 对象查找,将 O(N) 全表扫描优化为 O(1) + O(bucket_size)。

核心思想:

  • 桶键 = ASCII lowercase + 长度(例如:"MyTable" → "mytable_7")
  • 相同桶键的对象放在同一桶内(通常 < 20 个对象)
  • 查找时先定位桶(O(1)),再用 Collator 比较桶内对象(O(bucket_size))

性能特性:

  • 10,000 对象场景:从 ~20μs(全表扫描)优化到 ~800ns(分桶)
  • 性能提升:~25x
  • 内存开销:每个对象额外 ~8 bytes(HashMap overhead)

使用示例:

 CollatorProvider provider = new CollatorProvider();
 BucketedIndex index = new BucketedIndex(provider, "SQL_Latin1_General_CP1_CI_AS");

 // 添加对象
 index.put("MyTable", tableObject);
 index.put("MYTABLE", tableObject2);  // 同一桶(mytable_7)

 // 查找对象(使用 Collator 比较)
 TSQLSchemaObject found = index.get("myTable");  // CI: 能找到
 
Since:
3.1.0.9
  • Constructor Details

    • BucketedIndex

      public BucketedIndex(CollatorProvider collatorProvider, String collationName, ESQLDataObjectType objectType)
      构造分桶索引
      Parameters:
      collatorProvider - Collator 提供者(ThreadLocal 缓存)
      collationName - SQL Server collation 名称
      objectType - 对象类型(用于日志)
  • Method Details

    • put

      public void put(String name, TSQLSchemaObject object)
      添加对象到桶
      Parameters:
      name - 对象名称
      object - schema 对象
    • get

      public TSQLSchemaObject get(String name)
      查找对象(先定位桶,再 Collator 比较)
      Parameters:
      name - 对象名称
      Returns:
      找到的对象,未找到时返回 null
    • remove

      public boolean remove(String name, TSQLSchemaObject object)
      移除对象
      Parameters:
      name - 对象名称
      object - 要移除的对象
      Returns:
      true 如果成功移除
    • getAllObjects

      获取所有对象(用于遍历)
      Returns:
      所有对象的列表
    • getBucketCount

      public int getBucketCount()
      获取桶数量(用于调试)
      Returns:
      桶的数量
    • getObjectCount

      public int getObjectCount()
      获取对象数量
      Returns:
      对象总数
    • getBucketStats

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