Oracle Query需要很长时间才能执行

时间:2018-06-19 04:30:06

标签: sql oracle oracle11g

我在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, '¿') 

它执行得非常快。但是,我无法删除该行。有没有办法让这个查询快速执行。?

2 个答案:

答案 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上创建索引,所以...希望一切都会运行得更快,而不需要太多努力。