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

SQL查询速度优化咨询:现有查询是否可进一步优化?

SQL查询优化建议

你的这个查询确实还有不少优化空间,下面是具体的优化方向和调整后的示例:

1. 移除完全无关的左连接

原exists子查询里的dim_site、dim_region、dim_device_category、dim_ad_unit、dim_monetization_channel、dim_os、dim_integration_type这些表,既没有参与筛选条件,也没有被用来关联其他必要表,完全属于冗余关联,去掉它们能直接减少数据库的关联计算开销。

2. 简化exists子查询的关联逻辑

原查询在exists里额外join了一次dim_ad_type,但其实dim_ad_tag_map.ad_type_id已经直接关联到dim_ad_type.id,不需要重复关联这张表,直接通过dim_ad_tag_map.ad_type_id = x.id就能完成匹配,大幅简化子查询逻辑。

3. 去掉不必要的DISTINCT

因为exists本身就是用来判断"存在性",只要匹配到一次就会返回true,外层查询的dim_ad_type每条记录只会被判断一次,所以DISTINCT是多余的,可以直接去掉。

4. 针对性添加索引

确保以下字段有合适的索引,能进一步提升查询速度:

  • sum_adserver_dimensions:创建(client_id, ad_tag_map_id)联合索引,快速筛选client_id=50的记录并关联dim_ad_tag_map
  • dim_ad_tag_map:创建(id, client_id, ad_type_id)联合索引,匹配sum的关联条件并快速定位ad_type_id
  • dim_ad_type:创建(id, name)联合索引,覆盖查询的返回字段和排序需求

优化后的SQL示例

select name ad_type 
from dim_ad_type x  
where exists  ( 
    select 1 
    from sum_adserver_dimensions sum 
    join dim_ad_tag_map 
        on dim_ad_tag_map.id = sum.ad_tag_map_id 
        and dim_ad_tag_map.client_id = sum.client_id 
    where sum.client_id = 50 
    and dim_ad_tag_map.ad_type_id = x.id 
) 
order by ad_type

或者用更简洁的IN写法:

select name ad_type 
from dim_ad_type 
where id in (
    select dim_ad_tag_map.ad_type_id
    from sum_adserver_dimensions sum
    join dim_ad_tag_map 
        on dim_ad_tag_map.id = sum.ad_tag_map_id 
        and dim_ad_tag_map.client_id = sum.client_id
    where sum.client_id = 50
)
order by ad_type

内容的提问来源于stack exchange,提问作者Manish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:25:25