基于Hibernate操作Oracle:GUID列应建直接索引还是RAWTOHEX索引?
Oracle RAW(16) GUID列与Hibernate UUID映射的索引及参数传递问题
我创建了两张实验表T_PARENT_TEST和T_CHILD_TEST(各含约555000行数据),DDL如下:
create table T_PARENT_TEST ( ID RAW(16) default SYS_GUID() not null constraint PK_PARENT_TEST_ID primary key, VALUE NUMBER )
create table T_CHILD_TEST ( ID RAW(16) default SYS_GUID() not null constraint PK_CHILD_TEST_ID primary key, PARENT_TEST_ID RAW(16) not null constraint FK_CHILD_TEST_PARENT_TEST_ID references T_PARENT_TEST, JUST_COLUMN RAW(16) ) / create index IDX_CHILD_FOREIGN_K on T_CHILD_TEST (PARENT_TEST_ID) /
当我通过外键列执行如下查询时,Oracle未使用索引而是进行全表扫描。原因是我将字符串字面量作为parent_test_id列的查询参数,Oracle将其视为十六进制字符串,导致无法使用索引:
explain plan for select ce1_0.id, ce1_0.parent_test_id from t_child_test ce1_0 where ce1_0.parent_test_id='6C4473D2486D4697B8829AF19ED21A11';
因此当我为parent_test_id列的RAWTOHEX形式创建索引后,Oracle能够使用索引进行快速查询,因为此时是将字符串字面量与GUID列转换后的十六进制索引值进行比较:
-- 添加索引 create index IDX_CHILD_FOREIGN_K_HEX on T_CHILD_TEST (RAWTOHEX(PARENT_TEST_ID)) / -- 添加上述索引后Oracle使用索引快速查询 explain plan for select ce1_0.id, ce1_0.parent_test_id from t_child_test ce1_0 where ce1_0.parent_test_id='6C4473D2486D4697B8829AF19ED21A11';
以上是在Oracle查询控制台中得到的结果。但我在Spring Boot应用中通过Hibernate操作Oracle,实体类中GUID列以UUID字段存储。我如何确保Hibernate将UUID参数以GUID(HEXTORAW格式)而非字符串字面量传递?是否有相关配置类可确认这一点?
我查看了Hibernate生成的SQL日志,但由于参数以?占位符显示,无法明确具体传递格式:
select ce1_0.id, ce1_0.parent_test_id from t_child_test ce1_0 where ce1_0.parent_test_id=?;
请问在通过Hibernate操作数据库时,我应为GUID列添加直接索引还是RAWTOHEX形式的索引?
内容的提问来源于stack exchange,提问作者Ferhad Mehdizade
相关产品推荐
相关产品推荐

