有啥方法可以优化这个查询?甲骨文 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)

您可以刷新触发器内的物化视图吗?甲骨文 11g

第 10 行:错误:ORA-00907 缺少右括号 |甲骨文 11g

oracle11g中如何比较两个日期

恭喜我们台湾同胞,林同学2018.2.26顺利通过甲骨文Oracle11g ocm考试!www.wallslab.net

oracle 11g的下载网址都有哪些??