首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle忽略带有同义词和2视图的索引提示

Oracle忽略带有同义词和2视图的索引提示
EN

Stack Overflow用户
提问于 2014-10-06 14:50:20
回答 1查看 1.3K关注 0票数 0

这是我正在运行的查询:

代码语言:javascript
复制
select /*+ index(V_AMV_PLG_ORDER_HISTORY_200_MS.orders.T0 IDX_ORDER_VERSION_3) */ * 
from V_AMV_PLG_ORDER_HISTORY_200_MS 
where EXCHANGE_SK = 32 and PRODUCT_SK = 1000169

它所使用的索引与我所指定的索引不同。

正如您所看到的,我正在从视图V_AMV_PLG_ORDER_HISTORY_200_MS查询,您可以在这里看到它的sql查询:

代码语言:javascript
复制
V_AMV_PLG_ORDER_HISTORY_200_MS view SQL Query:


SELECT AMV_PERF_PROFILES_FRONTEND.AMV_PLG_GET_SEGMENT(200, orders.ORDER_GLOBAL_DATE_TIME) AS ORDER_DATE_TIME,
SUM(orders.BASE_VOLUME) AS VOLUME,
SUM(orders.BASE_CURR_LIMIT_PRICE*orders.BASE_VOLUME)/SUM(orders.BASE_VOLUME) AS PRICE,
orders.PRODUCT_SK AS PRODUCT_SK,
orders.EXCHANGE_SK AS EXCHANGE_SK,
orders.DIRECTION_CD AS DIRECTION_CD,
orders.AGG_UNIT_CD  AS AGG_UNIT_CD,
orders.TRADER_KEY   AS EXECUTING_REPRESENTATIVE_KEY,
orders.ACCOUNT_KEY  AS ACCOUNT_KEY,
a.BUSINESS_UNIT_CD AS BUSINESS_UNIT_CD
FROM AMV_PERF_PROFILES_FRONTEND.S_AMV_ORDER_VERSION_NEW orders
INNER JOIN AMV_PERF_PROFILES_FRONTEND.S_AMV_ACCOUNT a
ON a.ACCOUNT_KEY  = orders.ACCOUNT_KEY
WHERE BASE_VOLUME > 0
GROUP BY AMV_PERF_PROFILES_FRONTEND.AMV_PLG_GET_SEGMENT(200, orders.ORDER_GLOBAL_DATE_TIME),
  orders.PRODUCT_SK,
  orders.EXCHANGE_SK,
  orders.ACCOUNT_KEY,
  a.BUSINESS_UNIT_CD,
  orders.AGG_UNIT_CD,
  orders.TRADER_KEY,
  orders.DIRECTION_CD;

他使用同义词S_AMV_ORDER_VERSION_NEW获取数据,该同义词指向另一个方案,指向一个名为V_AMV_ORDER_VERSION的视图,并将其引用为orders,其sql查询如下:

代码语言:javascript
复制
V_AMV_ORDER_VERSION view Sql query:


  SELECT T1.ENTITY_KEY ,
    T2.AGG_UNIT_CD ,
    T0.BASE_CURR_LIMIT_PRICE ,
    T7.DIRECTION_CD ,
    T0.EXCHANGE_SK,
    T0.ORDER_LOCAL_DATE_TIME ,
    T0.PRODUCT_SK,
    T18.ENTITY_KEY ,
    T19.ENTITY_KEY ,
    T0.NOTIONAL_VALUE2 ,
    T0.NOTIONAL_VALUE ,
    T0.ORDER_GLOBAL_DATE_TIME ,
    T0.BASE_VOLUME ,
    T31.TRANSACTION_STATUS_CD ,
    T0.ORDER_VERSION_KEY
  FROM ETS_UDM_CDS_NEW.ORDER_VERSION T0
  LEFT OUTER JOIN ETS_UDM_CDS_NEW.ENTITY T1
  ON T0.ACCOUNT_SK = T1.ENTITY_SK
  LEFT OUTER JOIN ETS_UDM_CDS_NEW.AGG_UNIT T2
  ON T0.AGG_UNIT_SK = T2.ENTITY_SK
  LEFT OUTER JOIN ETS_UDM_CDS_NEW.DIRECTION T7
  ON T0.DIRECTION_SK = T7.ENTITY_SK
  LEFT OUTER JOIN ETS_UDM_CDS_NEW.ENTITY T18
  ON T0.LOCAL_TIME_ZONE_SK = T18.ENTITY_SK
  LEFT OUTER JOIN ETS_UDM_CDS_NEW.ENTITY T19
  ON T0.TRADER_SK = T19.ENTITY_SK
  LEFT OUTER JOIN ETS_UDM_CDS_NEW.TRANSACTION_STATUS T31
  ON T0.TRANSACTION_STATUS_SK = T31.ENTITY_SK;

