日度归档:2019年9月28日

.Net后台代码运行”sql查询或存储过程”–经常出现超时该如何处理?


摘要:
下文讲述.net后台代码运行一个超级大的存储过程时,经常会出现超时的处理方法分享,如下所示
实验环境:sql server 2008 R2


项目背景:
这是一个运行了三十年的系统,由于项目的多次迭代,里面的即时库存查询涉及非常多的功能,运行起来非常耗时,经常出现运行超时现象产生,前台用户经常无法获取数据,下文将记录我们部门对此次异常的处理方案。

步骤1:优化业务

由项目经理同用户谈:
由于即时库存随着系统功能增多及计算的复杂,系统必须关闭此功能的实时数据查询功能,将此功能修改为预约模式(界面中,用户点击查询报表,系统将自动将此申请放入后台,然后由后台的数据库作业分批生成报表所需数据),用户需间隔一段时间,去提取报表界面自动下载报表所需数据(excel)。
此种方式,可以避免前台程序出现超时现象,导致用户体验急剧下降,增加系统使用快感。

步骤2:修改系统

2.1 将查询界面的报表查询功能修改为:
向系统发送一个数据提取的命令(附带各查询参数)
2.2 设置一个sql作业去定时运行这些数据库命令(可通过业务评估来设置作业的运行间隔时间)
2.3 另开发一个报表提取界面,下载所有报表

mssql sqlserver高并发下处理策略分享


摘要:
下文将讲述sqlserver针对高并发的一些处理思路及方法分享,下面的有些方案目前已经运用到线上系统


这是一个实时电商交易系统,底层数据库使用的是sqlserver,在高并发实时交易系统中,我们必须做到快速的将实时交易数据,写入到sqlserver数据库上,下面将分享我们项目中对此问题的处理方法,如下所示:

处理方法1:
分库分表

将用户的交易记录,按照用户编号“均匀分布”存储到不同的数据库中,在APP 和 DB的连接中使用“数据路由连接中间件”,使sql脚本发送到指定的数据库上,这样可以使数据库的压力控制在合理的范围(因为一个用户不可能有大量的并发),并且一个用户所在组的异常不会导致整个系统崩溃。

处理方法2:
读写分离

将report和读操作分布到专用的读服务器上,或一些报表服务器上,这种操作方式,可以有效的避免读操作占用大量的IO和影响业务数据的写入性能。

通过以上操作,可以使正常用户进行合理的数据访问,避免由于用户量大而导致的异常产生。

mssql sqlserver 数据检索时 扫描次数(“Scan count”)太高的优化方法分享


摘要:
下文讲述sqlserver数据库查询数据时,scan count过高的处理方法分享,如下所示:
实验环境:sql server 2008 R2


原SQL语句如下:

SELECT  a.*
FROM tableName a WITH(NOLOCK)  
INNER JOIN tableNameExtend  b WITH(NOLOCK) 
   ON a.keyId=b.keyId   
WHERE a.writeDate >@d   
ORDER BY a.writeDate DESC 

针对以上的脚本可以使用以下的优化方法:

优化方法1:
将inner join 修改为exists

   SELECT  a.*
FROM tableName a WITH(NOLOCK)  
 
INNER JOIN tableNameExtend  b WITH(NOLOCK) 
   ON a.keyId=b.keyId   
WHERE 
  exists (select null from tableNameExtend b with(nolock) 
          where b.keyId = a.keyId 
         ) 
 and a.writeDate >@d   
ORDER BY a.writeDate DESC 


优化方法2:
针对表a,进行相关设置

针对表a中的keyId和writeDate设置相关的索引

优化方法3:
针对表a,返回信息进行处理

3.1:检测返回数据是否包含 大字段 text image
3.2:将a.*换成 a.field1,a.field2 …
3.3:将a.*返回的行数进行限制
3.4:剔除排序字段,检测一下数据检索的速度


相关阅读:
mssql sql server 限制返回结果行数的三种方法