2

たとえば、どちらが良いですか:

select * from t1, t2 where t1.country='US' and t2.country=t1.country and t1.id=t2.id

また

select * from t1, t2 where t1.country'US' and t2.country='US' and t1.id=t2.id

データベースの作業が少なくてすむので、結果が速くなります。

注: Sybaseであり、の両方のテーブルにインデックスがありcountry+idます。

4

11 に答える 11

3

ここでは、省略した要素がたくさんあります。どんなデータベースですか?それらのテーブルにはインデックスが付けられていますか?それらはどのように索引付けされますか?それらのテーブルの大きさはどれくらいですか?

(時期尚早の最適化はすべての悪の根源です!)

「t1.id」と「t2.id」にインデックスが付けられている場合、データベースエンジンはこれらのフィールドに基づいてそれらを結合し、残りのWHERE句を使用して行を除外する可能性があります。

それらはインデックス付けできますが、信じられないほど小さなテーブルであり、どちらもメモリのページに収まります。この場合、データベースエンジンは、わざわざインデックスをロードするのではなく、両方のフルスキャンを実行する可能性があります。

試してみるまで、本当にわかりません。

于 2008-09-16T14:19:09.970 に答える
3

あなたの質問に対する世界的な答えはないと思います。それは特定のクエリに依存します。2 つのクエリの実行計画を比較して、大きな違いがあるかどうかを確認する必要があります。

私は個人的に最初の形式を好みます。

select * from t1, t2 where t1.country='US' and t2.country=t1.country and t1.id=t2.id

リテラルを変更したい場合、必要な変更は 1 つだけだからです。

于 2008-09-16T14:16:37.013 に答える
1

これに似た状況があり、これが私が頼った解決策でした:

Select * FROM t1 INNER JOIN t2 ON t1.id = t2.id AND t1.country = t2.country AND t1.country = 'US'

このシナリオでは、クエリがより高速に実行されることに気付きました。WHERE 句が最後に実行されるため、定数に結合することでエンジン時間が節約されると仮定しました。結合してから「米国」でフィルタリングすると、テーブルから他のすべての国を引き出してから、必要な国を除外する必要がありました. この方法では、米国のレコードのみが検索されるため、最終的に取得されるレコードは少なくなります。

于 2008-09-16T17:13:44.640 に答える
1

正しい答えは、おそらく SQL エンジンによって異なります。MS SQL Server の場合、統計オプティマイザーには、より適切な (より最適な) 解決パスを見つけるのに役立つ可能性がある追加の手がかりが与えられるため、最初のアプローチの方が明らかに優れています。

于 2008-09-16T14:15:08.220 に答える
1

ライブラリとデータベースエンジンに依存すると思います。それぞれが異なる方法で SQL を実行し、どれが最適化されるかわかりません。

于 2008-09-16T14:15:18.047 に答える
0

コードに定数を一度だけ含めることに傾倒します。何らかの形でパフォーマンス上の利点があるかもしれませんが、おそらく非常に小さいため、1 つのパラメーターのみのメンテナンス上の利点が勝っています。

于 2008-09-16T14:14:49.840 に答える
0

おそらくターゲット国のパラメーターを置き換えて、クエリをより一般的なものにしたい場合は、変更が1つしか必要ないため、最初の例を使用します。これにより、将来間違うことを心配する必要がなくなります。

于 2008-09-16T14:15:18.750 に答える
0

これは、テーブル、データ、およびメタデータに依存すると思われます。両方の方法で結果を示す例を作成できると思います-ベンチマーク!

于 2008-09-16T14:15:48.390 に答える
0

拡張は適切なオプティマイザーと同等である必要がありますが、使用しているデータベースと、テーブルに定義されているインデックスによって異なります。

EXPLAIN 機能を使用して、どの式が最適かを判断することをお勧めします。

于 2008-09-16T14:16:56.280 に答える
0

より良いSQLは次のようになると思います:

select * from t1, t2 where t1.id=t2.id and t1.country ='US'

t2 の国が同じ ID の t1 と異なる可能性がある場合を除き、「US」との 2 番目の比較を使用する必要はありません。

于 2008-09-16T14:51:15.120 に答える
0

暗黙的な内部結合を使用するのではなく、テーブルを明示的に結合します。

IDフィールドと国フィールドの両方を同じにしたいので、両方がインデックス化されていると述べたので(同じインデックスであると推測しています)、結合に両方の列を含めて、インデックスシークを利用できるようにしますスキャンの代わりに。最後に、where 句を追加します。

SELECT *
  FROM t1
  JOIN t2 ON t1.id = t2.id AND t1.country = t2.country
 WHERE t1.country = 'US'

于 2008-09-16T15:57:06.523 に答える