2017-08-11 70 views
1

所以,我有一个非常大的表(日期分区),例如table1。 (shop_id,g_id,check_date)上有多列索引。如何重写查询,它使用聚合函数和组

我试图运行查询:

SELECT shop_id, g_id, max(check_date) 
FROM table1 
GROUP BY shop_id, g_id; 

执行是很慢 - 序列扫描。 如何优化/重写查询,因此它可能会使用索引。 还有一个表格,其中包含唯一的G_ID和另一个具有唯一SHOP_ID的表格。

+0

你可以关掉秒,'enable_secscan暂时扫描到off'并检查是否索引扫描野是,这有利于,如果是这样,至少重新分析表 –

+0

@VaoTsun当然,这将使index_scan工作,但查询计划仍然awfull –

回答

2

您可以使用分析函数重写此查询,例如,

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_idg_id列都添加一个索引来覆盖整个分区:

CREATE INDEX your_idx ON table1 (shop_id, g_id); 
+0

它并没有真正的帮助。询问扫描上吨(成本= 75752739.31..89811591.81行= 2008408宽度= 16)。当以前查询QUERY PLAN HashAggregate(cost = 14497422.24..14505112.79 rows = 769055 width = 16) –

+0

@AntonBondar在分区涉及的列上添加一个索引。 –