SQL Server在执行一项任务时,会将这个任务分割成子任务同时进行。比如做2个表的join操作时,如果是首次执行,会有一个子任务负责从磁盘上的数据库文件中把要执行的数据页读取到内存中,同时,会有另一个子任务负责做join这个操作。
既然是多任务,那就可以在多个CPU上同时进行。有时这些任务要交换到不同CPU上继续执行。所以,就引出了Affinity mask的概念,简单来说,就是用户可以选择SQL Server可以固定使用哪些CPU。比如,我有一台4颗4核的CPU,那总的逻辑CPU数量就有16个,我可以通过Affinity Mask来控制我的SQL Server只使用其中的前3个,留出剩下的13个给其他的application用。同样,Affinity I/O Mask也是一样的道理,只是它是用来控制I/O操作的。
为了提高效率,不能将Affinity Mask和Affinity I/O Mask设在同一颗CPU上。一颗CPU只能派一个用场。
如果遇到这样的错误,
Msg 5834, Level 16, State 1, Line 1
The affinity mask specified conflicts with the IO affinity mask specified. Use the override option to force this configuration
很清楚,一定是什么语句把这两个属性设在相同的CPU上了。如果要检查当前的设置,可以运行
sp_configure
go
然后看这2个属性的Run_value(当前启用的值)
关于具体的设置方法,可以参考这篇文章,讲的很透彻:
http://msdn.microsoft.com/en-us/library/ms187104.aspx
例如:
以下可以成功。因为Affinity Mask设在了第1,2颗CPU上,Affinity I/O Mask设在了第3颗CPU上。
sp_configure 'affinity mask', 3;
RECONFIGURE;
GO
sp_configure 'affinity I/O mask', 4;
RECONFIGURE;
GO
而以下就会发生冲突。因为Affinity I/O Mask设在了第1和第3颗CPU上,而第1颗已经设上Affinity Mask了。
sp_configure 'affinity mask', 3;
RECONFIGURE;
GO
sp_configure 'affinity I/O mask', 5;
RECONFIGURE;
GO