SQL Server性能调优--优化建议(二)
序言
优化建议
库表的合理设计对项目后期的响应时间和吞吐量起到至关重要的地位,它直接影响到了业务所需处理的sql语句的复杂程度,为提高数据库的性能,更多的把逻辑主外键、级联删除、减少check约束、给null字段添加default值等操作放到了程序端;就如,虽然修改存储过程有时候可以避免发布程序,但过多的逻辑判断也随之带来了性能问题;所以出发点不同取其平衡就好。
优化sql语句最基本的原则就是将sql语句简单化,将一个复杂的sql语句拆解执行,如图可以看出我们所执行的sql语句都是经过查询优化器分析得到高效的执行计划,那么简单的sql语句很大程度上提高了执行效率。
1、select
对于实时性不强的数据可以使用with (nolock),使用强制索指导执行计划。
select * from Person.Person with (nolock) select * from Person.Person with (index(PK_Person_BusinessEntityID))
View Code
避免子查询(先将子查询里面的内容提取出来作为一个临时表,再次join的时候就快了)
select * from Person.Password where BusinessEntityID in (select BusinessEntityID from Person.Person where FirstName='Ken'); --替换为 with tb(BusinessEntityID) as (select BusinessEntityID from Person.Person where FirstName='Ken') select * from Person.Password where exists(select 1 from tb where BusinessEntityID=Person.Password.BusinessEntityID);
View Code
2、where
导致index scan或table scan
select * from tb where like '%value%' -- like 'value%' select * from tb where colum1<>0 select * from tb where colum1=1 or colum2=2 --colum1或colum2没有索引则导致全表扫描 --尽量使用exists代替in select * from tb1 where colum in (select colum from tb2); -- select * from tb1 where exists(select 1 from tb2 where colum=tb1.colum);
View Code
在有索引的字段中避免使用函数和表达式,导致索引无法使用
select * from tb where datediff(mm,'2015-1-1',colum1)=1; select * from tb where substring(colum1,1,6)='value';
View Code
3、join
--join连接最好不要超过5个表,有更新的大数据表先放进临时表,然后再join select BusinessEntityID,FirstName into #tmptable from Person.Person; select * from Person.Password,#tmptable where Person.Password.BusinessEntityID=#tmptable.BusinessEntityID drop table #tmptable
View Code
4、insert
--批量插入数据,select into一定比逐条insert快 insert into tb values(colum1,colum2,colum3),(colum1,colum2,colum3),(colum1,colum2,colum3); --文件批处理bulk insert和openrowset https://technet.microsoft.com/zh-cn/library/ms188365(v=sql.105).aspx
View Code
5、procedure,存储过程优点是执行速度快,因为它是预编译过的,并且执行之后会缓存到plan cache中。
6、漏洞注入,动态语句参数化查询时不要忘记sp_executesql代替exec
create proc proc_xxx @addressid int, @city nvarchar(16) as begindeclare @sql nvarchar(1148);set @sql='select * from (select *,num=(row_number() over(order by AddressID asc)) from Person.Address where 1=1';if(@city<>'')beginset @sql=@sql+' and City like @city';endif(@addressid<>0)beginset @sql=@sql+' and ID=@addressid';endset @sql=@sql+' ) A where A.num between @sindex and @eindex';exec sp_executesql @sql,N'@city nvarchar(64),@addressid int,@sindex int,@eindex int',@city,@addressid,@sindex,@eindex; end
View Code
索引优化
1、创建索引的关键在于减少sql语句执行时的逻辑读取次数,逻辑次数读取越少,执行所需的内容和cup时间也越少,则sql语句执行的越快;如果逻辑读取次数过大,返回数据较少则需考虑索引优化。
set statistics io on go select * from Production.WorkOrder where WorkOrderID=1 go set statistics io off --表 'WorkOrder'。扫描计数 0,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
View Code
2、分析所缺少的索引,通过语句查询自从上次SQL Server服务重启之后到当前时间为止全部数据库中可能缺少哪些索引。
select b.name , --数据库名称a.statement , --缺少索引表的名称a.equality_columns , --经常用于等值比较的列名,如 ID=valueinequality_columns , --经常用于不等值比较的列名,如 ID>value ID<>valueincluded_columns --建议在索引中涵盖或者包含的列 from sys.[dm_db_missing_index_details] ajoin sys.databases b on a.database_id = b.database_id
View Code
3、分析索引的使用情况,通过语句查询自从上次SQL Server服务重启之后到当前时间为止数据库中所有索引的使用情况。
a、seek过少,而scans或update过大,证明索引不被经常使用,而是用于修改和全表扫描,那么就可以考虑删除此索引了;
b、seek过多,而scans和update也过大,维护索引成本较高,就要考虑权衡利弊了。
--更新表索引的统计信息 update statistics tablename with fullscanselectdb_name() as DBNAME, --数据库名称object_name(a.object_id) as table_name, --表名称coalesce(name,'object with no clustered index') as index_name, --索引名称type_desc as index_type, --索引类型user_seeks, --使用索引查询的次数user_scans, --使用全表扫描的次数user_lookups, --使用书签的次数,使用书签会造成二次IO,考虑是否加入非聚集索引user_updates --索引的更新次数 from sys.dm_db_index_usage_stats a inner join sys.indexes b on a.index_id = b.index_id and a.object_id = b.object_id where database_id = db_id('AdventureWorks2008')
View Code
资料
Sql Server优化之路
转载于:https://www.cnblogs.com/cnki/p/11239158.html
SQL Server性能调优--优化建议(二)相关推荐
- SQL Server 性能调优(cpu)
SQL Server 性能调优(cpu) 研究cpu压力工具 perfom SQL跟踪 性能视图 cpu相关的waitevent Signal wait time SOS_SCHEDULER_YIEL ...
- SQL Server 性能调优3 之索引(Index)的维护
SQL Server 性能调优3 之索引(Index)的维护 热度1 评论 16 作者:溪溪水草 SQL Server 性能调优3 之索引(Index)的维护 前言 前一篇的文章介绍了通过建立索引来提 ...
- SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践
SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践 前言:自从上一篇文章发出之后,收到了很朋友的关注.很多朋友要求多多实践,而不是纯粹的理论.确实,从打算出这个系列开始,我就本 ...
- SQL Server 性能调优(方法论)
SQL Server 性能调优(方法论) 目录 确定思路 wait event的基本troubleshooting 虚拟文件信息(virtual file Statistics) 性能指标 执行计划缓 ...
- sql server 性能调优之 资源等待 LCk
一. 概述 这次介绍实例级别资源等待LCK类型锁的等待时间,关于LCK锁的介绍可参考 "sql server 锁与事务拨云见日".下面还是使用sys.dm_os_wait_sta ...
- 读SQL Server性能调优实战——陈畅亮、吴一晴著
sqlserver 微软 安装 根据业务特点来考虑 1.分析产品业务数据的增长量 预估某些关键业务数据在一定时间内的增长量,预估数据在未来的增长数据, 2.了解产品业务操作类型.考虑业务是以查询为主还 ...
- SQL Server性能调优入门(图文版)
第一步,在业务高峰期抓取样本数据(2个小时左右).采用的工具是sqlserver自带的profiler,也叫事件探查器,如下图: 进入后,点击最左面的按钮,建立一个新的跟踪: 登录需要用DBO权限,所 ...
- SQL Server性能调优:资源管理之内存管理篇(上)
http://www.cnblogs.com/caspnet/archive/2011/02/21/1959539.html 对SQL Server来说,最重要的资源是内存.Disk和CPU,其中内存 ...
- SQL Server 性能调优(内存)
存储引擎自调整 sql server 是如何分配内存的 32bit地址空间的限制 用户模式vas分配和virtualalloc 非boffer pool 分配内存(保留内存) VAS调整 AWE 启动 ...
最新文章
- CNN边缘检测--Richer Convolutional Features for Edge Detection
- Matlab Robotic Toolbox V9.10工具箱(四):常用函数
- Java判断一个数是否是回文数
- [Leetcode] Flatten Binary Tree to Linked List 整平二叉树
- 重装系统后sqlserver安装失败_Windows 10八月更新再遇尴尬:安装失败 或安装后随机重启...
- 网络知识:DNS 访问原理详解
- sql server:查詢系統表
- 图像处理包magick - R版的PS - 学习笔记
- Java 帝国对 Python 的渗透能成功吗?
- 非参数统计的Python实现——符号检验
- 实现mac状态栏图标的隐藏
- 登录模板源码 : bootstrap风格
- Could not find artifact pom:2.0.0 in public
- UE4使用MixAmo中的角色与动画
- 在我们使用vue-admin-templete进行二次开发的时候,我们会发现有些是英文,比如分页里面的每页尺码。
- C#封装的websocket协议类
- 十款经典php网店系统
- php分库分表技术,谈谈关于分库分表的方案
- FMC子卡设计原理图:141-四路 250Msps 16bits AD FMC子卡 模拟信号、无线电、光电的采集场景
- matlab读s2p文件,s2p文件查看工具_s2p文件查看器(SPview III)下载 v3.53官方版 - 121下载站...
热门文章
- 学堂在线计算机网络工程实践答案,计算机网络实验(本科生2017年春)
- java.sql找不到_java.sql.SQLException:找不到适用于jdbc:microsoft:
- 2台电脑一根网线传文件_黑龙江工程专用网线报价,黑电源线配件厂家
- 比特大爆炸为啥老显示服务器满,《有可能是史上最长停服维护公告》
- 环回测试能够提供什么信息_以太网测试仪的主要功能有哪些?
- php试题多选,php考试题 (选择题).doc
- svn关键字替换_SVN关键字替换示例
- selenium 示例_Selenium findElement和findElements示例
- java join字符串_Java字符串join()
- unix和linux命令_Linux / Unix系统中SSH命令的用法