首页 > 解决方案 > 即使创建了索引,查询也需要更长的时间来执行

问题描述

我有一个表格DB_TBL,其中每个月 5 日从工具中插入历史数据。作为其历史数据,插入的行数非常大。例如,我检查了本月的计数及其 1626521。

该表包含 50 列。但我有兴趣只检查 5 列。前端有 gui 正在使用这 5 列,我在其中提供过滤器以每次获取一个月数据,例如上个月作为 01.01.2020 和 31.01.2020 之间的closure_date。

Select Client_key, Portfolia_Name, Closure_date, 
    Currency_Type, Balance from DB_TBL        
    where CLOSURE_DATE between 
    to_date ('01.01.2020','dd.mm.yyyy') and to_date ('31.01.2020','dd.mm.yyyy');

此查询非常慢,运行时间超过 30 分钟。这个问题与我在 gui 中遇到的相同问题非常关键。我已经为Closure_date列提供了索引。但它仍然没有提高性能。

有什么办法可以提高查询性能?也许我可以创造Virtual based index 或创造View

标签: sqloracleindexingquery-performance

解决方案


首先,我将使用日期文字编写查询:

Select Client_key, Portfolia_Name, Closure_date, Currency_Type, Balance
from DB_TBL
where CLOSURE_DATE between date '2020-01-01' and date '2020-01-31'

对于此查询,您需要在db_tbl(closure_date). 如果你已经有了这个索引,那么想必你有这么大的数据量,需要花费很多时间才能返回数据。CLOSURE_DATE您可以通过在索引中包含其余列(在 之后,应该是第一个)来将索引更改为覆盖索引。

也就是说,如果您想要 2020 年 1 月的所有数据,我建议:

where CLOSURE_DATE >= date '2020-01-01' and
      CLOSURE_DATE < date '2020-02-01'

这将返回所有行,即使是那些具有时间组件的行。这在 Oracle 中尤其重要,因为date数据类型可以具有时间组件——即使用户界面通常只显示日期。


推荐阅读