2017-07-27 175 views
1

我们有一个名为StockDailyQuote的Oracle数据库表,其中包含数十亿行。有两个索引:TradeDate(一个Date字段)和StockTicker(一个string字段)。该表实际上是一个分区表,每个TradeDate上都有一个单独的表。所以我们从不询问它使用在Oracle数据库中使用where子句对索引列进行选择

SELECT * FROM StockDailyQuote 

,因为它是不切实际的,以获得任何结果。相反,我们总是在TradeDate上使用WHERE条款,速度是可以接受的。

现在我们编制了一个viewStockDailyQuote表(加入一些其他表来获取有用的信息)。因为我们不能在这个阶段指定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'一样快,假设我的其他联接不需要太多时间。但它并不像这样:返回值需要很长时间。我只能假定它对整个视图进行查询,然后使用返回值的位置。这使得这个查询不切实际使用。那么我该如何解决我的问题?一种解决方案是制作程序并每天运行并将一天的数据保存到表中。但是还有其他一些选择吗?

+0

然而,[它看起来像指数应该发挥作用的使用视图时(https://stackoverflow.com/questions/1923802/how- do-table-indexes-come-play-when-using-a-view)...考虑为你的查询收集解释计划并进行比较。 –

回答

1

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

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