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'