【发布时间】:2018-12-06 03:33:40
【问题描述】:
如你所见,我有非常简单的 SQL 语句:
SELECT DISTINCT("CITY" || ' | ' || "AREA" || ' | ' || "REGION") AS LOCATION
FROM youtube
我在查询中使用的 youtube 表有大约 2500 万条记录。查询需要很长时间才能完成(约 25 秒)。我正在尝试加快请求速度。
我创建了一个如下所示的索引,但我的更高查询仍然需要相同的时间才能完成。我做错什么了?顺便说一句,在我的情况下使用“分区”更好吗?
CREATE INDEX location_index ON youtube ("CITY", "AREA", "REGION")
EXPLAIN 返回:
Unique (cost=5984116.71..6111107.27 rows=96410 width=32)
-> Sort (cost=5984116.71..6047611.99 rows=25398112 width=32)
Sort Key: ((((("CITY" || ' | '::text) || "AREA") || ' | '::text) || "REGION"))
-> Seq Scan on youtube (cost=0.00..1037365.24 rows=25398112 width=32)
@george-joseph QUERY PLAN 您的脚本:
【问题讨论】:
-
你可以试试这个查询:
select concat(city, '|', area, '|', region) as location from (select city, area, region, count(*) youtube group by city, area, region) x;?这需要多长时间? -
@zedfoxus 您的查询大约需要 10-12 秒才能完成。
-
太棒了。这将时间缩短了一半。如果您希望它比这更快,您可能需要考虑物化视图 (postgresqltutorial.com/postgresql-materialized-views) 并通过计划任务/cron 作业定期刷新它。
-
正如我之前所说的
youtube我使用的表有大约 2500 万条记录。每 5 分钟将新数据加载到表中。也许最好在表中创建index和partition?我的主要问题是关于那个。你怎么看? -
你可以试试。很难确定分区是否能解决您的问题。如果您不经常运行此类查询并且用户可以等待 10 秒,则无需进行任何更改。如果您的用户不能等待那么久,请每小时将结果缓存到物化视图中。您的查询没有 where 子句,所以我认为分区对您没有帮助。
标签: sql postgresql indexing distinct