2011-06-21 3 views
1

私は3つのテーブルを持っています.2つのテーブルには200,000レコードがあり、別のテーブルには1,800,000レコードがあります。私はOCN and TIMESTAMP(month,year)という2つの制約を使ってこれらの3つのテーブルをマージします。最初の2つのテーブルには月と年の列がMonthx(月、日、年の両方を含みます)として表示されます。毎月と毎年の別々の列として他のテーブル。私はので、私は報復に'%b'を与えた(..そのはまだuは、このクエリが正しいか間違っているか教えてください、私に正確なクエリを提供running.could前に、私はこのクエリに4daysを与えた1,700万レコードからなるマージテーブル

mysql--> insert into trail 
    select * from A,B,C 
    where A.OCN=B.OCN 
    and B.OCN=C.OCN 
    and C.OCN=A.OCN 
    and date_format(A.Monthx,'%b')=date_format(B.Monthx,'%b') 
    and date_format(A.Monthx,'%b')=C.IMonth 
    and date_format(B.Monthx,'%b')=C.month 
    and year(A.Monthx)=year(B.Monthx) 
    and year(B.Monthx)=C.Iyear 
    and year(A.Monthx)=C.Iyear 

、としてクエリを与えましたCテーブルには、月がJAN、MARの形式の列があります)。

+0

暗黙の 'where'を使用しないでください。1989年にそれが所属する場所に埋め込みます。明示的な結合を使用する代わりに、 'select * from inner join b on(a.ocn = b.ocnとdate_format(A.Monthx、'%b ')= date_format(B.Monthx、'%b ').... ' – Johan

答えて

0

クエリが正常かどうかをテストするには、レコードの小さなサブセットをA、B、Cからテンポラリデータベースにインポートしてテストします。

A.OCNをB.OCNに、B.OCNをC.OCNに、C.OCNをA.OCNに、そしてA.OCNをA.OCNに、それぞれ削除することができるため、暗黙のJOINに冗長性があります。 A.OCN = B.OCNおよびB.CON = C.OCNの場合、A.OCN = C.OCNが暗示されます。さらに、私はあなたの日付比較で冗長性を持っていると思います。

1

暗黙的なwhereを使用しないでください。joinはwhereが所属する1989年に埋め込みます。明示的な使用ではなく

select * from a inner join b on (a.ocn = b.ocn and 
date_format(A.Monthx,'%b')=date_format(B.Monthx,'%b') .... 

クエリのこの選択部分を結合し

select * from A 
inner join B on (
    A.OCN=B.OCN 
    and date_format(A.Monthx,'%b')=date_format(B.Monthx,'%b') 
    and year(A.Monthx)=year(B.Monthx) 
) 
inner join C on (
    C.OCN=A.OCN 
    and date_format(A.Monthx,'%b')=C.IMonth 
    and date_format(B.Monthx,'%b')=C.month 
    and year(B.Monthx)=C.Iyear 
    and year(A.Monthx)=C.Iyear 
) 

は、問題の多くを持っています(私は89年の構文に対処することを拒否するので、それを書き換えなければなりませんでした)。

  1. フィールド上の関数を使用すると、そのフィールドにインデックスを使用する機会がなくなります。
  2. あなたは重複したテストをたくさん行っています。 (A = B)(B = C)が、それは論理的に日付フィールドの(A = C)
  3. 翻訳は時間

たくさんを取ることになる場合、私はあなたが使用して(翻訳不要なフィールドを使用するようにテーブルを書き換えることをお勧め関数)が、直接比較することができます。
フィールドはyearmonth : char(6)のようになります。 201006は、より迅速に索引付けして比較することができます。

INSERT INTO TRAIL 
SELECT a.*, b.*, c.* FROM a 
INNER JOIN b ON (
    a.ocn = b.ocn 
    AND a.ym = b.ym 
) 
INNER JOIN c ON (
    a.ocn = c.ocn 
    AND a.ym = c.ym 
); 

あなたはocn(おそらく主要指数)と約実行する必要がありますymクエリにインデックスを置く場合:

は、フィールドには、することができ、あなたのクエリよりも短いためymと呼ばれるテーブルA、B、Cをしている場合100万行1秒(またはそれ以上)。

関連する問題