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

Database 使用Oracle数据库中索引列上的where子句从视图中选择,database,oracle,Database,Oracle,我们有一个名为StockDailyQuote的Oracle数据库表,其中包含数十亿行。有两个索引:TradeDate(一个Date字段)和StockTicker(一个string字段)。该表实际上是一个分区表,每个TradeDate上都有一个单独的表。所以我们从不使用 SELECT * FROM StockDailyQuote 因为要得到任何结果都是不切实际的。相反,我们总是在TradeDate上使用WHERE子句,并且速度是可以接受的 现在我们从StockDailyQuote表中编译了一个视

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

SELECT * FROM StockDailyQuote
因为要得到任何结果都是不切实际的。相反,我们总是在
TradeDate
上使用
WHERE
子句,并且速度是可以接受的

现在我们从
StockDailyQuote
表中编译了一个
视图
(加入一些其他表以获得有用的信息)。因为我们在此阶段无法指定
TradeDate
,所以我们的视图如下所示(这是一个简化版本):


我总是在
TradeDate
列上使用
WHERE
子句来查询这个视图。我想,当oracle看到我的查询
SELECT*来自MyStockQuoteView where TradeDate='20170726'
,它将足够聪明,将索引where子句添加到sql中,然后将其发送到引擎,这样查询应该与
SELECT*FROM StockDailyQuote where TradeDate='20170726'
一样快,假设我的其他连接不会花费太多时间。但它的行为并非如此:返回值需要很长时间。我只能假设它查询整个视图,然后使用返回值上的where。这使得此查询无法使用。那么我该如何解决我的问题呢?一种解决方案是创建一个过程并每天运行,然后将一天的数据保存到表中。但是还有其他选择吗?

如果能看到查询计划
SELECT*FROM MyStockQuoteView,其中TradeDate='20170726'
,那就太好了。 Oracle通常理解它需要向视图中的分区读取什么。 您可以尝试显式指定提示,例如:

SELECT /* + full(MyStockQuoteView.StockDailyQuote) */ * FROM MyStockQuoteView where TradeDate = '20170726'
然而。。。考虑为你的查询收集解释计划并进行比较。
SELECT /* + full(MyStockQuoteView.StockDailyQuote) */ * FROM MyStockQuoteView where TradeDate = '20170726'