【问题标题】:Optimizing Oracle SQL优化 Oracle SQL
【发布时间】:2016-02-29 13:29:44
【问题描述】:

我需要优化我的查询,处理它需要 36 秒。 请帮帮我。 这是我在 oracle 中的查询

Select  unique api_WEEKLY.country 
From api_WEEKLY INNER 
JOIN USERPROFILE ON api_WEEKLY.REGION  = NVL(USERPROFILE.REGION,api_WEEKLY.REGION) 
AND api_WEEKLY.Category = NVL(USERPROFILE.SECTOR,api_WEEKLY.Category) 
AND api_WEEKLY.MRP_DRP_CONTROLLER  = NVL(USERPROFILE.MRP_DRP_CONTROLLER,api_WEEKLY.MRP_DRP_CONTROLLER) 
AND api_WEEKLY.TDC_VAL = NVL(USERPROFILE.TDC_VAL,api_WEEKLY.TDC_VAL) 
AND api_WEEKLY.PLANT  = NVL(USERPROFILE.PLANT,api_WEEKLY.PLANT) 
AND api_WEEKLY.MATERIAL = NVL(USERPROFILE.MATERIAL,api_WEEKLY.MATERIAL) 
AND api_WEEKLY.SUBSECTOR  = NVL(USERPROFILE.SUBSECTOR,api_WEEKLY.SUBSECTOR) 
AND api_WEEKLY.COUNTRY = NVL(USERPROFILE.COUNTRY,api_WEEKLY.COUNTRY) 
WHERE USERPROFILE.USER_ID = 'sheikh.a' ;

This is my USERPROFILE table

【问题讨论】:

  • 使用 NVL 函数可能会强制 Oracle 对表中的每一行进行表扫描;索引是无用的。要求数据库解释计划。如果您看到 TABLE SCAN,您就有了答案。 WHERE 子句中不应包含函数。
  • 所以我需要使用 api 文件检查每一行用户配置文件数据,但找不到任何解决方案。你给我一些解决方案吗
  • 我刚刚做了 - 请 Oracle 解释计划。您需要重写该查询以更好地利用索引。
  • 好吧。我会检查的。谢谢。如果值为 null 和条件,你能建议我采取任何进一步的步骤吗?
  • 是的,我猜这里的顺序很重要。想想用户 id = 'sheikh.a' 的集合有多小。如果您先执行此操作,然后执行 JOIN,您将要求查询引擎少做很多工作。先过滤,再加入。这样就不必担心 NVL。

标签: sql oracle query-optimization


【解决方案1】:

我会分步进行。开始:

Select a.country 
From api_WEEKLY INNER as a, userprofile as u
where u.user_id = 'sheikh.a'
and a.country = u.country

做一个实验者。

【讨论】:

  • hmm 但是假设如果一行只包含地区名称,那么我必须选择剩余 7 列中的所有数据,然后从所有获取的行中检查唯一国家/地区。
  • 那个用户ID应该很快缩小范围。您所要做的就是根据该用户配置文件行中的值检查其他表格。您可以通过对那些具有有趣位的行进行子选择来减少这些。一个问题:为什么都是 NULL?听起来是个繁琐的设计。
【解决方案2】:

要替换 NVL 函数,您可以尝试:

From api_WEEKLY a
     INNER JOIN
     USERPROFILE u
     ON  ( u.REGION IS NULL OR a.REGION = u.REGION ) 
     AND ( u.SECTOR IS NULL OR a.Category = u.SECTOR )

     ... 

WHERE u.USER_ID = 'sheikh.a'

【讨论】:

  • 那么 WHERE USERPROFILE.USER_ID = 'sheikh.a' ;
  • 照常将其附加到查询中。
  • 我尝试比以前花费更少的时间,但这也是一个巨大的时间
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 2016-01-24
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多