sqlserver操作符篇 优化

简介:

1.IN 操作符 在业务密集的SQL当中尽量不采用IN操作符而使用EXISTS

2.NOT IN 操作符 强列推荐不使用

3. <> 操作符 强列推荐不使用 用其它相同功能的操作运算代替 a<>0 改为 a>0 or a<0 ;a<>’’ 改为 a>’’

4. > < 操作符 推荐

5. LIKE 操作符  LIKE %5400% 这种查询不会引用索引,而LIKE X5400%’则会引用范围索引LIKE%5400%’改成YY_BH LIKE X5400% OR YY_BH LIKE B5400% 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

6. IS NULL IS NOT NULL 操作符 不推荐

用其它相同功能的操作运算代替,如a is not null 改为 a>0 a>’’等。

7. UNION 操作符 不推荐

       采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回

8.GROUP BY

9count总结

count(*)count(1)执行的效率是完全一样的。

count(*)的执行效率比count(col)高,因此可以用count(*)的时候就不要去用count(col)

count(col)的执行效率比count(distinct col)高,不过这个结论的意义不大,这两种方法也是看需要去用。

如果是对特定的列做count的话建立这个列的非聚集索引能对count有很大的帮助。

如果经常count(*)的话则可以找一个最小的col建立非聚集索引以避免全表扫描而影响整体性能。

10  hash的时候一定要用小记录集做驱动.
    /小记录集作驱动时读取数据文件的cost两者是一样的.但是前者的记录集在大到一定程度的时候在构建hash桶会产生很多物理读而且这些物理读根本无法消除每次执行都会产生.

1hash联结适合输入和输出都是大型数据集的情况。

     2,联结列必须相等联结,(不相等可以如上方法换成相等联结)

     3,使用较少的表为驱动表。(在使用hash提示联结尤其注意)
 

高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点

a)SQL的使用规范:

i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)count(*)更有效率。

vii. 尽量使用“>=”,不要使用“>”。

viii. 注意一些or子句和union子句之间的替换

ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。

x. 注意存储过程中参数和数据类型的关系。

xi. 注意insertupdate操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。   

 

b)索引的使用规范:

i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。

ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

iii. 避免对大表查询时进行table scan,必要时考虑新建索引。

iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。

v. 要注意索引的维护,周期性重建索引,重新编译存储过程。  

 

c)tempdb的使用规范:

i. 尽量避免使用distinctorder bygroup byhavingjoincumpute,因为这些语句会加重tempdb的负担。

ii. 避免频繁创建和删除临时表,减少系统表资源的消耗

iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert

iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。

v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。

vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。

分类:  SqlServer

本文转自快乐就好博客园博客,原文链接:http://www.cnblogs.com/happyday56/archive/2009/09/10/1564149.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
SQL 数据库 索引
SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
SQLServer没创建一个查询,都相当于创建一个查询会话,在不同的查询分析器里面进行的查询操作,可能会影响别的查询会话。比较典型的一个例子,如果你正在使用事务执行某一张表的插入或者操作而没有正确关闭事务的情况下,会造成别的会话针对该数据表的查
SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
|
SQL 数据库 索引
Sql Server数据库性能优化之索引
最近在做SQL Server数据库性能优化,因此复习下一索引、视图、存储过程等知识点。本篇为索引篇,知识整理来源于互联网。 索引加快检索表中数据的方法,它对数据表中一个或者多个列的值进行结构排序,是数据库中一个非常有用的对象。
1125 0
|
SQL
SQLServer · 最佳实践 · SQL Server优化案例分享
title: SQLServer · 最佳实践 · SQL Server优化案例分享 author: 石沫 请参考:https://yq.aliyun.com/articles/60119
3090 0
|
SQL 数据库 存储
SqlServer性能检测和优化工具使用详细
原文:SqlServer性能检测和优化工具使用详细 工具概要         如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等等,又性能低下,而苦逼的你又要对其优化,那么你该怎么办?哥教你,首先你要知道问题出在哪里?如果想知道问题出在哪里,并且找到他,咱们...
1073 0
|
SQL 存储 数据库
SQL Server数据库性能优化技巧
原文:SQL Server数据库性能优化技巧 查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引; 2、I/O吞吐量小,形成了瓶颈效应; 3、内存不足; 4、网络速度慢; 5、查询出的数据量过大; 6、锁或者死锁; 7、返回了不必要的行和列; 8、查询语句不好,没有优化。
1249 0
|
Go 索引 存储
第十七章——配置SQLServer(4)——优化SQLServer实例的配置
原文: 第十七章——配置SQLServer(4)——优化SQLServer实例的配置 前言: Sp_configure 可以用于管理和优化SQLServer资源,而且绝大部分配置都可以使用SQLServer ManagementStudio的图形化界面实现。
945 0
|
存储 缓存 Go
第十七章——配置SQLServer(3)——配置“对即时负载的优化”
原文: 第十七章——配置SQLServer(3)——配置“对即时负载的优化” 前言:         在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中。
914 0