0

名前と日付の200000行と列を持つテーブルがあります。日付と名前には、値が繰り返される場合があります。昇順でソートされた日付の最初の 300 個の一意の名前を取得し、テーブルに 100 万行ある可能性があるため、これを高速に実行したいと考えています。

postgresql 9 を使用しています。

4

2 に答える 2

1
SELECT name, date
FROM
  (
    SELECT DISTINCT ON (name) name, date
    FROM table
    ORDER BY name, date
  ) AS id_date
ORDER BY date
LIMIT 300;

@jachguate の最後のクエリは、同じ日付に 2 つの日付を持つ名前を見逃しますが、これはそうではありません。

クエリは、最適化されていない postgresql 9.1 で約 100.000 エントリを使用して約 100 ミリ秒かかるため、数百万のエントリに拡張できない場合があります。

リリース ノートによると、多くのパフォーマンスの改善があるため、postgresql 9.2 へのアップグレードが役立つ場合があります。

于 2012-11-23T17:26:21.840 に答える
0

CTE を使用します。

with unique_date_name as (
       select date, name, count(*) rcount
         from table
        group by date, name
       having count(*) = 1
     )
select name, date
  from unique_date_name
 order by date limit 300;

編集 コメントから、これによりパフォーマンスが低下するため、他の方法を試してください:

       select date, name, count(*) rcount
         from table
        group by date, name
       having count(*) = 1
        order by date limit 300;

または、元のクエリを CTE の代わりに FROM でネストされたサブクエリに変換します。

select name, date
from (
       select date, name, count(*) rcount
         from table
        group by date, name
       having count(*) = 1
     ) unique_date_name
 order by date limit 300;

残念ながら、動作するかどうかを確認するための postgreSQL を手元に持っていませんが、オプティマイザはより適切に動作します。

(日付、名前) のインデックスは、最適なパフォーマンスを得るために必須です。

于 2012-11-22T17:56:35.257 に答える