ユーザテーブルから最新のユーザをフェッチする必要があります。以下のいずれかのクエリは、これを行うためにPostgresで最高のパフォーマンスを示します。PostgresでMAX関数またはDESCを使用する最大レコード
Select MAX(u.id) from User u;
または
Select u.id from User u order by desc limit 1;
ユーザテーブルから最新のユーザをフェッチする必要があります。以下のいずれかのクエリは、これを行うためにPostgresで最高のパフォーマンスを示します。PostgresでMAX関数またはDESCを使用する最大レコード
Select MAX(u.id) from User u;
または
Select u.id from User u order by desc limit 1;
これはコメントの精緻化です。
インデックスがuser(id)
の場合、両方のフォーミュレーションでそのインデックスを使用する必要があります。私は彼らが本質的に同じ実行計画を持っていると確信しています。
(b-tree)インデックスがない場合は、max()
バージョンが高速になると思います。私はそれが一度データを読んで、を1回のパスで抽出すると思う。 order by
はすべてのレコードをソートする必要があります。
データベースには、特別なケース(limit
とorder by
という特殊なケースを認識するような最適化など)があります。私はこの場合には適用されるとは思わない。
これはあなたの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()アプローチのセマンティクスを好みます。
データとシステムを試す必要があります。しかし、もしあなたが 'user(id)'にインデックスを持っていれば、私は両方が非常に速いと期待します。 –
最大値は速くなります。 – sisanared
実行計画を確認する –