sql - 即使创建了索引,查询也需要更长的时间来执行
问题描述
我有一个表格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
?
解决方案
首先,我将使用日期文字编写查询:
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
数据类型可以具有时间组件——即使用户界面通常只显示日期。
推荐阅读
- python - Python 使用多处理在一个图中绘制和保存
- android-studio - Android Studio freezes when I go to Settings
- r - 嵌套 IF ELSE For 循环中的舍入
- javascript - 如何使球与画布上的三角形电源碰撞?
- python - 在python中执行查询之前设置对游标对象的限制
- azure - VMSS 中的自定义扩展
- ios - ios中AudioUnitRender()函数返回的音频数据最大值是多少
- prolog - 如何在 GProlog 中优化打包问题的解决
- sql - Datagridview在VB.NET中修改列
- php - 在 Guzzle 中获取请求