LightDB22.2-增强对oracle hint 特性的兼容(二)
1. 逗号分隔
oracle 可以使用逗号或空格来分隔参数,原先 lightdb使用空格来分隔参数,现在也支持逗号来分隔参数,示例如下:use_hash(a,b,c)
。
2. 大小写不敏感
oracle 对于 hint 中指定的表名是不区分大小写的,即use_hash(a)
与use_hash(A)
相同。
lightdb 之前版本 hint 中使用的表名是区分大小写的,这个版本开始改为不区分大小写,对于指定的表名都转为小写(与sql相同,在sql中表名会转为小写),通过加双引号不表明不进行转换。即 use_hash(a)
与 use_hash(A)
相同,use_hash("a")
与 use_hash(A)
相同, use_hash("A")
与 use_hash(A)
不同。
3. parallel hint 支持语句级
oracle 支持对语句使用parallel hint,如下:
select/*+parallel(4)*/ * from t1,t2 where t1.id=t2.id;
parallel 会对 t1 和 t2 表都生效。
现在 lightdb 也支持上述用法,用来对一个查询块中的所有表指定并发。
4. 支持scan, join hint 作用于单表子查询中的单表
Access path and join hints on referenced views are ignored unless the view contains a single table or references an Additional Hints view with a single table. For such single-table views, an access path hint or a join hint on the view applies to the table inside the view.
在 oracle 中access path 和join hint 会作用于单表子查询中的单表,如下所示:
select/*+full(y) use_hash(t1 y)*/ * from t1,(select * from (select * from t2 where id>10)x where x.id<100) where t1.id=y.id;
正常来说,full
不会对view起效,而y
merge 后 会消失,use_hash(t1 y)
也不应该起效,但oracle 对于这种情况会进行特殊处理,full(y)
会对 t2 表起效,相当于 full(y)
转换为了 full(t2@xxx)
;use_hash(t1 y)
相当于转换为了 use_hash(t1 t2@xxx)
。
现在 lightdb 也支持了这个特性。可以方便的进行迁移。