SQLServer数据库性能优化教程之T-SQL实例
1. select 语句的性能
1)只查询需要的字段,避免使用select *。
只查询需要的字段,可以避免许多不必要的io。
减少字段的输出,可以更有效地利用覆盖索引。
2)限定查询结果集的数量。
使用top字句等限制结果集的大小,可以避免批量数据的操作,并且有效地使用索引,防止扫描操作带来的大量io和内存的使用。
3)尽量地使用有效的索引
当需要对数据进行行过滤的时候,应该优先考虑使用索引字段;
若有多个索引字段可供选择,优先选择以筛选率较高,也就是重复率比较低的索引字段作为过滤条件。一般会选择将数据重复率低于5%的字段作为索引过滤字段。
注意:在编写sql时,以下几点容易被忽略:
1)不要再过滤字段上使用任何的计算,包括函数、逻辑计算、普通的计算等,因为这些字段计算公式的加入,将造成查询优化器无法使用相应字段的索引。
2)尽量使用有索引的字段进行排序,特别是排序的数据量比较大室时,这可以很大程度上降低排序操作带来的成本开销。
3)填写查询表时,尽量使用join关键字连接表,这样语句才清晰,易于,不易缺失关联条件。关联条件的缺失容易造成查询笛卡尔儿乘积。在调优时常会发现这样的情况,原本只需要查询百条数据,其查询结果却变成了数十万条,计算的数据量积呈几何倍增加了。
2. order by 排序性能的影响
order by 子句的性能取决于参与排序操作的数据量的大小。
排序操作会在数据筛选完以后,对筛选出的结果集进行排序。因此,对于需要排序的查询,应将排序操作控制在结果集数据量尽量小的查询中,避免对大批量数据进行排序操作,这样可以避免不必要的cpu资源消耗,并且当排序操作超过可以分配的内存大小时,会把排序的中间数据存放在tempdb中,这将增加io操作,导致语句的性能大大下降。
在不得不对大量数据进行排序操作的情况下,是当地创建一些索引对排序操作会有一定的帮助。
排序对tempdb的影响。
tempd是sql server的一个数据库,用于存储查询过程中产生的中间数据。在进行排序操作时,如果工作区内存不足,就需要使用tempdb数据库来完成排序操作。此时排序操作产生的部分中间数据被写入tempdb中, 由于有了磁盘io操作的开销,排序操作将受到影响,这时不再如单纯的内存操作那样快了,而且当tempdb比较繁忙时,若并发量达到一定量级,也会对排序造成影响,随着承受着影响的操作请求数量不断增加,服务器的压力将越来越大,从而形成一个恶性循环。因此,在对查询进行排序时,需要注意,若进行排序操作的数据量足够大,就会对整个数据库实例造成一定的压力。当这个压力增长到一定程度时,将导致整个数据库出现大批量sql语句执行性能下降的情况。
简单举个例子,某服务器的一个查询语句需要进行排序操作,而排序的数据集的数据量很庞大,又有2亿,数据量大小达到了5gb,那么该查询至少需要使用5gb的tempdb磁盘空间。tempdb磁盘占用增长了,需要大量无聊磁盘io来写入数据文件,导致语句的性能变差,并且由于tempdb是公共资源,此时很容易造成磁盘资源阻塞,影响到其他回话的正常工作。
tempdb的大量使用,也可能使tempdb的数据文件扩大到磁盘无法容纳的程度,此时服务器上的其他操作将会受到影响。因此在应用排序时,应清楚地知道排序的数据量范围,以避免服务器上的其他操作受到影响。