有什么办法可以优化下一个查询吗?
Is there any way to optimize next query?
我需要计算 table 的统计数据。接下来我写了 SQL:
SELECT
DISTINCT ("region"),
COUNT(*) as total,
COUNT(*) FILTER(WHERE t1.insert_status = 'success' AND t1.insert_status = 'success') as completed,
COUNT(*) FILTER(WHERE t1.insert_status IS NULL AND t1.insert_status IS NULL ) as waiting,
COUNT(*) FILTER(WHERE t1.insert_status = 'failed' ) as insert_failed
FROM xml_files t1
WHERE t1.section_name='payments'
AND processed_date >='2010-07-28' AND processed_date <='2021-08-28'
group by region
问题是我的 table 太大(5000 万行)并且花费了太多时间才能得到结果。有什么办法可以优化这个查询吗?
有哪些优化方式?
首先,您几乎不需要 select distinct
和 group by
。其次,您的查询有语法错误。
假设您打算:
SELECT region,
COUNT(*) as total,
COUNT(*) FILTER (WHERE t1.insert_status = 'success' AND t1.insert_status = 'success') as completed,
COUNT(*) FILTER (WHERE t1.insert_status IS NULL AND t1.insert_status IS NULL ) as waiting,
COUNT(*) FILTER (WHERE t1.insert_status = 'failed' ) as insert_failed
FROM xml_files t1
WHERE t1.section_name = 'payments' AND
t1.processed_date >='2010-07-28' AND t1.processed_date <='2021-08-28'
GROUP BY region;
那么您需要 xml_files(second_name, processed_date, region, insert_status)
上的索引。
我需要计算 table 的统计数据。接下来我写了 SQL:
SELECT
DISTINCT ("region"),
COUNT(*) as total,
COUNT(*) FILTER(WHERE t1.insert_status = 'success' AND t1.insert_status = 'success') as completed,
COUNT(*) FILTER(WHERE t1.insert_status IS NULL AND t1.insert_status IS NULL ) as waiting,
COUNT(*) FILTER(WHERE t1.insert_status = 'failed' ) as insert_failed
FROM xml_files t1
WHERE t1.section_name='payments'
AND processed_date >='2010-07-28' AND processed_date <='2021-08-28'
group by region
问题是我的 table 太大(5000 万行)并且花费了太多时间才能得到结果。有什么办法可以优化这个查询吗?
有哪些优化方式?
首先,您几乎不需要 select distinct
和 group by
。其次,您的查询有语法错误。
假设您打算:
SELECT region,
COUNT(*) as total,
COUNT(*) FILTER (WHERE t1.insert_status = 'success' AND t1.insert_status = 'success') as completed,
COUNT(*) FILTER (WHERE t1.insert_status IS NULL AND t1.insert_status IS NULL ) as waiting,
COUNT(*) FILTER (WHERE t1.insert_status = 'failed' ) as insert_failed
FROM xml_files t1
WHERE t1.section_name = 'payments' AND
t1.processed_date >='2010-07-28' AND t1.processed_date <='2021-08-28'
GROUP BY region;
那么您需要 xml_files(second_name, processed_date, region, insert_status)
上的索引。