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_mapdim_ad_tag_map:创建(id, client_id, ad_type_id)联合索引,匹配sum的关联条件并快速定位ad_type_iddim_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
相关产品推荐
相关产品推荐

