public class BucketedIndex extends Object
用于优化 SQL Server 的 schema 对象查找,将 O(N) 全表扫描优化为 O(1) + O(bucket_size)。
核心思想:
性能特性:
使用示例:
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: 能找到
| Constructor and Description |
|---|
BucketedIndex(CollatorProvider collatorProvider,
String collationName,
ESQLDataObjectType objectType)
构造分桶索引
|
| Modifier and Type | Method and Description |
|---|---|
TSQLSchemaObject |
get(String name)
查找对象(先定位桶,再 Collator 比较)
|
List<TSQLSchemaObject> |
getAllObjects()
获取所有对象(用于遍历)
|
int |
getBucketCount()
获取桶数量(用于调试)
|
String |
getBucketStats()
获取桶统计信息(用于性能分析)
|
int |
getObjectCount()
获取对象数量
|
void |
put(String name,
TSQLSchemaObject object)
添加对象到桶
|
boolean |
remove(String name,
TSQLSchemaObject object)
移除对象
|
public BucketedIndex(CollatorProvider collatorProvider, String collationName, ESQLDataObjectType objectType)
collatorProvider - Collator 提供者(ThreadLocal 缓存)collationName - SQL Server collation 名称objectType - 对象类型(用于日志)public void put(String name, TSQLSchemaObject object)
语义:与 HashMap.put(K, V) 一致——若桶内已存在与 name 在
collation 下相等的条目,则替换之;否则追加。这样 BucketedIndex 与 schemaObjectMap
(legacy)/ tables(hierarchical)三处索引在重复写入时一致采用 overwrite 语义,
避免 get(java.lang.String) 在 case-different 重复 put 后返回较早条目而 legacy/hierarchical
返回较晚条目的不对称(slice S3 修复)。
已知遗留问题(slice S3 范围外,待 S4 处理):
computeBucketKey(java.lang.String) 与 collator 比较都基于 raw name,不剥离 vendor
delimiter([] / "" / ``)。因此 SQL Server 下以加引号
与不加引号写入的等价标识符(如 "[FOO]" 与 "foo")会落入不同的桶,
而 legacy SQLUtil.getIdentifierNormalName 会把两者归一化为同一 key
("FOO")。此差异在 SQL Server + bucketed flag 启用 + 直接构造重复 table
的窄场景下出现;正常使用 createTable 不会触发,因为它在构造前会先
dedupe。后续修复方向:在 computeBucketKey 与 collator 比较时先剥离
vendor delimiter(需要在 BucketedIndex 引入 vendor / delimiter
stripper 上下文)。
name - 对象名称object - schema 对象public TSQLSchemaObject get(String name)
name - 对象名称public boolean remove(String name, TSQLSchemaObject object)
name - 对象名称object - 要移除的对象public List<TSQLSchemaObject> getAllObjects()
public int getBucketCount()
public int getObjectCount()
public String getBucketStats()