2017-07-27 176 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'