我想知道同时执行多个长时间运行的查询会对SQL Server按时为每个查询提供服务的能力产生何种影响。
[编辑]
我的意图不是含糊不清,更多是假设性的。我们假设这些查询是带有某种谓词的select语句,针对具有数百万行的表进行操作。
我想知道同时执行多个长时间运行的查询会对SQL Server按时为每个查询提供服务的能力产生何种影响。
[编辑]
我的意图不是含糊不清,更多是假设性的。我们假设这些查询是带有某种谓词的select语句,针对具有数百万行的表进行操作。
每个请求到达服务器时(即每个“批次”),都将与一个“任务”相关联,参见sys.dm_os_tasks。任务在“调度程序”上排队,粗略地说就是一个CPU核心,参见sys.dm_os_schedulers。每个调度程序都有几个“工作线程”(即线程或纤程,请参见sys.dm_os_workers),空闲的工作线程将从调度程序的队列中接收下一个任务,并“运行”,执行它直到任务完成(即请求已完成)。这种调度机制适用于SQL中的所有内容,包括系统任务、CLR运行代码等等。
可创建的任务数量受可用内存限制。请求(“批次”)与任务不是一对一的关系,因为有些请求一旦启动就会安排执行更多的任务,例如并行查询。系统中的工作线程数是动态的,但受“最大工作线程”配置设置的限制。如果工作线程达到上限,则新的计划任务将在调度程序中排队等待,但直到有空闲工作线程(完成任务)并变为可用之前,它们都不会被执行。当达到这种情况时,称为“工作线程饥饿”,会导致服务器无响应,因为新客户端登录握手需要执行登录任务(服务器似乎拒绝连接),而现有客户端的新请求将排队等待在等待任务后面(服务器需要很长时间才能响应微不足道的请求)。很难说。
我们有1亿行的表,子秒级聚合查询在工作时间内多次运行,以及10,000行的表查询需要20秒,但只在凌晨4点运行一次。
显然,运行的查询越多,性能就会越慢。
程度取决于数据和查询类型(更新/删除/插入?)。
锁定表的查询可能特别有问题;在适当的情况下使用nolock可以提高性能。
性能通常会线性恶化,除非您开始遇到重大的I/O问题。
然而,证明在于逐个和并行测试查询,并监视SQL Server统计信息。