2012-01-26 3 views
2

テーブル行が存在するかどうかを判断する最も効率的な方法を見つけようとしています。テーブル行が存在するかどうかをテストする効率的な方法

私は心の中で3つのオプションがあります。

  1. SELECT EXISTSを(TABLE1 some_conditionから1を選択)。

  2. SELECT 1 FROM table1 WHERE some_condition LIMIT 0,1;

  3. SELECT COUNT(1)FROM table1 WHERE some_condition;

MySQL用の最初のアプローチは、より効率的であると思わ: Best way to test if a row exists in a MySQL table

それは任意のデータベースのために一般的には本当ですか?

更新日:

私は3番目のオプションを追加しました。

アップデート2:

はのは、データベース製品は、MySQL、OracleとSQLサーバーですと仮定しましょう。

+0

「すべてのデータベース」とは、正確にはどのデータベース製品ですか? –

+0

はい。任意のデータベース製品。 – dcernahoschi

+0

私はそれが答えられるとは思わない - 各製品の実装は大規模に異なります*。 –

答えて

4

私は

SELECT COUNT(1) FROM table 1 WHERE some_condition. 

を行うだろう。しかし、私はそれはあなたが多く(その場合には、私はおそらく異なる戦略を使用すると思います)、それを呼び出さない限り大きな違いはないと思います。

3

存在すると、結果全体ではなく、サブクエリに一致する結果の数が返されるため、より高速です。

+0

を使用する予定のすべての製品でテストする必要があります。これも私の気持ちです。しかし、ただの感覚です。 – dcernahoschi

1

exists関数は一般にSQLで定義されており、MySQLの関数としてだけではありません。 通常、この関数を使用して特定の行が存在するかどうかをテストします。

SELECT EXISTS(SELECT 1 FROM table1 WHERE some_condition); 

は、MySQL上で最速のかもしれませんが、:別の方法が異なる長所と短所を持っている

SELECT COUNT(1) FROM table 1 WHERE some_condition. 
3

:しかし、オラクルでは、私は他のアプローチは、前に提案され、何度も見てきた

SELECT COUNT(1) FROM table 1 WHERE some_condition 

のように@Luis答えはあなたにカウントを与えます。私はあなたがあなたのビジネスロジックを見てお勧めポイントに

より:めったにそれは行が存在する場合は、より頻繁にあなたが

  • いずれか使用これらの行になるでしょうちょうど参照する必要がありません、これだけの選択を行うと、
  • 0-行のケースを処理したり、場合行を挿入したい場合は、変更だけで、あなたの更新を行うと、(にmysql_affected_rowsをチェックし、その場合にはこれらの行、)
  • になるでしょうそれはまだ存在していない、見てみましょうINSERT .. ON DUPLICATE KEYまたはREPLACE INTO
4

あなたは少なくとも一つの行は、いくつかの条件(1または0、trueまたはfalse)で存在している場合、その後、テストとして使用することを意味している場合:

select count(1) from my_table where ... and rownum < 2; 

Oracleは後にカウントを停止することができますそれはヒットを得る。

関連する問題