首先来了解Tempdb。Tempdb是SQL Server的一个系统数据库,用于存储查询过程中产生的中间数据。例如排序过程中,进行高速排序时产生的中间结果,被存储在Tempdb的数据文件中。
在进行排序操作时,如果工作区内存(Working Set Memory 或称为Query Memory,表示某个查询请求的内存空间大小,SQL Server对于每个查询都有特定内存大小的设置。详细信息将在介绍SQL Server内存应用时讲解)不足,就需要使用Tempdb数据库来完成数据的排序。此时排序操作产生的部分中间数据将被写入Tempdb中,由于有了磁盘I/O操作的开销,排序操作将受到影响,这时不再如单纯的内存操作那样快速了,而且当Tempdb比较繁忙时,若并发量达到一定量级,也会对排序操作造成影响,随着承受着影响的操作请求数量地不断增加,服务器的压力将越来越大,从而形成一个恶性循环。因此,在对查询进行排序时,需要注意,若进行排序操作的数据量足够大,就会对整个数据库实例造成一定的压力。当这个压力增长到一定程度时,将导致整个数据库实例出现大批量SQL语句执行性能下降的情况。简单举个例子。例如,某服务器的一个查询语句需要进行排序操作,而排序的数据集的数据量很庞大,约有2亿,数据量大小达到了5GB,那么该查询至少需要使用5GB的Tempdb磁盘空间。Tempdb磁盘占用增长了,需要占用大量物理磁盘I/O来写入数据文件,导致语句的性能变差,并且由于Tempdb是公共资源,此时很容易造成磁盘资源阻塞,影响到其他会话的正常工作。
Tempdb的大量使用,也可能使Tempdb的数据文件扩大到磁盘无法容纳的程度,此时服务器上的其他操作将会受到影响。
因此在应用排序时,应清楚地知道排序的数据量范围,以避免服务器上的其他操作受到影响。
在加入了排序计算以后,尽量控制排序的数据量,尽量使排序操作能在额定的内存空间中完成,避免使用Tempdb。数据量较大时,可以考虑在排序字段上添加索引来避免执行排序操作。
例如,当需要进行一个较大数据集的排序操作时,可以考虑将排序字段,也就是ORDER BY子句后的字段添加在索引中。