在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存在多核的时候,多个同时运行的任务有可能争抢GAM,SGAM,FPS页的修改权,因此造成阻塞,这对性能是非常不利的,而按照CPU个数将TempDB的文件分为多份,则会存在多个GAM,SGAM,FPS页。多个Running的线程会按照每个文件的大小平均分布到不同的文件中,因此解决了争用问题。

另外,值得注意的是,对于TempDB的最佳做法是一开始就为每一个文件分配足够大的值。并且每个文件大小相等,这就避免了某个文件增长导致的文件大小不一,而SQL Server对于文件的使用比率是按照文件大小,如果文件大小不一样,就会造成热点文件,从而有可能造成闩锁争用。

转载于:https://www.cnblogs.com/CareySon/archive/2012/10/06/2713260.html

TempDB为什么要根据CPU数目来决定文件个数相关推荐

  1. Hadoop精华问答 | 如何设置单个任务占用的内存量和CPU数目?

    我们很荣幸能够见证Hadoop十年从无到有,再到称王.感动于技术的日新月异时,让我们再来看看关于Hadoop的精华问答. 1 Q:默认情况下,各个节点的负载不均衡(任务数目不同),有的节点很多任务在跑 ...

  2. Go goroutine 的调度模型及设置运行CPU数目

    goroutine 的调度模型 MPG 模式基本介绍 M:操作系统的主线程(是物理线程) P:协程执行需要的上下文环境 G:协程 MPG 模式运行的状态 1 当前程序有三个M,如果三个M都在一个cpu ...

  3. Android不同CPU架构下so文件兼容问题总结

    一.Android 设备的CPU类型通常分以下几种 armeabiv-v7a: 第7代及以上的 ARM 处理器,目前主流版本,大部分Android设备都使用它. arm64-v8a: 第8代.64位A ...

  4. Linux命令进阶-cpu监控内存监控文件IO网络IO性能分析

    Linux命令进阶-cpu监控内存监控文件IO网络IO性能分析 前言 1 linux基础命令 1.1 grep 1.2 ls 1.3 find 1.4 ulimit 1.5 curl 1.6 scp ...

  5. 关于Android arm64-v8a、armeabi-v7a、armeabi、x86等CPU下的so文件兼容问题

    先介绍几个专业词: ARM : 是嵌入式中的一种架构,全称为Advanced RISC Machine,能够理解为ARM处理器. ABI(Application Binary Interface): ...

  6. linux cpu多核运行,LINUX在多核环境下,如果控制使用的CPU数目

    进入/boot/grub 修改grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun gr ...

  7. 【转】CPU位数、核数、个数

    转自:http://blog.chinaunix.net/uid-20344928-id-2985712.html 32 or 64 linux下查看操作CPU的运行位数: getconf LONG_ ...

  8. 【Android 逆向】ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )

    文章目录 一.ELF 文件类型 ( 动态库文件 ) 二.ELF 文件对应 CPU 架构 三.ELF 目标文件版本 四.可执行程序起始地址 一.ELF 文件类型 ( 动态库文件 ) ELF 文件头 第 ...

  9. 【Android CPU 优化】Android CPU 调优 ( Trace 文件分析 | Android Profiler 工具 | CPU Profiler 工具 )

    文章目录 一.Android CPU 优化 二.CPU Profiler 工具 三.相关资源 一.Android CPU 优化 在 Android 中 , 出现 动画掉帧 , 页面切换白屏 , 卡顿 ...

最新文章

  1. 如何开发一个用户脚本系列(3)——脚本一:百度首页和搜索页面添加 Google 搜索框...
  2. 用matlab仿真函数在空间分布,1.3 信道函数免费阅读_MATLAB R2016a通信系统建模与仿真28个案例分析免费全文_百度阅读...
  3. XAMPP环境下apache无法启动(端口未被占用)的解决方法
  4. 如何保存一个函数_如何表达一个“分段函数”之学习Matlab Function模块
  5. jcenter和maven下载失败Can't connect to SOCKS proxy:Connection refused: connect
  6. c语言 typedef_C Typedef-能力倾向问题与解答
  7. C/C++混淆点-字符串指针
  8. 作者:景志刚(1977-),男,现就职于中国人民银行征信中心数据部,主要研究方向为数据挖掘。...
  9. java 枚举源码解析
  10. html选择区间,jQuery可选择区间值代码
  11. Oozie 集成 Ssh
  12. 人大金仓数据库迁移工具
  13. 笔记本电脑扩展屏幕到笔记本、平板和手机(duet、spacedesk)
  14. 小程序毕业设计 基于微信鲜花花店商城小程序毕业设计开题报告功能参考
  15. STM32 内部flash 数据掉电存储
  16. 路由器刷openwrt后不能上网 修改brlan的ip地址失败
  17. jpeg格式说明与解码学习
  18. linux计算多个文件大小的和,linux统计多个文件大小总和
  19. linux广播命令,分享|在 Linux 终端收听广播
  20. spring-boot 2.5.6 问题:WARN: This connection is using TLSv1.1

热门文章

  1. java有password_hash吗,java 实现 PHP password_hash() password_verify() 单向验证
  2. linux下如何在shell中结束进程(ctrl+c\ctrl+z\ctrl+d\ctrl+\的用法)
  3. [二叉树] 二叉树的最近公共祖先--leetcode236
  4. java NIO和Reactor模式
  5. cygwin下使用gcc编译c可执行程序
  6. 全民熬夜的时代,如何做到早睡?
  7. “城迷”:黑白梦与精神逃离
  8. 额尔古纳的俄罗斯女孩
  9. WordPress通过插件发送邮件
  10. python 画布包括不了全部组件?_试验程序:画布版九键琴