明星网站开发项目介绍,宁波网站建设网页设计,在线html编辑器,郴州网在SQL Server的世界中#xff0c;SQL Server在Windows之上有一套自己的任务调度和资源分配系统#xff0c;这使得SQL Server作为Windows的一个进程#xff0c;却可以处理大量的并发#xff0c;这些任务调度和资源分配非常像一个操作系统#xff0c;因此SQL Server在Window… 在SQL Server的世界中SQL Server在Windows之上有一套自己的任务调度和资源分配系统这使得SQL Server作为Windows的一个进程却可以处理大量的并发这些任务调度和资源分配非常像一个操作系统因此SQL Server在Windows之上有一层被称为SQL OS的系统。 类似Windows进程之间的任务调度SQL Server OS也有一套自己的调度方案在早期的SQL Server曾经使用Windows自带的进程调度系统但由于SQL Server是一个处理高并发的进程因此Windows调度造成的线程切换(Context Switch)会带来很多的资源浪费并且Windows调度是抢占式调度这对于SQL Server来说非常不利因此SQL Server OS通过非抢占式调度算法来调度进程除非线程自己释放资源SQL Server不会强制剥夺资源当然了一些极端情况比如死锁或是检查scheduler时发现不利问题会记录到日志但依然不会抢占资源这也使得开发人员对T-SQL语句需要小心当然了这是题外话了。 在了解了SQL Server基本的调度算法后再让我们通过一个图来了解一下简单的SQL Server中线程的几种状态这类线程对Windows来说是线程对SQL Server来说是进程这也是为什么查询这些线程的时候用的是Sysprocess,如图1所示。 图1.SQL Server OS的简单算法 如果你了解操作系统的调度算法的话你会发现这里和操作系统的形式一样当线程得到等待的资源并获得CPU时就会是运行状态而当获得资源没有CPU时就会是Runnable状态或是当线程所需的资源没有到位时就会是阻塞状态。 因此多个CPU可以有多个线程在Running状态。 另外在SQL Server中每创建一个新表时都会为表分配存储页面相应的SQL Server也需要修改GAM,SGAM和FPS页。对于修改这些页来说SQL Server需要在修改的时候加上一个轻量级的锁这也就是所谓的闩锁(Latch)。当多个线程同时需要修改GAM,SGAM,FPS页时闩锁会造成阻塞。对于用户数据库来说不可能一直存在DDL操作但对于Tempdb来说会经常进行建表和删表因此对于GAM,SGAM以及FPS页都会经常修改如果Tempdb只有一个文件而CPU存在多核的时候多个同时运行的任务有可能争抢GAMSGAMFPS页的修改权因此造成阻塞这对性能是非常不利的而按照CPU个数将TempDB的文件分为多份则会存在多个GAM,SGAM,FPS页。多个Running的线程会按照每个文件的大小平均分布到不同的文件中因此解决了争用问题。 另外值得注意的是对于TempDB的最佳做法是一开始就为每一个文件分配足够大的值。并且每个文件大小相等这就避免了某个文件增长导致的文件大小不一而SQL Server对于文件的使用比率是按照文件大小如果文件大小不一样就会造成热点文件从而有可能造成闩锁争用。转载于:https://www.cnblogs.com/CareySon/archive/2012/10/06/2713260.html