1

以下を使用して、「サーバー」に基づいて最新の一意のレコードのリストを返します

select server, fail, date, time
from (
    select server, fail, date, time,
           rank() over (partition by server order by date desc, time desc) as rank
    from querytimes
) dt
where dt.rank <= 1;

動作しますが、かなり遅いです。

時間: 21470.742 ミリ秒

出力例、

  server       | fail |    date    |   time
-------------------+------+------------+----------
serv1.test.com  | No   | 2013-02-21 | 10:25:03
serv2.test.com  | No   | 2013-02-21 | 10:25:03
serv3.test.com  | No   | 2013-02-21 | 10:25:03
serv4.test.com  | No   | 2013-02-21 | 10:25:03
serv5.test.com  | No   | 2013-02-21 | 10:25:03
serv6.test.com  | No   | 2013-02-21 | 10:25:03
serv7.test.com | No   | 2013-02-21 | 10:25:02
serv8.test.com | No   | 2013-02-21 | 10:25:01
serv9.test.com | No   | 2013-02-21 | 10:25:01
serv10.test.com | No   | 2013-02-21 | 10:25:02
serv11.test.com | No   | 2013-02-21 | 10:25:02
serv12.test.com | No   | 2013-02-21 | 10:25:02
serv13.test.com | No   | 2013-02-21 | 10:25:01
serv14.test.com | No   | 2013-02-21 | 10:25:01

このタイプのクエリを実行するより効率的な方法はありますか?

4

2 に答える 2

4

次のようなPosgreSQL固有のDISTINCT ON句を試すことができます。

select distinct ON (server) server, fail, date, time
from querytimes
order by server, date desc, time desc;

速度が十分でない場合は、 にインデックスを追加してみてください(server,date,time)

PS のような予約語を列名に使用dateするtimeことはお勧めできません。

于 2013-02-21T16:47:20.880 に答える
0

考えてみてください-必要なすべてのレコードが非常に最近のものになる場合、最初に検索スペースをx分未満のレコードに制限することで、関連するレコードの量を縮小できます-おそらく共通テーブル式を使用してフィルタリングできます巨大なテーブルからレコードのサブセットを取り出してから、その小さなレコード セットに対して実際のクエリを実行します。

With MostRecent as
( SELECT * from querytimes WHERE ( ...Postgres code to get latest... )
)
SELECT ...yourquery... FROM MostRecent

http://www.postgresql.org/docs/7.4/static/functions-datetime.htmlで遊ぶためのたくさんの日付関数

于 2013-02-21T17:23:25.943 に答える