You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大数据集下: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:31:39