大数据集下:CASE语句与多SELECT查询的性能对比
统计不同时间范围的钱包数量:两种方案对比
需求是统计钱包在1天、1个月、3个月、6个月、1年内的创建数量,以及总数量,下面是两种常见的SQL实现方案,还有小数据集下的查询表现分析:
方案一:CASE语句单查询
这种方案通过一次查询就能获取所有需要的统计值,用CASE表达式对每条记录做条件判断后累加,避免多次访问表:
SELECT SUM(CASE WHEN(created_at > (CURRENT_DATE - INTERVAL '1 days')) THEN 1 ELSE 0 END) as day_count, SUM(CASE WHEN(created_at > (CURRENT_DATE - INTERVAL '1 months')) THEN 1 ELSE 0 END) as month_count, SUM(CASE WHEN(created_at > (CURRENT_DATE - INTERVAL '3 months')) THEN 1 ELSE 0 END) as quater_count, SUM(CASE WHEN(created_at > (CURRENT_DATE - INTERVAL '6 months')) THEN 1 ELSE 0 END) as half_year_count, SUM(CASE WHEN(created_at > (CURRENT_DATE - INTERVAL '1 years')) THEN 1 ELSE 0 END) as year_count, count(*) as total_count from wallets;
方案二:多SELECT独立查询
这种方案需要执行6次独立查询,每个查询对应一个时间范围的统计,每次查询都会单独访问表:
SELECT count(*) from wallets where created_at > CURRENT_DATE - INTERVAL '1 days'; SELECT count(*) from wallets where created_at > CURRENT_DATE - INTERVAL '1 months'; SELECT count(*) from wallets where created_at > CURRENT_DATE - INTERVAL '3 months'; SELECT count(*) from wallets where created_at > CURRENT_DATE - INTERVAL '6 months'; SELECT count(*) from wallets where created_at > CURRENT_DATE - INTERVAL '1 years'; SELECT count(*) from wallets;
小数据集(10条记录)下的查询分析
CASE语句查询表现
查询执行计划显示:仅对wallets表执行一次全表扫描,随后通过聚合计算一次性得出所有统计结果,整体执行开销极低,没有重复扫描的额外消耗。
多SELECT查询表现
查询执行计划显示:每一条SELECT语句都会单独对wallets表执行一次全表扫描,累计执行6次全表扫描。在10条记录的小数据集下性能差异不显著,但重复扫描已经产生了不必要的冗余开销。
内容的提问来源于stack exchange,提问作者rahul mishra
相关产品推荐
相关产品推荐

