【问题标题】:Select from a view using where clause on indexed column in Oracle Database使用 Oracle 数据库中索引列上的 where 子句从视图中选择
【发布时间】:2017-07-27 19:49:56
【问题描述】:

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

来查询它
SELECT * FROM StockDailyQuote

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

现在我们已经从StockDailyQuote 表中编译了一个view(加入了其他一些表以获得有用的信息)。因为在这个阶段我们不能指定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

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

【问题讨论】:

标签: database oracle


【解决方案1】:

很高兴看到查询计划SELECT * FROM MyStockQuoteView where TradeDate = '20170726'。 Oracle 通常理解它需要读取到视图内的分区的内容。 您可以尝试显式指定提示,例如:

SELECT /* + full(MyStockQuoteView.StockDailyQuote) */ * FROM MyStockQuoteView where TradeDate = '20170726'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2015-04-19
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多