【问题标题】:How to check on which column to create Index to optimize performance如何检查创建索引以优化性能的列
【发布时间】:2018-01-30 18:54:37
【问题描述】:

我有以下查询,这花费了太多时间,我必须优化查询性能。任何表上都没有索引。

但现在为了优化查询性能,我正在考虑创建索引。但不确定我必须创建索引的过滤列。 我想我会分组并计算所有过滤列条件的不同记录数,然后决定我应该在哪一列创建索引,但不确定。

    Select * from ORDER_MART FOL where FOL.PARENT_PROD_SRCID 
IN 
(
select e.PARENT_PROD_SRCID
from SRC_GRP a 
JOIN MAR_GRP b ON a.h_lpgrp_id = b.h_lpgrp_id    
JOIN DATA_GRP e ON e.parent_prod_srcid = b.H_LOCPR_ID
WHERE a.CHILD_LOCPR_ID != 0 
AND dt_id BETWEEN 20170101 AND 20170731 
AND valid_order = 1  
AND a.PROD_TP_CODE like 'C%'    
)
AND FOL.PROD_SRCID = 0 and IS_CAPS = 1;

以下是我的查询执行计划:

【问题讨论】:

  • 哪些表按哪些键分区?解释计划是什么?为什么不能添加索引?
  • 我已经添加了查询执行计划,由于PROD中的权限限制,我无法添加索引
  • 您有 exists 但没有关联子句。这看起来很可疑。
  • 其实之前我使用 IN 代替存在只是为了尝试它是否可以提高性能。我不明白 abt 相关条款?
  • @GordonLinoff 我如何在存在中使用关联子句

标签: sql oracle optimization indexing data-partitioning


【解决方案1】:
Select * 
from ORDER_MART FOL 
     INNER JOIN (
           select distinct e.PARENT_PROD_SRCID
           from SRC_GRP a 
           JOIN MAR_GRP b ON a.h_lpgrp_id = b.h_lpgrp_id    
           JOIN DATA_GRP e ON e.parent_prod_srcid = b.H_LOCPR_ID
           WHERE a.CHILD_LOCPR_ID != 0 -- remove the lines from                               INT_CDW_DV.S_LOCAL_PROD_GRP_MAIN  with child prod srcid equal to 0
           AND dt_id BETWEEN 20170101 AND 20170731 
           AND valid_order = 1 --and is_caps=1 
           AND a.PROD_TP_CODE like 'C%'    
          ) sub ON sub.PARENT_PROD_SRCID=FOL.PARENT_PROD_SRCID 
where FOL.PROD_SRCID = 0 and IS_CAPS = 1;

如果您使用 JOIN 而不是 IN 并添加 distinct 以减少子查询中的行数会怎样。

【讨论】:

  • 是的,它有点快。我的查询在 523.968 秒内运行,而您的查询在 438.493 秒内运行。但它仍然需要一点点。我们不能再优化一下吗?
  • 不幸的是我没有魔法来盲目地优化它:-)。发布数据库表(列/类型)。是否可以对子查询应用更多限制。例如。 FOL.PROD_SRCID = 0 and IS_CAPS = 1 是否也可以应用于子查询以减少行数?
  • 不幸的是,我无法在子查询中添加其他条件。并且查询表中没有使用像 CLOB 这样的特殊列。所以它只是普通的varchar,使用的数字数据类型
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2017-04-16
相关资源
最近更新 更多