月度归档:2018年10月

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执行时间

mssql sqlserver 连接数据引擎“超时时间已到”异常提示


摘要:
在sql server连接中,出现“超时时间已到”的异常现象,下文将出现“超时时间已到”可能的原因描述如下



常见的错误现象:

1. 使用SSMS(SQL Server Management Studio)连接服务器时,出现“无法连接到 <****>”;
2.超时时间已到。在操作完成之前超时时间已过或服务器未响应;
3.使用 sqlcmd命令输入相关sql命令,出现的超时错误包括:
“SQL 网络接口: 定位指定的服务器/实例时出错”
“Sqlcmd: 错误: Microsoft SQL Server Native Client : 客户端无法建立连接。”
“Sqlcmd: 错误: Microsoft SQL Server Native Client : 登录超时时间已到。”
“无法与 SQL Server 建立连接”
“建立与服务器的连接时出错。当连接到 SQL Server 时,此故障可能会因为 SQL Server 在默认设置下不允许进行远程连接而引发的。”

常见原因及解决方法:

原因 解决方法
服务器名称输入错误 调整服务器名称,重新测试
服务器上sql服务未启动 启动服务器上sql服务
服务器上数据库所对应的端口被防火墙阻止 配置防火墙所对应的规则
sql引擎对外服务器的端口被更改 连接sql引擎时,指定相应的端口访问sqlserver引擎
1434端口被阻止,导致sqlserver browser服务无法对外服务 防火墙配置为允许访问1434端口
客户端和服务器上使用不同的网络协议 通过 SQL Server 配置管理器,将客户端和服务器调整为相同的网络协议
服务器名称无法协议为IP 调整客户端名称解析或直接使用ip访问
客户端和服务器端网络不通 修复网络或联系网络管理员调整网络
服务器上有多个IP

使用sqlserver配置管理器指定一个IP为数据库引擎访问的ip地址

mssql sqlserver select查询原理分析


摘要:
下文将讲述sqlserver中select的查询原理,如下所示:
实验环境:sql server 2008 R2



1.表查询的原理

select 列名
from 表名
[ where 查询条件]

select查询语句的原理,首先根据from 关键字找出相应的表,并将表装载至内存中,然后把相关where查询条件装载至内存,根据表名和where条件对表数据进行检索,形成相应的虚拟表(worktable),再根据待返回列名,返回相应的列给用户。


例:
SELECT *
FROM [testTable]
WHERE [列] = ‘maomao365.com’;

sql server引擎先找到select 谓词,然后将表testTable加载至内存中,然后循环表,从第一条记录开始查找,检测到[列]值等于’maomao365.com’,

依次循环检测表,至到将整张表检索完毕,将检索完毕的数据装载至虚表中,然后再将虚拟表中符合条件的列返回给客户端用户。

例2:
SELECT *
FROM [testTable]
WHERE EXISTS
(SELECT *
FROM [testTable2]
WHERE [testTable2].KeyId = [testTable].KeyId );

下文是一个sql exists嵌套查询操作,

sqlserver引擎循环检索 testTable时,需 同时将testTable2装载至内存进行遍历检测,类似于开发语言中的

for()

{

for()

{}

}

最后将符合条件的虚拟表返回给客户端用户。