数据库|快速提升性能的SQL语句,建议收藏( 二 )


18、一些 SQL 查询语句应加上 nolock , 读、写是会相互阻塞的 , 为了提高并发性能 。 对于一些查询 , 可以加上 nolock , 这样读的时候可以允许写 , 但缺点是可能读到未提交的脏数据 。
使用 nolock 有3条原则:

  • 查询的结果用于“插、删、改”的不能加 nolock;
  • 查询的表属于频繁发生页分裂的 , 慎用 nolock ;
  • 使用临时表一样可以保存“数据前影” , 起到类似 Oracle 的 undo 表空间的功能 , 能采用临时表提高并发性能的 , 不要用 nolock 。
19、常见的简化规则如下:
不要有超过 5 个以上的表连接(JOIN) , 考虑使用临时表或表变量存放中间结果 。 少用子查询 , 视图嵌套不要过深 , 一般视图嵌套不要超过 2 个为宜 。
20、将需要查询的结果预先计算好放在表中 , 查询的时候再Select 。 这在SQL7.0以前是最重要的手段 , 例如医院的住院费计算 。
21、用 OR 的字句可以分解成多个查询 , 并且通过 UNION 连接多个查询 。 他们的速度只同是否使用索引有关 , 如果查询需要用到联合索引 , 用 UNION all 执行的效率更高 。 多个 OR 的字句没有用到索引 , 改写成 UNION 的形式再试图与索引匹配 。 一个关键的问题是否用到索引 。
22、在IN后面值的列表中 , 将出现最频繁的值放在最前面 , 出现得最少的放在最后面 , 减少判断的次数 。
23、尽量将数据的处理工作放在服务器上 , 减少网络的开销 , 如使用存储过程 。
存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的 SQL 语句 , 是控制流语言的集合 , 速度当然快 。 反复执行的动态 SQL , 可以使用临时存储过程 , 该过程(临时表)被放在 Tempdb 中 。
24、当服务器的内存够多时 , 配制线程数量 = 最大连接数+5 , 这样能发挥最大的效率;否则使用配制线程数量< 最大连接数 , 启用 SQL SERVER 的线程池来解决 , 如果还是数量 = 最大连接数+5 , 严重的损害服务器的性能 。
25、查询的关联同写的顺序 :
select a.personMemberID * from chineseresume apersonmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B B = '号码')
select a.personMemberID * from chineseresume apersonmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B B = '号码' A = '号码')
select a.personMemberID * from chineseresume apersonmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = '号码' A = '号码')

26、尽量使用 EXISTS 代替 select count(1) 来判断是否存在记录 。 count 函数只有在统计表中所有行数时使用 , 而且 count(1) 比 count(*) 更有效率 。
27、尽量使用 “>=” , 不要使用 “>” 。
28、索引的使用规范:
  • 索引的创建要与应用结合考虑 , 建议大的 OLTP 表不要超过 6 个索引;
  • 尽可能的使用索引字段作为查询条件 , 尤其是聚簇索引 , 必要时可以通过 index index_name 来强制指定索引;
  • 避免对大表查询时进行 table scan , 必要时考虑新建索引;
  • 在使用索引字段作为条件时 , 如果该索引是联合索引 , 那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引 , 否则该索引将不会被使用;
  • 要注意索引的维护 , 周期性重建索引 , 重新编译存储过程 。
29、下列 SQL 条件语句中的列都建有恰当的索引 , 但执行速度却非常慢:
SELECT * FROM record WHERE substrINg(card_no 1 4) = '5378' --13秒