UNE_XXX這個表訪問了兩次,是效能的主要障礙,需要想辦法,讓訪問次數變為1次。業務場景是,首先取fversion的最大值,以這個最大值為條件,再取原表的資料。
原語句:
SELECT
*
FROM
UNE_XXX
WHERE
frgnCode =
‘50101’
AND
fagenIdCode =
‘497a4557acc4b1a8a5cbd984f19aaab’
AND
fversion
in
(
SELECT
MAX
(fversion)
FROM
UNE_XXX
WHERE
frgnCode =
‘50101’
AND
fagenIdCode =
‘497a4557acc4b1a8a5cbd984f19aaab’
);
分析:訪問了兩次原表,產生15個一致讀
最佳化後:
這種寫法想要效能好,有個前提,就是經過
t。fagenIdCode,t。frgnCode過濾後,資料量要變的比較小才好,因為
max
(fversion)
over
需要涉及到排序,大量資料的排序,效能不會好的,這種寫法只訪問一次UNE_XXX,效率可以提高一倍左右。
select
*
from
(
select
t。*,
max
(fversion)
over
(
partition
by
frgnCode,fagenIdCode)
as
fversion_max
from
UNE_XXX t
WHERE
t。frgnCode =
‘50101’
AND
t。fagenIdCode =
‘497a4557acc4b1a8a5cbd984f19aaab’
)
where
fversion_max=fversion;
分析:訪問了一次原表,產生7個一致讀,減少了一般一致讀