0

我是 PostgreSQL 的新手。有没有办法提高以下查询的执行时间:

SELECT s.id, s.name, s.url,
       (SELECT array_agg(p.url)
        FROM (
            SELECT url
            FROM pages
            WHERE site_id = s.id ORDER BY created DESC LIMIT 5
        ) as p
       ) as last_pages
FROM sites s

我还没有找到如何将LIMIT子句插入聚合调用,作为排序。

table 中有created( timestamp) 和site_id( )的索引,但是很遗憾,没有to的外键。该查询旨在返回一个站点列表,其中包含 5 个最近创建的页面的子列表。integerpagessites.idpages.site_id

PostgreSQL 版本是 9.1.5。

4

1 回答 1

3

您需要从像数据库管理系统一样思考开始。您还需要非常仔细地考虑您从数据库中询问的内容。

您的基本问题是,当顺序扫描可能快得多时,您可能会在这里发生大量单独的索引调用。由于您有必须关联的子查询,因此您当前的查询给计划者的灵活性很小。

一个更好的方法是使用视图(内联或非内联)和窗口函数:

   SELECT s.id, s.name, s.url, array_agg(p.url)
     FROM sites s
     JOIN (select site_id, url, 
                  row_number() OVER (partition by site_id order by created desc) as num
             from pages) p on s.id = p.site_id
    WHERE num <= 5;

这可能会将大量索引扫描更改为单个大型顺序扫描。

于 2013-05-29T07:41:08.220 回答