如何在Oracle中更快地执行Select语句

时间:2019-12-09 12:05:39

标签: sql oracle query-optimization

我写了一个查询来用给定的孝顺值在给定的时间内找到总金额,并且它运行很快:

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;

此查询运行时间长。我如何才能最大化此语句。感谢您的帮助!

1 个答案:

答案 0 :(得分: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编入索引,可能会有所帮助。