SQL查询优化Oracle

Posted

技术标签:

【中文标题】SQL查询优化Oracle【英文标题】:SQL query optimization Oracle 【发布时间】:2018-07-16 08:11:43 【问题描述】:

我有这个 SQL 查询,它首先从一个相对较短的表中选择一个数字,然后用于另一个选择,这次是从一个非常大的表中,某些信息使用第一个表中的代码。仅一个选择需要 30 多分钟,我需要优化,因为我必须运行 300 个像这样但具有不同 SWNAME 的选择。我会很感激你能给我的任何提示和技巧。谢谢 !

SELECT SWOBJECTID 
FROM   MBR_INST_PRODUCTS 
WHERE  SWPRODRELEASEID IN 
       (SELECT SWPRODRELEASEID 
        FROM   ORO_PPY_OPTIONS 
        WHERE  SWNAME LIKE 'Nov Flexibil Offer:Net Unlimited for 1MON')
AND rownum <2;

【问题讨论】:

为什么是like 而不是SWNAME = 'Nov Flexibil Offer:Net Unlimited for 1MON' SWNAME like 'Nov Flexibil Offer:Net Unlimited for 1MON'SWNAME = 'Nov Flexibil Offer:Net Unlimited for 1MON' 完全一样 Over 300 of these queries in a run - 您能否编辑您的问题以添加有关运行内容的更多详细信息?例如,您可能不需要 300 个查询(也许单个查询就可以完成工作),因此调整每个单独的查询可能不是正确的方法。另外,“非常多的时间”是什么意思?两个表上都有哪些索引?执行计划是什么?请更新您的问题以添加这些额外的详细信息,以帮助我们更好地为您提供帮助。 我编辑了问题并放置了索引和其余部分。 【参考方案1】:

简单的连接怎么样?

SELECT m.swobjectid
  FROM mbr_inst_products m
       JOIN oro_ppy_options o ON o.swprodreleaseid = m.swprodreleaseid
 WHERE     o.swname = 'Nov Flexibil Offer:Net Unlimited for 1MON'
       AND ROWNUM < 2;

确保swprodreleaseid 列已编入索引。

【讨论】:

【参考方案2】:

我会把这个查询写成:

SELECT ip.SWOBJECTID 
FROM  MBR_INST_PRODUCTS ip JOIN
      ORO_PPY_OPTIONS po
      ON po.SWPRODRELEASEID = ip.SWPRODRELEASEID
WHERE po.SWNAME = 'Nov Flexibil Offer:Net Unlimited for 1MON') AND
      rownum = 1;

对于此查询,您需要ORO_PPY_OPTIONS(SWNAME, SWPRODRELEASEID)MBR_INST_PRODUCTS(MBR_INST_PRODUCTS) 上的索引。

【讨论】:

以上是关于SQL查询优化Oracle的主要内容,如果未能解决你的问题,请参考以下文章

如何对Oracle sql 进行性能优化的调整

SQL查询优化Oracle

Oracle查询速度优化问题

Oracle大量数据查询优化

优化 Oracle SQL 查询

oracle查询优化之子查询条件优化