Google은 제품 이름을 다른 언어로 표시해야하지만 일부 언어 만 영어와 다른 언어로 이름을 지정합니다. 특정 언어로 제품을 쿼리 할 때 특정 언어 이름이없는 경우 기본 이름을 영어로 표시하려고합니다.데이터가 중복되거나 성능이 향상 되었습니까?
더 나은 쿼리 성능을 얻으려면 특정 언어의 이름이 누락되면 언어 별 제품 이름 테이블 (languageid + productid가 기본 키)에 기본 영어 이름을 입력해야합니다. 이 언어에 의존하는 테이블에 중복 된 이름이 많이 생겼습니다. 기본 영어 이름이 변경되면이 테이블을 업데이트하기가 다소 어려워졌습니다.
현재이 테이블에는 약 30 개 언어와 8,000,000 개 이상의 행이있는 약 300,000 개의 제품이 있으며, 적어도 90 % 이상의 데이터가 중복되어 있으며 기본 영어 이름으로 채 웁니다. 그러나 쿼리에서 왼쪽 조인과 isnull 체크를 사용하면 쿼리 성능이 훨씬 느려집니다.
누가 복제 데이터를 채우고 더 나은 쿼리 성능을 피할 수있는 더 나은 데이터베이스 디자인을 추천 할 수 있습니까?
내가 중복 데이터를 방지하기 위해 쿼리 아래 시도하지만, 성능이 최악의 비트를했다
Table1 (about 300,000 rows)
ProductId | Country | Currency | others fields
------------|----------------|-----------|---------------
Product A | US | USD | ...
Product B | GB | GBP | ...
Table2 (about 9,000,000 rows)
LanguageId | ProductId | Product Name
------------|----------------|--------------------------
English | Product A | Product A Name
English | Product B | Product B Name
German | Product A | Produkt A Name
German | Product B | Product B Name (it's filled by English name)
아래와 같이 현재의 테이블 스키마.
SELECT
A.ProductId,
A.Country,
ISNULL(B1.ProductName, B2.ProductName) as ProductName
FROM
Table1 A (NOLOCK)
LEFT JOIN Table2 B1 (NOLOCK) on A.ProductId = B1.ProductId
LEFT JOIN Table2 B2 (NOLOCK) on A.ProductId = B2.ProductId and B2.LanguageId = 'ENGLISH'
WHERE
B1.LanguageId = 'German'
ORDER BY
ISNULL(B1.ProductName, B2.ProductName)
게시글에 현재 테이블 스키마를 넣을 수 있습니까? –