有啥方法可以优化这个查询?甲骨文 11g
Posted
技术标签:
【中文标题】有啥方法可以优化这个查询?甲骨文 11g【英文标题】:Any Way to Optimize this Query? ORACLE 11g有什么方法可以优化这个查询?甲骨文 11g 【发布时间】:2013-01-29 20:15:07 【问题描述】:我在一个过程中有这个查询,它加载数据的速度非常慢。有没有更快的方法让这个查询运行?
SELECT date, price
FROM ( SELECT date,
price,price_src,
ROW_NUMBER() OVER (PARTITION BY date ORDER BY
CASE WHEN price_src = 'mom' THEN
0
WHEN price_src = 'dad' THEN
1
WHEN price_src = 'other' THEN
2
END) AS roworder
FROM pr.sources e
WHERE e.home = inTick
AND price IS NOT NULL
AND e.security = inVal
AND e.securityNum = NVL(inSecurity,'FWD')
AND bc= 'USD'
AND date >= NVL(startDate, date)
AND date <= NVL(endDate, date)
)
WHERE roworder = 1
ORDER BY date;
我想获取以美元为基础货币并在特定日期范围内的特定值 (inval
) 的定价。问题是,这里涉及到优先级。首先尝试从“妈妈”定价来源获取,如果没有,请转到“爸爸”,然后转到“其他”。
这是一个表格示例:
+------------+------+------+-------------+--------- -+-----------+--------+ |日期 |主页 |公元前 |安全号码 |安全 | price_src |价格 | +------------+------+------+-------------+--------- -+-----------+--------+ | 2001-05-04 | 3A |美元 |前卫 | 32 |妈妈 | 548.54 | | 2012-05-04 | 3G |美元 | BWD | 58 |爸爸 | 58.54 | | 2009-05-04 | 3F |美元 |前卫 | 39 |其他 | 588.54 | | 2010-05-04 | 3E |美元 |前卫 | 38 |妈妈 | 38.54 | +------------+------+------+-------------+--------- -+-----------+--------+该表有超过 200 万条记录。它应该获取特定日期的特定价值(可能是货币或财产)的价格。
查询需要 10 秒才能运行(1 次运行)并且在循环中被调用。每次执行的缓慢时间的积累使整个事情变慢。
【问题讨论】:
查询计划是什么?存在哪些索引?表中有多少行?每个谓词的选择性如何?查询运行需要多长时间?您需要它多快运行?这个查询是否被循环调用?如果是这样,是不是单次执行太慢的问题?还是执行几千次累积起来太慢的问题? @Ramie,你需要回答贾斯汀的问题。没有它们,示例表就毫无用处(尽管也是重要的部分)。 “存在的索引我放在桌子上”是什么意思?我在任何地方都没有看到您指出可用的索引。我在任何地方都没有看到您指出查询计划是什么。我没有看到您在哪里指出每个谓词的选择性。如果表有 200 万行,您的查询返回多少行?假设答案远少于 200 万,向我们解释一下哪些过滤器过滤掉了大量的行,哪些过滤掉了相对较少的行。 你还没有@Ramie;您尚未添加查询计划或当前索引是什么。你在做什么也不是很容易理解。我目前不明白 ORDER BY 的原因。你只选择一排吗?似乎您正在一次更新一个大表,此查询的输出正确吗? 您需要向我们展示表和索引定义。 诊断慢查询需要完整的表和索引定义,而不仅仅是描述或解释。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。如果您知道如何填写EXPLAIN
,请将结果也放入问题中。
【参考方案1】:
如果没有更多信息,我建议这样做:
看看您是否可以删除循环并只执行基于集合的操作而不是一次一行 在 securityNum、security、home、price、bc、date、priceSource 上添加索引 删除 inSecurity 上的 nvl 并根据它是否为空创建两个单独的语句【讨论】:
虽然循环是 c# 方面的,但我想尽量避免接触该代码。虽然谢谢你的建议 @Ramie 即使您不删除循环,其他两个建议仍然适用以上是关于有啥方法可以优化这个查询?甲骨文 11g的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以在不使用 SQL 的情况下获取“选择列表”中显示的文本? (甲骨文 APEX 21.1)
第 10 行:错误:ORA-00907 缺少右括号 |甲骨文 11g
恭喜我们台湾同胞,林同学2018.2.26顺利通过甲骨文Oracle11g ocm考试!www.wallslab.net