2017-06-26 8 views
1

私はPostgresをバッキングデータベースとして使用するアプリケーションで作業しています。私は入力コントロールを複数選択してクエリの入力値を入力することで、DB上でSELECTクエリを実行するコンポーネントを作成しています。従来、この入力コントロールは従来の選択コントロールであったため、一度に1つのオプションしか指定できませんでした。複数選択が実装されているPotsgresパフォーマンス:WHERE =単一の値のWHERE IN(...)

SELECT * FROM items WHERE code = 'value1'; 

した後、SQLクエリは次のようなものになります:

SELECT * FROM items WHERE code IN ('value1', 'value2', 'value3'); 

をしかし、私は疑問を持っていることは、SQLクエリは、このようになります意味しましたユーザーが複数選択で単一の値のみを指定した場合。それは一つの値だけが括弧内に指定されていることを意味します:

SELECT * FROM items WHERE code IN ('value1'); 

私はこのクエリは意味的にWHERE ... = ...を使用したクエリと同じであることを認識しています。私の質問は、両者の間に大きなパフォーマンス差があるかどうかです。私は、1つの値だけが指定されている場合、とWHERE ... IN (...)文を置き換えるかどうかを選択するアプリケーションロジックを追加することを検討しましたか?この最適化は必要ですか?実際、両方のケースで性能が実際に同じであれば、WHERE ... IN (...)がより柔軟な場合にWHERE ... = ...を使用するとどうして気になるのですか?マイクロ最適化について心配していますか?

ありがとうございます。

+0

:まだ意味的に等価であるが、あなたが試みることができるとまったく同じ計画に書き換えされていないクエリの別の例を参照するには

/docs/current/static/using-explain.html) –

+0

重複は意図的ではありませんでした。私は尋ねる前にSOFでこの問題を調べようとしましたが、見つけられませんでした。 – ecbrodie

+0

上記の質問はPostgresに関するものであり、既存のものがMySQLに特有のものであると指摘されているので、実際は重複していません。クエリの書き換えルールは常にすべてのRDBMSに適用されると想定することはできません。 –

答えて

2

TLDR:違いはありませんが、パフォーマンスは常に同じであるため、INはあなたのユースケースにとっては明らかな勝者です。

これを確認する簡単なテストを行うことができる:計画が同じであることを

test=# CREATE table test_in (id serial primary key); 
CREATE TABLE 
test=# explain select * from test_in where id = '1'; 
            QUERY PLAN 
--------------------------------------------------------------------------------- 
Index Only Scan using test_in_pkey on test_in (cost=0.15..2.17 rows=1 width=4) 
    Index Cond: (id = 1) 
(2 rows) 

test=# explain select * from test_in where id in ('1'); 
            QUERY PLAN 
--------------------------------------------------------------------------------- 
Index Only Scan using test_in_pkey on test_in (cost=0.15..2.17 rows=1 width=4) 
    Index Cond: (id = 1) 
(2 rows) 

お知らせするので、インデックス条件があり、これは同じコストは単なる偶然ではないことを保証します。クエリの再書込み段階では、PostgreSQLはいくつかの簡単な同値性のケースを検出し、それらを標準形式で書き換えます。 [実行計画](https://www.postgresql.orgをチェック

test=# explain select * from test_in where id in ('1', '1'); 
            QUERY PLAN 
--------------------------------------------------------------------------------- 
Index Only Scan using test_in_pkey on test_in (cost=0.15..3.34 rows=2 width=4) 
    Index Cond: (id = ANY ('{1,1}'::integer[])) 
(2 rows) 
2

SELECT * FROM items WHERE code = ('value1');(単一値)

は、

SELECT * FROM items WHERE code = 'value1';として

またはSELECT * FROM items WHERE code IN ('value1');を同じように処理されます。

パフォーマンスに違いはありません。これを確認するにはexplainを使用してください。