Sql 如何重写使用聚合函数和分组方式的查询
因此,我有一个相当大的表(日期分区),例如table1。上有多列索引(车间id、g id、检查日期) 我正在尝试运行查询:Sql 如何重写使用聚合函数和分组方式的查询,sql,database,postgresql,Sql,Database,Postgresql,因此,我有一个相当大的表(日期分区),例如table1。上有多列索引(车间id、g id、检查日期) 我正在尝试运行查询: SELECT shop_id, g_id, max(check_date) FROM table1 GROUP BY shop_id, g_id; 执行非常慢-顺序扫描。 如何优化/重写查询,以便它可以使用索引。 还有一个表包含唯一的G_ID,另一个表包含唯一的SHOP_ID。您可以使用分析函数重写此查询,例如 SELECT t.shop_id, t.g_
SELECT shop_id, g_id, max(check_date)
FROM table1
GROUP BY shop_id, g_id;
执行非常慢-顺序扫描。
如何优化/重写查询,以便它可以使用索引。
还有一个表包含唯一的G_ID,另一个表包含唯一的SHOP_ID。您可以使用分析函数重写此查询,例如
SELECT
t.shop_id,
t.g_id,
t.check_date
FROM
(
SELECT shop_id, g_id, check_date,
DENSE_RANK() OVER (PARTITION BY shop_id, g_id ORDER BY check_date DESC) dr
FROM table1
) t
WHERE t.dr = 1;
在shop_id
和g_id
列上添加索引以覆盖整个分区:
CREATE INDEX your_idx ON table1 (shop_id, g_id);
您可以使用
启用_secscanto off
暂时关闭sec scan,并检查索引扫描是否有益,如果有益,至少重新分析table@VaoTsun当然,这将使索引扫描工作,但查询计划仍然非常充分,这并没有真正的帮助。子查询扫描t(成本=75752739.31..89811591.81行=2008408宽度=16)。当上一个查询计划HashAggregate(cost=14497422.24..14505112.79 rows=769055 width=16)时@AntonBondar在分区中涉及的列上添加索引。