2017-01-24 4 views
0

データベーステーブルを用意しましょう。 g:Postgresql:「最も低い」と「それ以上」を選択する最も効率的なクエリ

t_times (id INTEGER, created TIMESTAMP WITHOUT TIME ZONE); 

指定された日付の後に作成されたすべてのエントリと指定された日付より前に作成された最新のエントリを返すクエリを書き込む可能性はありますか?

UNIONでは単純に可能ですが、高速化はありませんか?

SELECT * FROM t_times WHERE created >= ? 
UNION 
SELECT * FROM t_times WHERE created < ? ORDER BY created DESC LIMIT 1; 
+0

'union all'が高速です。 –

答えて

1

union all高速である:

(SELECT * FROM t_times WHERE created >= ?) 
UNION ALL 
(SELECT * FROM t_times WHERE created < ? ORDER BY created DESC LIMIT 1); 

これはcreatedのインデックスと少し速くすることができる:

select t.* 
from t_times t 
where t.created >= (select max(t2.created) from t_times where t2.created < ?); 

アイデアは、インデックスがサブクエリに使用されるであろうということです。 。 。とても早い。インデックスを使用して行を取得します。しかし、これはunion allでのクエリのわずかな改善に過ぎません。

+0

あなたはそうです、UNION ALLはもっと速いです。もちろん、それは主要なポイントではありませんでした。あなたが提供した2番目の選択肢は、常に同じ結果を返すわけではありません(元のクエリではLIMIT 1に気付いていますが、私にとっては非常に便利です)。とにかく、あなたの答えをありがとう。 – user1482710

関連する問題