我有一个表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.
它不会扫描整个表格。
相反,它从索引记录中获取行指针(rowid
或 PRIMARY KEY
值(如果表是 IOT))并在其中查找货币嵌套循环中的表行。由于您使用的索引不包含Currency
,因此需要以某种方式查找它来进行过滤。
要解决此问题,您需要在(货币、日期)上创建复合索引
如果无法创建另一个索引,您可以尝试创建一个物化 View
并在其上创建一个索引。
关于sql - 优化一条Sql查询: filter an unindexed field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14299449/