Cos*_*sta 7 sql-server performance
当sql server正在接收两个查询(SELECT*From the_Same_Table)时,在同一时间,如果你有一个服务器有多个处理器,可以sql server同时检索数据吗?
我试图了解如果在.01秒内完成的廉价选择语句和1000个用户同时运行相同的查询将会发生什么.我想如果服务器有四个处理器会发生什么情况,那么SQL服务器将在.01秒内服务前四个,并在0.02秒内为下一个四个用户服务.
这甚至接近实际发生的情况吗?
我想我会尝试使用某种代码和记录器来测试它,或者可能有可靠的测试工具来做到这一点.
谢谢
Rem*_*anu 20
进入SQL Server的每个批处理(请求)都会创建一个任务.任务计划执行并由工作人员接收.工人与线程非常相似.任务与工作人员保持一致,直到完成,然后它释放工人以获取另一个任务.系统中的工作人员数量有限,由配置sp_configure 'max worker threads'
.至少有256名工人,其中大约35名是系统.工作人员需要运行调度程序,每个CPU核心都有一个调度程序.工作人员合作共享调度程序.
有些任务会产生子任务,比如并行查询.这些任务也排队等待执行,需要工人完成.产生子任务的任务无法完成,直到它产生的所有任务都完成.
还有一些用户操作驱动的系统任务,如登录握手.当客户端打开新连接时,握手和登录身份验证/授权由任务完成,这需要工作人员.
当1000个请求到达服务器时,将创建1000个任务并排队等待执行.自由工作者接受任务并开始执行它们.当他们完成一项任务时,他们会接受下一个任务,直到完成1000个请求创建的所有任务.
显示正在发生的事情的DMV是:
这些详细信息在SQL Server批处理或任务计划以及Slava的博客中进行了描述.
此外,一旦任务执行,将编译该请求.编译将首先在内存中查找请求文本,并搜索具有相同计划的请求的现有编译计划.您可以在SQL Server中阅读我对动态创建的SQL vs参数的回复,以便更详细地了解这种情况.另请参阅执行计划缓存和重用.创建计划后,它将启动执行.像这样的查询SELECT ... FROM table
将创建一个简单的计划,其中只有几个运算符,基本上获取每一行并将其放入TDS流回客户端.查询计划是运算符树,并且始终通过在循环中询问树的根来执行查询,直到根返回EOF.树下的查询运算符越来越具体,直到底层运算符将是对所选访问路径(优化器为满足查询而选择的索引或堆)的物理访问.请参见SQL语句处理.索引访问将始终从缓冲池请求数据,而不是从磁盘请求.当缓冲池没有缓存请求的页面时,页面上会放置一个PAGEIOLATCH,并且会向IO子系统提交读取页面的请求.对同一页面的后续请求将等待此IO完成,并且一旦页面在缓冲池中,所有其他需要此页面的查询将从缓冲池中获取.当缓冲池需要空闲页面时,未使用的页面被驱逐,但如果系统有足够的RAM,则一旦加载,页面将永远不会被驱逐.索引和堆扫描操作将请求预读,预计将请求页面链接链中当前页面之前的页面.读取前提受到索引contiguos片段的限制,这是索引碎片进入图片时的情况,了解页面和范围.
查询执行的另一个方面是行的逻辑锁定.为了稳定,读取可以在其读取的行上放置行锁或范围锁(取决于隔离模型),以防止在查询遍历扫描时进行concurent更新.在SNAPSHOT隔离级别下,查询根本不会请求锁定,而是使用版本标记来提供从版本存储请求的数据(请参阅SQL Server 2005基于行版本控制的事务隔离).在READ UNCOMMITED隔离下(或使用nolock提示时),查询不会请求对其读取的行进行锁定,但如果发生了concurent更新,则读取不一致(读取未读取的行,读取相同的行两次,或者现有行可能根本没有阅读).