web-dev-qa-db-ja.com

レコードが存在するかどうかを判定する最速の方法

タイトルが示すように...レコードがテーブルに存在するかどうかを判断するための最小のオーバーヘッドで、最速の方法を見つけようとしています。

サンプルクエリ:

SELECT COUNT(*) FROM products WHERE products.id = ?;

    vs

SELECT COUNT(products.id) FROM products WHERE products.id = ?;

    vs

SELECT products.id FROM products WHERE products.id = ?;

?'TB100'...と交換されたとしましょう。最初のクエリと2番目のクエリはまったく同じ結果を返します(この会話では... 1と言います)。最後のクエリは期待どおりに'TB100'を返すか、またはテーブルにidが存在しない場合は何も返しません。

目的はidがテーブルにあるかどうかを判断することです。そうでなければ、プログラムは次にレコードを挿入し、もしそうであれば、プログラムはそれをスキップするか、またはこの質問の範囲外の他のプログラム論理に基づいてUPDATE照会を実行する。

どちらが速くてオーバーヘッドが少ないですか? (これはプログラムの実行ごとに何万回も繰り返され、1日に何回も実行されます)。

(M $提供のJDBCドライバを介してJavaからM $ SQL Serverに対してこのクエリを実行する)

116
SnakeDoc

SELECT TOP 1 products.id FROM products WHERE products.id = ?;は、最初のレコードを見つけた後で実行を終了するので、すべての提案より優れています。

143
Declan_K

EXISTS(またはNOT EXISTS)は、何かが存在するかどうかをチェックするために特別に設計されているので、それが最良の選択肢であるべきです(そしてそうである)。一致する最初の行で停止するので、TOP節は不要で、実際にはデータを選択しないので、列のサイズにオーバーヘッドはありません。ここでSELECT *を安全に使うことができます - SELECT 1SELECT NULLまたはSELECT AnyColumn... と違いはありません(SELECT 1/0のような無効な表現を使うことさえでき、それで壊れません) .

IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
165
Nenad Zivkovic

何も勝てない -

SELECT TOP 1 1 FROM products WHERE id = 'some value';

あなたはテーブルにデータがあるかどうかを知るために数える必要はありません。そして必要でないときはエイリアスを使わないでください。

20
AgentSQL
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
                         FROM dbo.[YourTable] 
                         WHERE [YourColumn] = [YourValue]) 
            THEN CAST (1 AS BIT) 
            ELSE CAST (0 AS BIT) END

この方法ではブール値が返されます。

10
Kris Coleman

また使用することができます

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END 

ELSE    
     BEGIN
       --<Do something>
     END
8
atik sarker

誰かがまだそれについて言及しているとは思わないでくださいが、データがあなたの下で変化しないと確信しているならば、あなたはそれが読むときブロックされないことを確実にするためにNoLockヒントも適用したくなるでしょう。

SELECT CASE WHEN EXISTS (SELECT 1 
                     FROM dbo.[YourTable] WITH (NOLOCK)
                     WHERE [YourColumn] = [YourValue]) 
        THEN CAST (1 AS BIT) 
        ELSE CAST (0 AS BIT) END
5
Stefan Zvonar
SELECT COUNT(*) FROM products WHERE products.id = ?;

これは、すべてのデータベースで機能するクロスリレーショナルデータベースソリューションです。

3
rogue lad

以下は、レコードがデータベースに存在するかどうかを判断する最も簡単で最速の方法です。良い点は、すべてのリレーショナルDBで機能することです。

SELECT distinct 1 products.id FROM products WHERE products.id = ?;
1
manish Prasad

私は過去にこれを使用しました、そして、何かが存在するかどうか見るために全テーブルスキャンを必要としません。それは超速いです...

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
     --Do work
END             
0
Eric Parsons

MySQLやOracleの経歴からこれに悩まされている人々のために - MySQLは限られた数のレコードを選択するためのLIMIT句をサポートしていますが、OracleはROWNUMを使用します。

0
Werner
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
   when no_data_found then
        dbms_output.put_line(i||' does not exists');

end;
0
kiran