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、避免使用游标
对于某些逐行的处理考虑放在client
考虑使用关联的子查询取代游标
必须使用游标时注意下面问题:
使用高效的游标类型(比如 forward-only)
使用server端游标时保持结果集尽量小。
游标使用结束时不能只CLOSE,还要DEALLOCATE。
7、 恰当使用连接
对于频繁连接的表用于连接的列须要有合适的索引
用于连接的列尽量使用同样的数据类型
避免将唯一值非常少的列用过连接列,否则会导致scan
假设有些查询须要对4个或很多其它的表进行连接,能够考虑低范化一些表
8、 其它须要注意的地方
问题发现的越早解决的成本越低,非常多性能问题能够在编码阶段就发现,为了提早发现性能问题,须要注意:
程序猿注意、关心各表的数据量。
编码过程和单元測试过程尽量用数据量较大的数据库測试,最好能用实际数据測试。
每一个SQL语句尽量简单
不要频繁更新有触发器的表的数据
注意数据库函数的限制以及其性能
相关文章
- 编码表的概述和常见编码表
- Dart: 编码和解码各种存档和压缩格式
- Python中的编码与解码(转)
- python2.X编码
- 编码的理论知识-小结
- requests爬虫get请求三部曲(快速编码)-小结
- SQL编码中注意的性能问题
- Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode 1.1. 不个网页title保存成个个文件的时候儿有无效字符的问题...1
- Atitit 算法之道 attilax著 1. 编码算法3 1.1. Base64 htmlencode urlencode3 2. Ui方面的算法3 2.1. 软键盘算法 计算软键盘上下
- Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结
- ZZNUOJ_用C语言编写程序实现1216:简单编码(附完整源码)
- TF之Transformer:基于tensorflow和Keras框架(特征编码+Tokenizer处理文本+保存模型)针对UCI新闻数据集利用Transformer算法实现新闻文本多分类案例
- 有了它,Python编码再也不为字符集问题而发愁了!
- java GBK字符转换成为UTF-8编码字符
- MySql数据库SQL语句将编码