sql - 优化一条Sql查询: filter an unindexed field

标签 sql oracle rdbms

我有一个表Orders,用于存储订单,其中包含以下字段:

Id          
Date        
Amount      
Cost
Currency

我尝试了以下查询:

SELECT SUM(Amount)-SUM(NFC1)
FROM Orders
WHERE Date BETWEEN '20121101' AND '20121231'
      AND Currency = 'EUR'

现在,根据 Oracle SQL Developer 的说法,导致查询变慢的是 Currency = 'EUR' 过滤器,因为其他操作的成本要低得多。

我检查了索引,在 Id 上有一个索引,在 Date 上有另一个索引。 在我看来,通过查询分析,DBMS 首先找到与所需日期匹配的记录,然后扫描整个表以查找具有 Currency='EUR' 的记录。 货币是一个VARCHAR

有什么办法可以优化查询吗?我的意思是,有没有办法避免全面扫描?

从一般角度来看,是否可以在记录已按日期过滤后阻止 DBMS 执行全表扫描,而是在这些记录中查找与Currency 匹配的记录谁已按日期过滤?

非常感谢

最佳答案

It seems to me, by the query analysis, that the DBMS first finds the records matching the required dates and then scans the whole table to find the records having Currency='EUR'. Currency is a VARCHAR.

它不会扫描整个表格。

相反,它从索引记录中获取行指针(rowidPRIMARY KEY 值(如果表是 IOT))并在其中查找货币嵌套循环中的表行。由于您使用的索引不包含Currency,因此需要以某种方式查找它来进行过滤。

要解决此问题,您需要在(货币、日期)上创建复合索引

如果无法创建另一个索引,您可以尝试创建一个物化 View 并在其上创建一个索引。

关于sql - 优化一条Sql查询: filter an unindexed field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14299449/

相关文章:

java - 如果 ORA-02049 包含在分布式事务中,对 "just change your program"的良好响应是什么?

oracle - 来自 dbms_metadata.get_ddl 的自定义表 DDL

mysql - 显示学生人数最多的院系名称

database - 在ACID中,C是DBMS实现的责任吗?

c# - 在 C# 中使用 sql 中的日期和时间获取数据

mysql - 将所有这些命令包含在一个大的 MySQL 语句中?

database - 无法登录 Oracle Enterprise Manager Express

java - 在循环中执行 SQL 查询

sql - 数据库多选查询,无法检索到想要的数据

linux - DBD-Oracle-1.76 安装问题