2

2つのテーブルからデータを選択しようとしています。DBAには、最初のテーブルが5分間レコードをスプールし、次にプロシージャがデータを2番目のテーブルに移動してスプールをクリーンアップするように構成されたテーブルがあります。これは絶えず繰り返されます。問題は、両方のテーブルからデータを選択する必要があることです。

これまでの私の質問は次のとおりです。

select * from table1,table2 
where ( (table1.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE))  
OR 
(table2.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE)) )

どちらかの条件を個別に検索するとすぐに機能しますが、上記のようにまとめると、システムはそこにとどまり、応答しなくなります。私は自分が間違っていることに興味があります。代わりに組合でこれを行うべきですか?

4

1 に答える 1

4

where 句を結合せずに 2 つのテーブルを結合しているため、M*N レコード (デカルト積) を取得しています。

つまり、最初の条件に一致するレコードが table1 に 100 件あり、table2 に 10,000 件のレコードがある場合、10,100 件ではなく 1,000,000 件のレコードが取得されます。それに加えて、取得するすべてのレコードは、table1 の行のすべてのフィールド + table2 の行のすべてのフィールドが含まれているため、サイズが 2 倍になります。例 #s)、取得したデータ サイズも 200 倍に増やしています。

あなたが望むのは、結合の代わりに UNION を使用することです。

select * from table1
where table1.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE))  
UNION
select * from table2
where table2.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE))  
于 2012-08-30T16:13:04.190 に答える