SQL编码中注意的性能问题
来源:互联网 发布:光学画图软件 编辑:程序博客网 时间:2024/04/30 17:34
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、避免使用游标
对于某些逐行的处理考虑放在客户端
考虑使用关联的子查询代替游标
必须使用游标时注意以下问题:
使用高效的游标类型(例如 forward-only)
使用服务器端游标时保持结果集尽量小。
游标使用结束时不能仅仅CLOSE,还要DEALLOCATE。
7、 恰当使用连接
对于频繁连接的表用于连接的列需要有合适的索引
用于连接的列尽量使用相同的数据类型
避免将唯一值很少的列用过连接列,否则会导致scan
如果有些查询需要对4个或更多的表进行连接,可以考虑低范化一些表
8、 其他需要注意的地方
问题发现的越早解决的成本越低,很多性能问题可以在编码阶段就发现,为了提早发现性能问题,需要注意:
程序员注意、关心各表的数据量。
编码过程和单元测试过程尽量用数据量较大的数据库测试,最好能用实际数据测试。
每个SQL语句尽量简单
不要频繁更新有触发器的表的数据
注意数据库函数的限制以及其性能
为列选择最小化的数据类型
如果一列中的文本长度不一,使用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、避免使用游标
对于某些逐行的处理考虑放在客户端
考虑使用关联的子查询代替游标
必须使用游标时注意以下问题:
使用高效的游标类型(例如 forward-only)
使用服务器端游标时保持结果集尽量小。
游标使用结束时不能仅仅CLOSE,还要DEALLOCATE。
7、 恰当使用连接
对于频繁连接的表用于连接的列需要有合适的索引
用于连接的列尽量使用相同的数据类型
避免将唯一值很少的列用过连接列,否则会导致scan
如果有些查询需要对4个或更多的表进行连接,可以考虑低范化一些表
8、 其他需要注意的地方
问题发现的越早解决的成本越低,很多性能问题可以在编码阶段就发现,为了提早发现性能问题,需要注意:
程序员注意、关心各表的数据量。
编码过程和单元测试过程尽量用数据量较大的数据库测试,最好能用实际数据测试。
每个SQL语句尽量简单
不要频繁更新有触发器的表的数据
注意数据库函数的限制以及其性能
0 0
- SQL编码中注意的性能问题
- SQL编码中注意的性能问题
- SQL注意的性能问题
- 英文版SQL Server 2008使用时,字段中存在中文的要注意编码问题
- T-SQL 编码时应该注意的10个问题
- 做sql性能测试时要注意的小问题
- servlet中设置编码应注意的问题
- servlet过滤器中应该注意的字符编码问题
- 编码过程中应该注意的问题汇总
- 编码要注意的问题
- android高性能编程中需要注意的问题
- android高性能编程中需要注意的问题
- 性能测试中SQL引起的性能问题
- SQL SERVER中关于NULL应注意的问题
- CMS access转sql中注意的问题
- EXCEL导入SQL数据库中应注意的问题
- SQL中使用LIKE查询注意的问题
- SQL SERVER中关于NULL应注意的问题
- Java 枚举7常见种用法
- c语言中static的用法详细示例分析发布
- apk相关文章
- 丈夫中数刀 妻子遭割喉
- c++ founction object
- SQL编码中注意的性能问题
- 出租半夜回家客源多是IT程序员 白领加班成潜规则
- Linux输入子系统:事件的编码 -- event-codes.txt
- ASP.NET MVC 5 入门指南汇总
- 用计算器(程序员)计算IP地址
- SQL临时表的创建+查询
- HTTP协议的详细解释
- sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- iOS常用加密方法(aes、md5、base64)