2016-09-23 4 views
1

ユーザテーブルから最新のユーザをフェッチする必要があります。以下のいずれかのクエリは、これを行うためにPostgresで最高のパフォーマンスを示します。PostgresでMAX関数またはDESCを使用する最大レコード

Select MAX(u.id) from User u; 

または

Select u.id from User u order by desc limit 1; 
+0

データとシステムを試す必要があります。しかし、もしあなたが 'user(id)'にインデックスを持っていれば、私は両方が非常に速いと期待します。 –

+0

最大値は速くなります。 – sisanared

+0

実行計画を確認する –

答えて

0

これはコメントの精緻化です。

インデックスがuser(id)の場合、両方のフォーミュレーションでそのインデックスを使用する必要があります。私は彼らが本質的に同じ実行計画を持っていると確信しています。

(b-tree)インデックスがない場合は、max()バージョンが高速になると思います。私はそれが一度データを読んで、を1回のパスで抽出すると思う。 order byはすべてのレコードをソートする必要があります。

データベースには、特別なケース(limitorder byという特殊なケースを認識するような最適化など)があります。私はこの場合には適用されるとは思わない。

0

これはあなたのPostgreSQLのバージョンに依存してもよいが、私は代表テーブルの上に二つのアプローチ(あなたが何をすべきかである)テスト:これはユニークなインデックス上で、9.4.5からだった

explain analyze select max(id) from versions; 
                      QUERY PLAN                    
-------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
Result (cost=0.21..0.21 rows=1 width=0) (actual time=0.034..0.034 rows=1 loops=1) 
    InitPlan 1 (returns $0) 
    -> Limit (cost=0.08..0.21 rows=1 width=4) (actual time=0.031..0.031 rows=1 loops=1) 
      -> Index Only Scan Backward using index_versions_on_id on versions (cost=0.08..98474.35 rows=787172 width=4) (actual time=0.030..0.030 rows=1 loops=1) 
       Index Cond: (id IS NOT NULL) 
       Heap Fetches: 1 
Planning time: 0.143 ms 
Execution time: 0.062 ms 
(8 rows) 

explain analyze select id from versions order by id desc limit 1; 
                     QUERY PLAN                   
------------------------------------------------------------------------------------------------------------------------------------------------------------ 
Limit (cost=0.08..0.21 rows=1 width=4) (actual time=0.025..0.025 rows=1 loops=1) 
    -> Index Only Scan Backward using index_versions_on_id on versions (cost=0.08..98080.76 rows=787172 width=4) (actual time=0.024..0.024 rows=1 loops=1) 
     Heap Fetches: 1 
Planning time: 0.099 ms 
Execution time: 0.044 ms 
(5 rows) 

を860,000行のテーブル。

これは技術によるオーダーがやや速いことを示していましたが、私にとっては、その方法を使用すべきかどうかを決めるだけでは不十分です。パフォーマンスはすべてではなく、私はmax()アプローチのセマンティクスを好みます。

関連する問題