我遇到了Oracle的性能问题。问题出现在GUID
和{Oracle}中生成的RAW(16)
数据类型的组合中。
我们假设我们有一个这样的表:
TableX
Id RAW(16)
Caption Varchar
Mandatory_Id RAW(16)
列Mandatory_Id
如果我通过列Mandatory_Id
上的条件API进行查询,那么Hibernate会创建一个类似的查询:
SELECT this_.Id as Id1_16_0_,
this_.Caption as Caption2_16_0_,
this_.Mandatory_Id as Mandatory_Id3_16_0_
FROM TableX this_
WHERE this_.Mandatory_Id = ?
参数?
是GUID-Object
到目前为止一直很好;-)我们继续:Oracle的查询优化器接受此查询并将其修改为:
SELECT this_.Id as Id1_16_0_,
this_.Caption as Caption2_16_0_,
this_.Mandatory_Id as Mandatory_Id3_16_0_
FROM TableX this_
WHERE RAWTOHEX(this_.Mandatory_Id) = ?
这里它失控了。
谓词RAWTOHEX()
导致Oracle不使用Mandatory_Id
上的索引。而是进行全表扫描。
正确的查询应如下所示:
SELECT this_.Id as Id1_16_0_,
this_.Caption as Caption2_16_0_,
this_.Mandatory_Id as Mandatory_Id3_16_0_
FROM TableX this_
WHERE this_.Mandatory_Id = HEXTORAW(?)
有没有办法更改此特殊点的查询行为?
由于
奥利弗