如何在 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.code
和 table.filial_code
被编入索引可能会有所帮助。
【讨论】:
它也没有帮助。城市表很小,但无论如何它需要太多时间 我们在盲目猜测。我们所拥有的只是您发布的查询,我们不知道表、索引、是否收集了统计信息……什么都没有。一位cmets说你应该提供解释计划;那么有人可能会指出正确的方向。以上是关于如何在 Oracle 中使 Select 语句更快的主要内容,如果未能解决你的问题,请参考以下文章