使用Oracle数据库中索引列的where子句从视图中选择

时间:2017-07-27 10:06:05

标签: database oracle

我们有一个名为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。这使得此查询不实用。那我怎么解决我的问题呢?一种解决方案是制作程序并每天运行它并将一天的数据保存到表中。但是还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

很高兴看到查询计划SELECT * FROM MyStockQuoteView where TradeDate = '20170726'。 Oracle通常了解它需要读取视图内部分区的内容。 您可以尝试显式指定提示,例如:

SELECT /* + full(MyStockQuoteView.StockDailyQuote) */ * FROM MyStockQuoteView where TradeDate = '20170726'