如何在 Oracle 中使 Select 语句更快

Posted

技术标签:

【中文标题】如何在 Oracle 中使 Select 语句更快【英文标题】:How to make Select Statement Faster in Oracle 【发布时间】:2019-12-09 12:05:39 【问题描述】:

我写了一个查询来查找给定时期与一个孝子的钱,它工作得很快:

SELECT FILIAL_CODE,
       sum(sum_eqv)/100 AS summa
FROM   table
WHERE  substr(acc,1,5) = '65434'
and    cast(substr(acc,18,3) as integer) >= 600
and    cast(substr(account_co,18,3) as integer)<=607
AND    o_day >= to_date('01.12.2019', 'DD.MM.YYYY')
and    oday < to_date('08.12.2019', 'DD.MM.YYYY')+ INTERVAL '1' DAY
AND    FILIAL_CODE = '001234'

以上查询工作正常。但是当我想使用它多个子系统时,它变得更加复杂。 以下查询需要修复。

SELECT FILIAL_CODE,
       sum(sum_eqv)/100 AS summa
FROM   table
WHERE  substr(acc,1,5) = '65434'
and    cast(substr(acc,18,3) as integer) >= 600
and    cast(substr(account_co,18,3) as integer)<=607
AND    o_day >= to_date('01.12.2019', 'DD.MM.YYYY')
and    oday < to_date('08.12.2019', 'DD.MM.YYYY')+ INTERVAL '1' DAY
AND    FILIAL_CODE in (select code from city where region = '26')
group by FILIAL_CODE;

此查询运行时间较长。我怎样才能最大化这个陈述。任何帮助表示赞赏!

【问题讨论】:

获取解释计划 实际上查询并没有停止并持续很长时间。我需要手动停止它。我认为 in 语句出现了问题。 第一个查询运行很快,因为它不是以select 开头的,所以你会立即得到unknow command。一般来说,您必须提供execution plan 以及链接中讨论的其他一些想法,才能对性能相关问题做出有意义的回应。对您的情况的猜测是,对一个商店的查询超过索引,另一个查询交换为full table scan 对不起,我修正了查询。 我是您执行次数最多的查询之一,使用 substr 过滤行,您至少可以尝试以第一种范式存储数据并在其上创建多列索引 【参考方案1】:

试试JOIN而不是IN,如:

  SELECT t.filial_code, SUM (sum_eqv) / 100 AS summa
    FROM your_table t JOIN city c ON c.code = t.filial_code
   WHERE     SUBSTR (t.acc, 1, 5) = '65434'
         AND CAST (SUBSTR (t.acc, 18, 3) AS INTEGER) >= 600
         AND CAST (SUBSTR (t.account_co, 18, 3) AS INTEGER) <= 607
         AND t.o_day >= TO_DATE ('01.12.2019', 'DD.MM.YYYY')
         AND t.oday < TO_DATE ('08.12.2019', 'DD.MM.YYYY') + INTERVAL '1' DAY
         AND c.region = '26'
GROUP BY t.filial_code;

如果 city.codetable.filial_code 被编入索引可能会有所帮助。

【讨论】:

它也没有帮助。城市表很小,但无论如何它需要太多时间 我们在盲目猜测。我们所拥有的只是您发布的查询,我们不知道表、索引、是否收集了统计信息……什么都没有。一位cmets说你应该提供解释计划;那么有人可能会指出正确的方向。

以上是关于如何在 Oracle 中使 Select 语句更快的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中,为啥同样的SELECT查询语句,加了CREATE TABLE AS后速度更快了?

第一章:oracle_sql语句之select语句

如何在 oracle 中使可空列不为空

如何在 C++ 中使 csv 文件运行得更快

如何在 Android 中使位图加载更快?

oracle如何在CASE WHEN ELSE语句中使用select语句?