标签归档:sql优化

mssql sqlserver 影响sql脚本性能的因素


摘要:
下文将讲述影响sql脚本性能的相关因素,如下所示:



索引应用

1.sql检索脚本上where过滤列是否加入合理索引
2.数据表突然增大,导致索引计数不准确,查询计划走错索引
3.过滤列上加入函数,导致过滤条件未走索引 where dbo.fun(test) >88



循环处理处理

循环处理是否涉及大循环(大遍历)
循环尽量采用不锁表的方案(结合实际业务),避免循环的时候出现锁表,导致死循环



临时表与表变量

使用临时表或表变量时,先预估表大小。
在sqlserver中 表变量不受事务控制,写入数据的效率比临时表高;
表变量不会产生计数信息,sqlserver无法预估查询开销,
如果临时表参与数据查询时,我们建议使用临时表作为数据缓存(因为查询分析器可以自动选择最优方案)



其它注意事项

尽量使用短sql
尽量使用短事务
返回可用数据,尽量不返回无需使用的数据占用服务器带宽和网络压力
select 查询中少用 “不等于” 或”not” 这种关键字
sql脚本中不做无用的排序操作
不向客户端返回过多无用的数据
使用联接代替exists(和in)
减少or条件的写法,多使用union all

mssql sqlserver 优化查询语句的方法分享


摘要:
在erp系统中,插入操作往往是性能最好的sql语句, 通常性能瓶颈会发生在select 查询语句中,下文将讲述select的调优方法,如下所示:
实验环境:sql server 2008 R2



一、索引是否合理,是否存在缺失索引

我们可通过查询计划,获取出缺失的索引,然后建立合适的索引,将索引信息中包含合适的列信息,避免出现rid二次查找。
查看执行计划,采用hint指定select所使用的索引。

1.1 表中主外键都应加上索引
1.2 索引尽量建立在数据量小的字段上
1.3 频繁操作的表上,不要建立过多的索引
1.4 定期检查索引的使用情况及系统缺失索引的情况
1.5 复合索引字段尽量少于4个字段


二、限制返回合理的数据行和数据列

返回所需的数据列,禁止使用*返回所有列
在数据表的连接上,尽量使用小表连接大表
删除检索中的计算字段,减轻数据库服务器的压力,使数据库服务器性能达到最佳
检查服务器内存是否能装载下”单表数据”,是否符合当前业务场景
检查服务器硬盘速度是否够快

三、调整业务模式

3.1 调整业务数据存储,使业务数据存储满足报表需求
3.2 制作报表系统,将业务数据转换为报表所需的数据格式,减少检索时的压力,提升select的查询速度

mssql sqlserver 查询性能分析的方法分享


摘要:
下文讲述sqlserver中查询性能分析的方法,如下所示:
实验环境:sql server 2008 R2


在sqlserver中查询相关的性能,我们通常采用查询sql脚本的运行参数,通过对参数的对比和分析,得出相应的结果,如下所示:
例:

—打开查询分析器:
—输入以下命令,避免由于数据缓存对查询结果产生差异
dbcc dropcleanbuffers –清除数据
dbcc freeproccache –清除缓存
set statistics io on — 统计执行资源消耗
set statistics time on –统计执行时间消耗
—输入sql脚本
select top 888888 * from [sqlTableName]
—消息框产生如下信息:
—sql编译时间 运行时间
CPU time = 0 ms, elapsed time = 0 ms.
(888888 row(s) affected)
表 ‘sqlTableName’。扫描计数 1,逻辑读取18801次,物理读取 32 次,预读 16320次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
sql 执行时间:
CPU time = 1532 ms, elapsed time = 13021 ms.
—在返回值说明中,
我们需着重优化 逻辑读取次数,逻辑读取次数代表我们从内存中获取数据的次数,获取次数越少,代表消耗的IO越小,此参数优化的越小,sql脚本的性能越优化
物理读取次数:通常在系统第一次加载数据时,次数会增加,后期系统数据被缓存至数据库中时,物理读取次数会越来越小, 如果此值居高不下,说明系统内存不足,或者查询业务设计存在一定的问题(都是大报表)。
CPU Time:cpu执行时间
elapsed time:执行等待时间(包含IO 等待 网络等待…)
两个加起来会总执行时间
此执行时间的优化,通常我们需结合实际情况,例:服务器是否繁忙,硬件是否高效,上面运行的服务是否多,等等。


综上所述:
我们应尽量减少扫描次数
减少逻辑读取次数
减少物理读取次数
减少CPU执行时间