我们在甲骨文10g快捷版下面的数据库模式: ImageOracle查询性能问题
我们的一个查询看起来是这样的:
select
*
from
torder_item oi_0
where
oi_0.id in
(
select
max(oi_1.id)
from
torder_item oi_1, torder o
where
oi_1.torder_id = o.id
group by
oi_1.tproduct_id
)
or oi_0.id in
(
select
max(oi_2.id)
from
torder_item oi_2, tproduct p
where
oi_2.tproduct_id = p.id
group
by p.group_id
);
的问题是,在查询运行速度很慢。我目前每个表中的行数少于4000行,但查询执行时间在我的计算机上高于6秒。它是一个简化版本。如果我将'或in'更改为'union':
select
*
from
torder_item oi_0
where
oi_0.id in
((
select
max(oi_1.id)
from
torder_item oi_1, torder o
where
oi_1.torder_id = o.id
group by
oi_1.tproduct_id
)
union
(
select
max(oi_2.id)
from
torder_item oi_2, tproduct p
where
oi_2.tproduct_id = p.id
group
by p.group_id
));
它返回相同的结果,但立即执行。不幸的是,我们使用的Hibernate似乎不支持union,所以我不能只是像这样改变查询。这是原始查询的痕迹:
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.04 0.14 0 10 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 8 6.19 6.19 0 31136 0 96
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 10 6.24 6.34 0 31146 0 96
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 5
Rows Row Source Operation
------- ---------------------------------------------------
96 FILTER (cr=31136 pr=0 pw=0 time=14041 us)
1111 TABLE ACCESS FULL TORDER_ITEM (cr=14 pr=0 pw=0 time=3349 us)
96 FILTER (cr=7777 pr=0 pw=0 time=1799577 us)
102096 HASH GROUP BY (cr=7777 pr=0 pw=0 time=1584153 us)
1234321 TABLE ACCESS FULL TORDER_ITEM (cr=7777 pr=0 pw=0 time=35809 us)
0 FILTER (cr=23345 pr=0 pw=0 time=4354068 us)
5075 HASH GROUP BY (cr=23345 pr=0 pw=0 time=4250913 us)
1127665 HASH JOIN (cr=23345 pr=0 pw=0 time=2716544 us)
1127665 TABLE ACCESS FULL TORDER_ITEM (cr=7105 pr=0 pw=0 time=38500 us)
3818430 TABLE ACCESS FULL TPRODUCT (cr=16240 pr=0 pw=0 time=22423 us)
我试着添加索引并对表执行分析,但它没有帮助。
有没有人有一个想法,为什么它如此之慢,以及如何改善它?
Here is the test data if anyone wants to reproduce the problem.
除了@文森特的答案。你可以用'EXISTS'重写它。 Hibernate是否允许这样做? –
是的,我会考虑的。 – mlipi
另一件事:你尝试在'(group_id)'''上添加'tproduct'中的索引吗?在'torder_item'表中,'(torder_ìd,id)'和'(tproduct_ìd,id)'上的索引? –