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