当前位置:编程学习 > JAVA >>

sql语句的性能大比拼

1.          SELECT DISTINCT  WebsiteName AS publisher_name,Pubid AS publisher_id FROM st_spots_attr 
            WHERE SpotsPlanId IN 
            (select SpotsPlanId from st_spots where MediaPlanId in 
            (select MediaPlanId from st_monitor_campaign WHERE MCampaignId = #{campaignId}))


2.     SELECT DISTINCT  a.WebsiteName AS publisher_name,a.Pubid AS publisher_id 
            FROM st_spots_attr a, st_spots p, st_monitor_campaign c 
            WHERE c.MCampaignId = #{campaignId} and c.MediaPlanId = p.MediaPlanId and a.SpotsPlanId = p.SpotsPlanId 



首先st_spots,st_spots_attr表是两张数据量很大的表,请各位大仙们看看,分析分析这两张表的性能! --------------------编程问答-------------------- 1、要看数据库执行计划。某些数据库上,被语法分析器优化后执行计划都一样了。

2、要看st_monitor_campaign表,经过 MCampaignId = #{campaignId} 被选择出来的行数有多少。 --------------------编程问答--------------------    1条  记录 --------------------编程问答-------------------- st_spots,st_spots_attr这两张表的数据量很大,直接对三张表进行合并,在进行一次扫描的性能比做3次扫描的性能好的多。
怎样权衡扫描和链接呢!
--------------------编程问答-------------------- 没啥用,现在优化器都挺智能的,
以前都是RBO,现在都是 CBO,以前说的那些规矩,
现在很多都不能客观分析了。

数据量很大,这句话也不足够,你还得分析数据分布状况,是均匀分布?还是同值大量集中?
这造成的检索策略是不一样的。 --------------------编程问答-------------------- 能否给推荐几本书,让我好好研究一下sql的优化这方面的知识,非常感谢各位大仙。。。 --------------------编程问答--------------------
引用 3 楼 jueshengtianya 的回复:
st_spots,st_spots_attr这两张表的数据量很大,直接对三张表进行合并,在进行一次扫描的性能比做3次扫描的性能好的多。
怎样权衡扫描和链接呢!


先看看数据库执行计划,往往会发现你这点小手段,人家写语法优化器的人早就已经同质化处理了。。。

因为数据库往往很聪明,所以执行计划很可能是这样:
1、它发现MCampaignId = #{campaignId}的估算结果是1行的话,必然会优先选择这行;
2、然后接下来就是根据这行来对 st_spots 进行过滤,得到符合条件的若干行集;
3、由于第二步产生的零散行集做表连接代价一般较高,所以最后应该是按第2步的结果进行循环,然后选择表 st_spots_attr 中的记录。

需要补充的是:外键上面要有索引,否则就是耍数据库了。。。 --------------------编程问答-------------------- 一条语句基本上没啥性能而言。 --------------------编程问答-------------------- 关于数据库的问题,楼主能不能推荐几本好书。 --------------------编程问答--------------------
引用 6 楼 ldh911 的回复:
Quote: 引用 3 楼 jueshengtianya 的回复:

st_spots,st_spots_attr这两张表的数据量很大,直接对三张表进行合并,在进行一次扫描的性能比做3次扫描的性能好的多。
怎样权衡扫描和链接呢!


先看看数据库执行计划,往往会发现你这点小手段,人家写语法优化器的人早就已经同质化处理了。。。

因为数据库往往很聪明,所以执行计划很可能是这样:
1、它发现MCampaignId = #{campaignId}的估算结果是1行的话,必然会优先选择这行;
2、然后接下来就是根据这行来对 st_spots 进行过滤,得到符合条件的若干行集;
3、由于第二步产生的零散行集做表连接代价一般较高,所以最后应该是按第2步的结果进行循环,然后选择表 st_spots_attr 中的记录。

需要补充的是:外键上面要有索引,否则就是耍数据库了。。。


++  谢谢

这几张表都有索引,
然后我通过mysql的explain工具对第一条sql检测了一下,发现后两个子查询是最优化的,但是最终的sql执行是all级别。我想到是不是应该把最终的查询的两个字段WebsiteName,Pubid 也加上索引,这样是否能优化最终的查询?

--------------------编程问答-------------------- 直接增加单个索引是没有意义的,要增加联合索引才有意义。

所以如果你想进一步优化性能,可以尝试增加联合索引,第一字段注意要用外键。 --------------------编程问答--------------------
引用 10 楼 ldh911 的回复:
直接增加单个索引是没有意义的,要增加联合索引才有意义。

所以如果你想进一步优化性能,可以尝试增加联合索引,第一字段注意要用外键。



++  谢谢
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,