所以,我有一个非常大的表(日期分区),例如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的表格。
所以,我有一个非常大的表(日期分区),例如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的表格。
您可以使用分析函数重写此查询,例如,
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);
它并没有真正的帮助。询问扫描上吨(成本= 75752739.31..89811591.81行= 2008408宽度= 16)。当以前查询QUERY PLAN HashAggregate(cost = 14497422.24..14505112.79 rows = 769055 width = 16) –
@AntonBondar在分区涉及的列上添加一个索引。 –
你可以关掉秒,'enable_secscan暂时扫描到off'并检查是否索引扫描野是,这有利于,如果是这样,至少重新分析表 –
@VaoTsun当然,这将使index_scan工作,但查询计划仍然awfull –