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语句尽量简单
不要频繁更新有触发器的表的数据
注意数据库函数的限制以及其性能
SQL编码中注意的性能问题的更多相关文章
- 为什么SQL语句Where 1=1 and在SQL Server中不影响性能
最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响. 虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过 ...
- SQL SERVER中一些常见性能问题的总结
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免使用 left join 和 null 值判断.left join 比 in ...
- sql中NVARCHAR(MAX) 性能和占空间分析 varchar(n),nvarchar(n) 长度性能及所占空间分析
varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...
- SQL Server中提前找到隐式转换提升性能的办法
http://www.cnblogs.com/shanksgao/p/4254942.html 高兄这篇文章很好的谈论了由于数据隐式转换造成执行计划不准确,从而造成了死锁.那如果在事情出现之前 ...
- SQL Server中使用Check约束提升性能
在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能. 在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划, ...
- SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题
用户定义函数(UDF)分类 SQL SERVER中的用户定义函数(User Defined Functions 简称UDF)分为标量函数(Scalar-Valued Function)和表值函数(T ...
- SQL Server中一个隐性的IO性能杀手-Forwarded record
简介 最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动.本篇文章分享什么是forwarded record,并从原理上谈一 ...
- SQL Server中多表连接时驱动顺序对性能的影响
本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- 编码中常用的SQL语法
蓝色标注的都是比较常见的SQL ====================== 开发中常见的SQL: left join , right join 防止丢弃数据 inner join CASE WHNE ...
随机推荐
- 解决的方法:mysql_connect()不支持请检查mysql模块是否正确载入
故障现象:linux 安装discuz 错误提示:mysql_connect() 不支持请检查mysql模块是否正确载入. 解决的方法:查看/usr/lib/php/modules/ (64位的看/u ...
- 基于nginx的TCP Proxy实现数据库读写分离
nginx非常早就支持tcp proxy.可是一直不知道其使用,近期在nginx blog上看见了.一些实践者将其运用到数据库訪问的负载均衡以及实现读写分离,来提高数据库的吞吐量,这里我不会讲详细的搭 ...
- 初识cocos2dx——入门第一篇
享受"啪"的按下Enter的快感. (by云风) cocos2dx是不是个toy引擎,不同的人有不同的看法.可是你不得不承认它非常受欢迎.好多非常火的手游使用的就是cocos2dx ...
- python中is与==的差别
# is:比较的是两个对象的id值是否相等,# 也就是比较俩对象是否为同一个实例对象,# 是否指向同一个内存地址 # s = "alex"# abc = id(s) # 得到内存地 ...
- BZOJ 1989 概率相关
思路: 一条边免费的概率为 (经过它的路/总路径条数)^2 DFS即可 有个地方没有用 long long炸了好久- //By SiriusRen #include <cstdio> us ...
- POJ 3180 Tarjan
题意:找强连通中点数大于2的强连通分量个数 思路:Tarjan // By SiriusRen #include <cstdio> #include <algorithm> u ...
- Win32 CRT and MFC 清单文件.manifest配制
Demo.exe.manifest <?xml version="1.0" encoding="UTF-8" standalone="yes&q ...
- jmeter的认识——线程组的认识
名称:可以给线程组设置一个个性化的命名 注释:可以对线程组添加备注以标记 在取样器错误后要执行的动作:就是在错误之后要如何执行,可选继续执行后续的.停止执行等. 线程数:就是需要设置多少线程执行测试. ...
- 五分钟DBA:浅谈伪分布式数据库架构
[IT168 技术]12月25日消息,2010互联网行业技术研讨峰会今日在上海华东理工大学召开.本次峰会以“互联网行业应用最佳实践”为主题,定位于互联网架构设计.应用开发.应用运维管理,同时,峰会邀请 ...
- deploy sql clr
1, create strong signed key file 2, create asymmetric key