我在Oracle查询下面有这个。执行需要很长时间。
Select Distinct Z.WH_Source,
substr(Z.L_Y_Month,0,4) || '-' || substr(Z.L_Y_Month,5) Ld_Yr_Mth,
m.model_Name, p.SR, p.PLATE_NO, pp.value, z.CNT_number, z.platform_SR_number,
z.account_name, z.owner_name, z.operator_name, z.jetcare_expiry_date, z.wave,
z.address, z.country, substr(z.CNT_status, 10) ctstatus,
ALLOEM.GET_CNT_TYRE_SR@TNS_GG(z.CNT_number, Z.WH_Source, Z.L_Y_Month,
z.platform_SR_number, '¿')
product_SR_number
From MST.ROLE p
inner join MST.model m on m.model_id = p.model_id
left join MST.ROLEproperty pp on pp.ROLE_id = p.ROLE_id
and pp.property_lookup = 'SSG-WH-ENROLL'
left join alloem.Z_SSG_HM_LOG@TNS_GG z on z.camp_ac_ROLE_id = p.ROLE_id
Where
1 = 1 or z.L_Y_Month = 1
Order By 1, 2 desc, 3,4
如果我删除此行,
ALLOEM.GET_CNT_TYRE_SR@TNS_GG(z.CNT_number, Z.WH_Source, Z.L_Y_Month,
z.platform_SR_number, '¿')
它执行得非常快。但是,我无法删除该行。有没有办法让这个查询快速执行。?
答案 0 :(得分:0)
如果我删除此行,
ALLOEM.GET_CNT_TYRE_SR@TNS_GG(z.CNT_number, Z.WH_Source, Z.L_Y_Month, z.platform_SR_number, '¿')
它执行得非常快。但是,我无法删除该行。有没有办法让这个查询快速执行。?
查询调优是一件复杂的事情。没有表结构,索引,执行计划或统计数据,很难提供一个通用的答案。
无论如何,我会尝试scalar subquery caching(如适用):
ALLOEM.GET_CNT_TYRE_SR@TNS_GG(z.CNT_number, Z.WH_Source, Z.L_Y_Month,
z.platform_SR_number, '¿')
=>
(SELECT ALLOEM.GET_CNT_TYRE_SR@TNS_GG(z.CNT_number, Z.WH_Source,Z.L_Y_Month,
z.platform_SR_number, '¿') FROM dual)
同样使用DISTINCT
可能表示标准化存在一些问题。如果可能,请解决潜在问题并将其删除。
最后你应该避免使用位置ORDER BY
(它是普通的反模式)。
答案 1 :(得分:0)
此:
alloem.Z_SSG_HM_LOG@TNS_GG
建议您通过数据库链接获取数据。 通常比在本地获取数据慢。所以,如果你能负担得起的话。如果你的查询操纵"静态"数据(即频繁地Z_SSG_HM_LOG
表中没有任何变化)和 - 即使它确实 - 数据量不是很高,考虑在模式中创建物化视图(MV)您在运行该查询时已连接到该帐户。你甚至可以在MV上创建索引,所以...希望一切都会运行得更快,而不需要太多努力。