2

我有一个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'. Currency是一个VARCHAR

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

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

非常感谢

4

3 回答 3

2

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

它不会扫描整个表。

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

要解决此问题,您需要在(Currency, Date)

如果创建另一个索引不是一个选项,您可以尝试创建一个MATERIALIZED VIEW并在其上创建一个索引。

于 2013-01-13T01:32:16.027 回答
0

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

全面扫描可能只是可用的最优化计划。通过完全扫描表,从表的大部分过滤数据通常会更快。数据库可以使用快速、顺序的磁盘读取。

于 2013-01-13T09:07:52.683 回答
0

如果您经常使用这两个字段进行过滤,则在字段上构建索引Currency或复合索引DateCurrency

于 2013-01-13T00:36:32.933 回答