我有一个查询,在它的一个表被解析之前,在30秒内执行,并且在分区之后,查询一直在运行。
最近被分区的表是ysm_yield_session_master。这个新表包含4到5个分区,每个分区最多有9000万行。
yr_yield_result和ywd_yield_website_details是其他分区表(每个分区非常大,数百万行),它们很久以前就被分区了。
SELECT
ovp_ota_name AS ota_name,
COALESCE(t.pending_count, 0) AS pending_count
FROM ovp_ota_vendor_profile
LEFT JOIN
(
SELECT
ovp_ovp_key as ota_key,
COUNT(*) AS pending_count
FROM ysm_yield_session_master
LEFT JOIN ywd_yield_website_details ON ysm_ysm_key=ywd_ysm_key
LEFT JOIN yr_yield_result ON yr_ywd_key=ywd_ywd_key
LEFT JOIN wm_abc ON ywd_wm_key=wm_wm_key
LEFT JOIN wmo_abc ON wmo_wm_group=wm_group
LEFT JOIN ovp_abc ON ovp_ovp_key = wmo_ovp_key
WHERE ( ysm_yield_date = 'now'::text::date
OR ysm_yield_date = 'yesterday'::text::date)
AND (GREATEST(now(), ysm_yield_time) - LEAST(now(), ysm_yield_time))
< '06:00:00'::interval
AND ( ywd_yield_date = 'now'::text::date
OR ywd_yield_date = 'yesterday'::text::date)
AND ( yr_yield_date IS NULL
OR yr_yield_date = 'now'::text::date
OR yr_yield_date = 'yesterday'::text::date)
AND yr_yr_key IS NULL
AND ovp_ovp_key IS NOT NULL
GROUP BY ovp_ovp_key) t ON ovp_ovp_key = ota_key
ORDER BY ovp_ota_name;我仍然拥有原始表,当我用旧表替换分区表时,我看到查询运行得更快。我比较了分区前后查询的执行计划,它们有很大的不同,有分区的查询很昂贵。
我确保在分区后更新统计数据。不知道我还能做什么。
有什么想法吗..?
FYI,所有分区的行总数约为3.6亿条记录。独立表的总行数约为20亿条记录(但在此表上记录速度要快得多)
发布于 2017-11-11 21:12:50
在新计划中,你可以看到seq。扫描分区表,当旧查询的总成本仅为600万N时,它的开销非常昂贵--大约为1800万n。
我看到了同样的效果,当我没有使用正确的条件,在哪里或加入。分区键是什么?您的查询是否只使用其中一个partition_sub_table。你有子表的索引吗?
https://dba.stackexchange.com/questions/189897
复制相似问题