我们有一个名为StockDailyQuote
的Oracle数据库表,其中包含数十亿行。有两个索引:TradeDate
(一个Date
字段)和StockTicker
(一个string
字段)。该表实际上是一个分区表,每个TradeDate
上都有一个单独的表。所以我们从不询问它使用在Oracle数据库中使用where子句对索引列进行选择
SELECT * FROM StockDailyQuote
,因为它是不切实际的,以获得任何结果。相反,我们总是在TradeDate
上使用WHERE
条款,速度是可以接受的。
现在我们编制了一个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'
一样快,假设我的其他联接不需要太多时间。但它并不像这样:返回值需要很长时间。我只能假定它对整个视图进行查询,然后使用返回值的位置。这使得这个查询不切实际使用。那么我该如何解决我的问题?一种解决方案是制作程序并每天运行并将一天的数据保存到表中。但是还有其他一些选择吗?
然而,[它看起来像指数应该发挥作用的使用视图时(https://stackoverflow.com/questions/1923802/how- do-table-indexes-come-play-when-using-a-view)...考虑为你的查询收集解释计划并进行比较。 –