0

私の理解では、それは単純なはずです。colA='X'またはColB='X'を実行します。これらのいずれかが真の場合、結果を返します。それ以外の場合は返しません。

TableA
╔════╦═══╦═══╦═══╦═══╗
║ id ║ A ║ B ║ C ║ D ║
╠════╬═══╬═══╬═══╬═══╣
║ 1  ║ x ║ x ║ x ║ x ║
║ 2  ║ x ║ x ║ x ║ x ║
║ 3  ║ x ║ x ║ x ║ x ║
╚════╩═══╩═══╩═══╩═══╝

TableB
╔════╦═══╗
║ id ║ A ║
╠════╬═══╣
║  1 ║ x ║
║  2 ║ x ║
║  3 ║ x ║
╚════╩═══╝

select T2.ID from tableA T1
JOIN TableB T2
ON T1.A=T2.A OR T1.B=T2.A OR T1.C=T2.A OR T1.D=T2.A /* **takes 6+ min** */

この単純な結合には6分以上かかります。1つのフィールドだけを使用して参加すると、かなり迅速になります。また、ORごとに1つずつ、合計4つの異なるクエリを記述し、その結果をユニオンすると、非常に高速になります。

私の質問は、SQL ORクエリはどのように機能するのですか?現在の行で機能しますか、すべてのORINGを実行して次の行に移動しますか、それとも各ORの2つのテーブルの完全なORを実行しますか。それでも、個別のクエリが十分に高速であるため、時間がかかるはずです。内部オプティマイザーはこれを非常に迅速に最適化できると思います。1つのテーブルの1つの列を2番目のテーブルの4つの列と比較しています。最適化するのは簡単なはずです。なんでこんなに時間がかかるの?このクエリを手動で最適化する方法はありますか?ところで、=を!=またはまたはANDに変更しようとしましたが、同じ時間がかかります。

4

2 に答える 2

0

これまでのところ、このソリューションを使用してきました。実行には 1 分 16 秒かかります。一方、OR クエリを使用した JOIN には 30 分かかり、2 つのクエリの結果は同じではありません。

select T2.ID from tableA T1
JOIN TableB T2
ON T1.A=T2.A 

UNION

select T2.ID from tableA T1
JOIN TableB T2
ON T1.B=T2.A 

UNION

select T2.ID from tableA T1
JOIN TableB T2
ON T1.C=T2.A 

UNION

select T2.ID from tableA T1
JOIN TableB T2
ON T1.D=T2.A 
于 2012-09-25T21:02:08.620 に答える
0

複数の 'OR' 条件が使用されている場合、多くの条件があり、最初に評価された条件が true を返す場合でも、すべてが評価されます。

個別のクエリを作成し、結果をユニオンと組み合わせることで、実行される作業を効果的に削減できます。これは、最初のクエリの結果に含まれる行を他の 3 つのクエリで評価する必要がなく、2 番目のクエリの行を 3 番目と 4 番目のクエリで評価する必要がないなどの理由によるものです。

于 2012-09-20T22:43:01.803 に答える