CXPACKET是指:线程正在等待彼此完成并行处理。什么意思呢? 当sql server发现一条指令复杂时,会决定用多个线程并行来执行,由于某些并行线程已完成工作,在等待其它并行线程来同步,这种等待就叫CXPACKET。
为什么会有并行线程呢? 因为在sql server 里有个任务调度SCHEDULER是跟操作系统CPU个数 默认是一 一匹配的, 我们也可能通过sp_configure来设置最大并行度,也就是Max Degree of Parallelism (MAXDOP)。 关于调度可参考 " sql server 任务调度与CPU"
并行处理的优势: 用多个线程来执行一个指令,当sql server发现一条指令复杂时或语句中含有大数据量要处理,此时执行计划会决定用多个线程并行来执行,从而提高整体响应时间,例如一个指令读入100w条记录, 如果用一个线程做 可能需要10秒, 如果10个线程来做 可能只需要1秒,加上线程间同步时间也不过2秒。
并行处理的劣势:
(1) 是并行线程要等待同步。
(2) 是由于这10个线程全力以赴,就有10个对应的cpu,这样别的用户发过来的指令就会受到影响,甚至拿不到cpu来执行。所以对于并发度要求高的需要及时响应的,一般会建议手动设置每个指令的并行线程数。反之可以不设置Max Degree of Parallelism由系统默认去并行或者设少一点并行度。
(3) 找出cpu和i/o耗性能最高的sql语句, 查看执行计划是否有并行处理。
(4) 找出程序中感觉复杂的sql语句,查看执行计划。
(5) 避免或减少白天执行频繁复杂sql,优化sql 建好索引。
(6) 当执行计划发现并不需要用并行执行时,强制sql 使用OPTION ( MAXDOP x) 也不会采用并行执行。
最后考虑调整并行度的开销阈值或降低并行度。
设置sql语句级的MAXDOP。如果MAXDOP=1的话,使得一个BATCH只对应一个TASK。如果没有设置MAXDOP,一个BATCH可能会产生多个TASKS,那么TASK之间的协调,等待等等,将是很大的开销。把MAXDOP设小,能同时减少WORKER的使用量。所以,如果我们看到等待类型为CXPACKET的话,那么我们可以设置MAXDOP,减少并行度。