我們有一個名爲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)...考慮爲你的查詢收集解釋計劃並進行比較。 –