Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何重写使用聚合函数和分组方式的查询_Sql_Database_Postgresql - Fatal编程技术网

Sql 如何重写使用聚合函数和分组方式的查询

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_

因此,我有一个相当大的表(日期分区),例如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_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在分区中涉及的列上添加索引。