使用ML表的Oracle视图我希望优化器仅使用一个ML表

时间:2017-10-02 07:03:43

标签: sql oracle database-design multilingual

Oracle 11g。我有文本的ML(多语言)子表,每个父/语言有一个子表。因此,对于父表PRODUCT,我有PRODUCT_EN,PRODUCT_FR等。我希望有一个组合所有ML表的视图。当我查询特定语言时,我希望Oracle优化器(Join Elimination?)足够智能,只能访问所需的ML表。因此,如果我指定lan_id(语言ID)= 5(法语),它应该忽略英语和其他翻译表。 这里有几个视图返回正确的数据,但从计划中我看到一个针对法语的查询仍然访问英语:

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 :(得分:1)

为什么每种语言都有一个单独的表?这意味着每次引入新语言时都必须添加一个表,并且必须更改所有查询。那一定不是。添加的数据应该仅导致添加的行,以便查询继续工作。

所以改成这个语言表就完成了。