我们有一个名为StockDailyQuote
的Oracle数据库表,其中包含数十亿行。有两个索引:TradeDate
(一个Date
字段)和StockTicker
(一个string
字段)。该表实际上是一个分区表,每个TradeDate
都有一个单独的表。所以我们永远不会使用
SELECT * FROM StockDailyQuote
因为得到任何结果是不切实际的。相反,我们总是在WHERE
上使用TradeDate
子句,速度可以接受。
现在我们已经从view
表中编译了一个StockDailyQuote
(加入了一些其他表来获取有用的信息)。因为我们无法在此阶段指定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
我总是尝试使用WHERE
列上的TradeDate
子句查询此视图。我想当oracle看到我的查询SELECT * FROM MyStockQuoteView where TradeDate = '20170726'
时,将索引的where子句添加到sql然后将其发送到引擎就足够聪明,因此查询应该与SELECT * from StockDailyQuote where TradeDate = '20170726'
一样快,假设我的其他加入不需要太多时间。但它的行为并非如此:返回值需要很长时间。我只能假设它对整个视图进行查询,然后使用返回值的where。这使得此查询不实用。那我怎么解决我的问题呢?一种解决方案是制作程序并每天运行它并将一天的数据保存到表中。但是还有其他选择吗?
答案 0 :(得分:1)
很高兴看到查询计划SELECT * FROM MyStockQuoteView where TradeDate = '20170726'
。
Oracle通常了解它需要读取视图内部分区的内容。
您可以尝试显式指定提示,例如:
SELECT /* + full(MyStockQuoteView.StockDailyQuote) */ * FROM MyStockQuoteView where TradeDate = '20170726'