我有一个包含 200000 行和列的表:名称和日期。日期和名称可能具有重复值。我想获得按升序排序的日期的前 300 个唯一名称,并让它运行得很快,因为我的表可能有一百万行。
我正在使用 postgresql 9。
我有一个包含 200000 行和列的表:名称和日期。日期和名称可能具有重复值。我想获得按升序排序的日期的前 300 个唯一名称,并让它运行得很快,因为我的表可能有一百万行。
我正在使用 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 的最后一个查询将错过在同一日期有两个日期的名称,但是这个没有。
在具有大约 100.000 个条目的非优化 postgresql 9.1 中,查询大约需要 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;
或者,将原始查询转换为 FROM 中的嵌套子查询,而不是 CTE:
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 来检查它是否有效,但优化器会做得更好。
(日期,名称)的索引是获得最佳性能的必要条件。