【发布时间】:2017-07-27 19:49:56
【问题描述】:
我们有一个名为 StockDailyQuote 的 Oracle 数据库表,其中包含数十亿行。有两个索引:TradeDate(Date 字段)和StockTicker(string 字段)。这个表实际上是一个分区表,每个TradeDate 都有一个单独的表。所以我们从不使用
SELECT * FROM StockDailyQuote
因为得到任何结果都是不切实际的。相反,我们总是在TradeDate 上使用WHERE 子句,并且速度可以接受。
现在我们已经从StockDailyQuote 表中编译了一个view(加入了其他一些表以获得有用的信息)。因为在这个阶段我们不能指定TradeDate所以我们的视图看起来像这样(这是一个简化版本):
create or replace view MyStockQuoteView as
SELECT t1.StockTicker, t2.CompanyName, t1.TradeDate, t1.ClosePrice
FROM StockDailyQuote t1 join CompanyInstruction t2 on t1.StockTicker =
t2.StockTicker
我总是尝试在TradeDate 列上使用WHERE 子句来查询此视图。我想当 oracle 看到我的查询SELECT * FROM MyStockQuoteView where TradeDate = '20170726' 时,将索引 where 子句添加到 sql 中然后将其发送到引擎就足够聪明了,因此查询应该与SELECT * from StockDailyQuote where TradeDate = '20170726' 一样快,假设我的其他联接执行不需要太多时间。但它的行为并非如此:返回值需要很长时间。我只能假设它查询整个视图,然后在返回值上使用 where。这使得该查询无法使用。那么我该如何解决我的问题呢?一种解决方案是创建一个程序并每天运行它并将一天的数据保存到一个表中。但是还有其他选择吗?
【问题讨论】:
-
但是,it looks like indexes should come into play when using a view... 考虑为您的查询收集解释计划并进行比较。