它从一个名为ORDER_VERSION的表中获取数据,并将其称为T0。这个表有一个名为IDX_ORDER_VERSION的索引。

问题是,oracle忽略了我的提示,并且使用了不同的索引,现在,我已经成功地使用了一个提示,使oracle在查询从表中获取数据的视图时,使用了我想要的索引,但这一次,我在查询一个视图,该视图从另一个视图中获取数据,该视图从表中获取数据。而且,这一行的第二个视图是在另一个方案上,我使用的是同义词,所以也许这就是为什么我错过了一些东西,因为我尝试了许多可能的解决方案组合,我在google上找到了,但似乎没有任何效果……

我要说的是,如果我向前走一步,直接从V_AMV_ORDER_VERSION (没有同义词)查询,IT就能工作,而且我可以使用任何我想要的索引来工作,所以这个查询非常完美:

代码语言:javascript
复制
select /*+ index(orders.T0 IDX_ORDER_VERSION_5) */ * from V_AMV_ORDER_VERSION orders
where EXCHANGE_SK =32 and PRODUCT_SK = 1000169
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-07 11:52:36

好吧,我和我们公司的DBA看了一段时间,似乎是全局提示显示中的Oracle错误,我们使用常规连接而不是ANSI连接创建了视图V_AMV_PLG_ORDER_HISTORY_200_MS,现在它正常工作了:

V_AMV_PLG_ORDER_HISTORY_200_MS视图SQL查询:

代码语言:javascript
复制
SELECT AMV_PERF_PROFILES_FRONTEND.AMV_PLG_GET_SEGMENT(200, orders.ORDER_GLOBAL_DATE_TIME) AS ORDER_DATE_TIME,
SUM(orders.BASE_VOLUME) AS VOLUME,
SUM(orders.BASE_CURR_LIMIT_PRICE*orders.BASE_VOLUME)/SUM(orders.BASE_VOLUME) AS PRICE,
orders.PRODUCT_SK AS PRODUCT_SK,
orders.EXCHANGE_SK AS EXCHANGE_SK,
orders.DIRECTION_CD AS DIRECTION_CD,
orders.AGG_UNIT_CD  AS AGG_UNIT_CD,
orders.TRADER_KEY   AS EXECUTING_REPRESENTATIVE_KEY,
orders.ACCOUNT_KEY  AS ACCOUNT_KEY,
a.BUSINESS_UNIT_CD AS BUSINESS_UNIT_CD

FROM AMV_PERF_PROFILES_FRONTEND.S_AMV_ORDER_VERSION_NEW orders,
AMV_PERF_PROFILES_FRONTEND.S_AMV_ACCOUNT a
WHERE BASE_VOLUME > 0 AND a.ACCOUNT_KEY = orders.ACCOUNT_KEY

GROUP BY AMV_PERF_PROFILES_FRONTEND.AMV_PLG_GET_SEGMENT(200, orders.ORDER_GLOBAL_DATE_TIME),
orders.PRODUCT_SK,
orders.EXCHANGE_SK,
orders.ACCOUNT_KEY,
a.BUSINESS_UNIT_CD,
orders.AGG_UNIT_CD,
orders.TRADER_KEY,
orders.DIRECTION_CD;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26218867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档