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的主要内容,如果未能解决你的问题,请参考以下文章