SQL编码中注意的性能问题

1、选择合适的数据类型
为列选择最小化的数据类型
假设一列中的文本长度不一,使用VARCHAR而不是CHAR
不存储Unicode不要使用NVARCHAR或者NCHAR
假设一行的长度不超过8000,使用VARCHAR而不是TEXT
对于仅存数字的列要使用数字类型而不要用字符类型
不要使用字符串类型存储日期数据。


2、慎重使用触发器
保持触发器内的代码最小化
可能的情况下尽量用其它更高效的技术替代触发器
尽量避免回滚触发器
3、仅仅返回须要的数据
横向来看,不要返回自己不须要的列,尽量不要使用select *
纵向来看,不要返回自己不须要的行,尽量使用where条件来过滤自己须要的内容
考虑使用TOP
考虑分页
对于聚合查询,能够用HAVING子句进一步限定返回的行。
4、尽量少做反复的工作
控制同一语句的多次运行,特别是一些基础数据的多次运行。
降低多次的数据转换,或许须要数据转换是设计的问题,可是降低次数是能够做到的。
合并对同一表同一条件的多次UPDATE,
UPDATE操作不要拆成DELETE操作+INSERT操作的形式。尽管功能同样。可是性能区别是非常大的。
不要写一些没有意义的查询。
插入大量数据时,尽量不要使用循环,能够使用CTE。假设要使用循环。也放到一个事务中;
5、注意暂时表使用方法
在复杂系统中,暂时表非常难避免。关于暂时表须要注意:
语句非常复杂,连接太多,能够考虑用暂时表分步完毕。
多次用到一个大表的同一部分数据,考虑用暂时表暂存数据。
须要综合多个表的数据,形成一个结果。能够考虑用暂时表分步汇总这多个表的数据。


其它情况下。应该控制暂时表和表变量的使用。
注意排序规则。
关于暂时表产生使用SELECT INTO和CREATE TABLE + INSERT INTO的选择.
6、避免使用游标
对于某些逐行的处理考虑放在client
考虑使用关联的子查询取代游标
必须使用游标时注意下面问题:
使用高效的游标类型(比如 forward-only)
使用server端游标时保持结果集尽量小。


游标使用结束时不能只CLOSE,还要DEALLOCATE。
7、 恰当使用连接
对于频繁连接的表用于连接的列须要有合适的索引
用于连接的列尽量使用同样的数据类型
避免将唯一值非常少的列用过连接列,否则会导致scan
假设有些查询须要对4个或很多其它的表进行连接,能够考虑低范化一些表
8、 其它须要注意的地方
问题发现的越早解决的成本越低,非常多性能问题能够在编码阶段就发现,为了提早发现性能问题,须要注意:
程序猿注意、关心各表的数据量。


编码过程和单元測试过程尽量用数据量较大的数据库測试,最好能用实际数据測试。
每一个SQL语句尽量简单
不要频繁更新有触发器的表的数据
注意数据库函数的限制以及其性能

原文地址:https://www.cnblogs.com/brucemengbm/p/7070842.html