Oracle和GUID下的性能问题作为索引列

时间:2017-05-29 13:56:09

标签: oracle performance optimization nhibernate guid

我遇到了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(?)

有没有办法更改此特殊点的查询行为?

由于

奥利弗

0 个答案:

没有答案