sql >> データベース >  >> RDS >> PostgreSQL

Postgres Slow group by query with max

    必要なのは「スキップスキャン」または「ルーズインデックススキャン 」です。 "。PostgreSQLのプランナーはまだそれらを自動的に実装していませんが、再帰クエリを使用してそれを使用するように騙すことができます。

    WITH RECURSIVE  t AS (
    SELECT min(eventtype) AS eventtype FROM allevents
               UNION ALL
    SELECT (SELECT min(eventtype) as eventtype FROM allevents WHERE eventtype > t.eventtype)
       FROM t where t.eventtype is not null
    )
    select eventtype, (select max(eventtime) from allevents where eventtype=t.eventtype) from t;
    

    max(eventtime)をそのクエリの外部で実行するのではなく、再帰クエリに折りたたむ方法があるかもしれませんが、そうであれば、私はそれをヒットしていません。

    これを効率的にするには、(eventtype、eventtime)のインデックスが必要です。イベント時にDESCにすることもできますが、必須ではありません。これは、eventtypeにいくつかの異なる値(あなたの場合は21個)しかない場合にのみ効率的です。



    1. 小さなテーブルで時間がかかるMySQLALTERTABLE

    2. Pythonでmysqldumpを使用せずにMySQLデータベースをダンプするにはどうすればよいですか?

    3. SQL Serverのチューニング–すべては測定に関するものです

    4. SQLServerヒープv.s.クラスター化されたインデックス