2014-10-06 3 views
0

와 인덱스 힌트를 무시합니다. 당신이 볼 수 있듯이, 내가보기 V_AMV_PLG_ORDER_HISTORY_200_MS에서 조회하고오라클이 내가 실행하고 쿼리입니다 동의어 및 2보기

, 여기의 SQL 쿼리를 볼 수 있습니다

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를 사용하여 데이터를 받고있다 보기 여기의 SQL 쿼리, V_AMV_ORDER_VERSION 및 주문으로 그것을 다스 려라고는 :

T0 로에 테이블라고 ORDER_VERSION에서 데이터를 받아 의미
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; 

이 테이블은 IDX_ORDER_VERSION라는 인덱스가

오라클은 내 힌트를 무시하고 다른 인덱스를 사용합니다. 이제는 oracle이 테이블에서 데이터를 가져 오는 뷰를 쿼리 할 때 원하는 인덱스를 사용하도록 힌트를 사용했습니다. 그러나 이번에는 테이블에서 데이터를 가져 오는 다른 뷰에서 그의 데이터를 가져 오는 뷰를 쿼리하고 있습니다. 또한, 라인의 두 번째보기는 다른 스키마에 있으며 동의어를 사용하고 있습니다. 그래서 아마도 내가 뭔가를 놓치고있는 이유입니다. 가능한 솔루션의 조합을 여러 번 시도했지만 아무 것도 작동하지 않는 것 같습니다. ..

내가 (동의어없이) V_AMV_ORDER_VERSION에서 직접 한 단계 앞으로 이동 및 쿼리 경우 IT가 작동하고 내가 원하는 인덱스 오라클 작업을 할 수 있기 때문에이 쿼리가 완벽하게 작동하는지 말할 것

:

select /*+ index(orders.T0 IDX_ORDER_VERSION_5) */ * from V_AMV_ORDER_VERSION orders 
where EXCHANGE_SK =32 and PRODUCT_SK = 1000169 
+0

오라클 설명서를 말한다 :

V_AMV_PLG_ORDER_HISTORY_200_MS가 SQL 쿼리를 볼 수 있습니다. 뷰가 복잡한 경우 힌트는 기본 테이블에 전파되지 않습니다. –

답변

2

글쎄 나와 우리 회사의 DBA가 잠시 보았는데, 글로벌 힌트 표현의 Oracle 버그처럼 보입니다. 우리는 V_AMV_PLG_ORDER_HISTORY_200_MS 뷰를 만들었습니다. 은 ANSI 이상 r은 가입, 지금은 제대로 작동 :

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;