2017-10-02 3 views
2

Oracle 11g. 나는 텍스트를위한 ML (다국어) 자식 테이블, 부모/언어 당 하나의 자식 테이블을 가지고있다. 그래서 부모 테이블 PRODUCT의 경우 PRODUCT_EN, PRODUCT_FR 등이 있습니다. 모든 ML 테이블을 결합한 단일보기를 원합니다. 특정 언어에 대해이 쿼리를 실행하면 오라클 옵티 마이저 (Join Elimination?)가 필요한 ML 테이블에 액세스 할 수있을 정도로 똑똑해지기를 바랍니다. 그래서 lan_id (language id) = 5 (French)를 지정하면 영어와 다른 번역 테이블을 무시해야합니다. 다음은 올바른 데이터를 반환 뷰의 몇하지만 계획에서 나는 아직도 영어에 액세스 프랑스어에 대해 쿼리를 참조하십시오 접미사가 지정으로ML 테이블이있는 Oracle 뷰 하나의 ML 테이블 만 사용하는 옵티마이 저가

CREATE OR REPLACE VIEW myproduct_ml AS 
SELECT p.PROD_ID, STATUS, 
     ml.lan_id, ml.prod_name 
FROM myproduct p JOIN 
(SELECT en.* FROM myproduct_en en WHERE lan_id = 1 
UNION ALL 
SELECT fr.* FROM myproduct_fr fr WHERE lan_id = 5) ml 
ON (p.prod_id = ml.prod_id); 

CREATE OR REPLACE VIEW myproduct_ml AS 
SELECT p.PROD_ID, STATUS, 
     ml.lan_id, ml.prod_name 
FROM myproduct p JOIN myproduct_en ml ON (p.prod_id = ml.prod_id) WHERE lan_id = 1 
UNION ALL 
SELECT p.PROD_ID, STATUS, 
     ml.lan_id, ml.prod_name 
FROM myproduct p JOIN myproduct_fr ml ON (p.prod_id = ml.prod_id) WHERE lan_id = 5; 

select * from myproduct_ml WHERE lan_id = 5 ; 

lan_id에서, ML 테이블에있을 필요하지 않습니다 언어.

답변

1

왜 어쨌든 각 언어에 대해 별도의 테이블이 있습니까? 즉, 새로운 언어를 도입 할 때마다 테이블을 추가해야하며 모든 쿼리를 변경해야합니다. 그건 안된다. 추가 된 데이터는 쿼리가 계속 작동 할 수 있도록 행이 추가되어야합니다.

대신이 언어 표를 작성하면 완료됩니다.

+0

저는 현재 하나의 테이블을 가지고 있습니다. 하지만 개발 속도보다는 빠르다. 테이블은 어쨌든 생성 될 수 있습니다. 하지만 부모 테이블/언어 당 ML 테이블을 가지고 있으므로 가능한 한 데이터를 분할 (Oracle 설비에 대한 라이센스가 없음)하므로 쿼리는 가장 작은 데이터 세트에 액세스합니다. – Duncan

+0

아주 나쁜 생각. 이것은 어떤 것도 가속화하지 않을 것입니다. 보시다시피 갑자기 여러 테이블을 하나의 쿼리가 아닌 여러 테이블로 처리해야하므로 테이블이 자연스럽게 느려집니다. 그리고 옵티마이 저가이를 보면서 하나의 테이블 만 읽는 것이 효과가 없다는 아이디어. 따라서이를 피하기 위해 모든 쿼리를 동적으로 작성해야합니다. 그러지 마. 고유 한 키인'prod_id' +'lan_id'에 적절한 인덱스가 있는지 확인하십시오. (나는'(prod_id, lan_id)'와 하나 (lan_id, prod_id)'에 둘을 쓰고 어떤 것이 사용되는지를 보게 될 것이다.) 충분히 빨라야한다. –

+0

Thorsten에게 감사드립니다. 최적화 도구에 충분한 단서를 제공하는 방법이 있었으면합니다. 아마 하나의 테이블로해야 할 것입니다. 그러나 한 가지 경우에는 언어 당 50 만 개가 넘는 행이 있으며 40 개 언어 (2 천만 행)를 지원하려고합니다. ML 칼럼에 텍스트 인덱스가 있습니다. 저는 중국어, 일본어, 한국어뿐만 아니라 유럽을 지원합니다. 그래서 다른 lexars에 대해 생각해 봅니다.하지만 MULTI_LEXAR을 사용할 수는 있습니다. 나는 하나의 테이블을 가질 수 있지만, 언어 당 컬럼을 가질 수 있습니다. LAN_ID = 5 대신 _FR을 추가해야하는 응용 프로그램에 더 많은 영향을줍니다. – Duncan