名前と日付の200000行と列を持つテーブルがあります。日付と名前には、値が繰り返される場合があります。昇順でソートされた日付の最初の 300 個の一意の名前を取得し、テーブルに 100 万行ある可能性があるため、これを高速に実行したいと考えています。
postgresql 9 を使用しています。
名前と日付の200000行と列を持つテーブルがあります。日付と名前には、値が繰り返される場合があります。昇順でソートされた日付の最初の 300 個の一意の名前を取得し、テーブルに 100 万行ある可能性があるため、これを高速に実行したいと考えています。
postgresql 9 を使用しています。
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 へのアップグレードが役立つ場合があります。
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 を手元に持っていませんが、オプティマイザはより適切に動作します。
(日付、名前) のインデックスは、最適なパフォーマンスを得るために必須です。