默认情况下,sql优化器在生产执行计划时,不会考虑生成并行的执行计划,只有当预估的执行开销超过了阀值,才会考虑生成并行执行计划。
如果返回的数据量较大(几十万、百万),我们可以手动设置sql并行执行,原来是单线程执行这个sql,现在变成了多个线程来执行sql,速度会明显提高。
(1)基本原理
从优化思路上说,就是投入更多资源来做任务,而且和IT项目上有很多共同点。比如,公司接了个项目,这个项目评估工作量是1000人天,原来公司有50个开发,有40个开发在开发、维护其他项目,现在只有10个人可以投入开发,那么把人天除以10个人,就是要100天才能完成任务,
于是公司有新招聘10人,于是工作量除以20人,就是50天,大概就是2个月,从预估的时间上是明显缩短了,但是由于人多了,
管理、沟通、培训、新人熟悉工作的成本增加了,所以效率实际上并不会有线性的增长。
回到SQL并行执行的问题,如果线程成从1个变成了4个,执行时间并不会减少为原来的4分之1,因为线程之间也要通信,也会有有的线程执行快,有的执行慢,会有相互等待的情况出现。
(2)如何启用并行
sql server服务器有2个参数:
max degree of parallelism 是最大的并行度,这个参数可以根据服务器cpu的个数来设置,建议开始的时候设置小一点,比如服务器有64个逻辑cpu,开始时设置成4~8个,如果设置过大,再加上生成的执行计划有问题,很有可能导致整个服务器挂住,导致其他的任务都没办法正常运行。
cost threshold for parallelism是并行的开销阀值,默认值是5,一般不用修改。
除了设置服务器参数,还可以在sql语句中指定并行度,这个更加灵活,会在后面文章中讲到。