HTML5技术

sql的那些事(一) - Akon_Coder(2)

字号+ 作者:H5之家 来源:H5之家 2017-01-01 12:00 我要评论( )

触发器在开发角度来讲,不知道具体什么时候执行,对于业务来讲不跟代码逻辑一样是显示的呈现,所以导致后期的维护比较困难,所以要处理触发器完成的服务,最好通过服务或者中间件去完成。 例如: 在微信收单的过程

触发器在开发角度来讲,不知道具体什么时候执行,对于业务来讲不跟代码逻辑一样是显示的呈现,所以导致后期的维护比较困难,所以要处理触发器完成的服务,最好通过服务或者中间件去完成。
例如:
在微信收单的过程中,我们销售结账完成以后,需要通过短信向用户手机推送消费消息,这时候用触发器可能就是在结账以后,触发sql触发器,写入一条消息记录到短信表记录,走消息队列,将短信发送出去。

反之,我们采用中间件,就可以将结账以后的记录,发送给消息中间件EasyNetQ,中间件将记录异步写入记录,这样有问题的话,只用确认中间件消息接受和发送的问题。

(13)禁止在查询里指定索引

在sql里面指定索引索引是这样定义的:

SELECT 字段名表 FROM 表名表 WITH (INDEX(索引名)) WHERE 查询条件

如果在搜索的时候,指定了索引搜索,就会导致新建的索引无法生效,假如删除了指定的索引,会导致程序崩溃,所以建议不采用指定索引进行搜索。

(14)变量/参数/关联字段类型必须与字段类型一致

所谓的变量、参数、关联字段类型一致指的是,数据库中是什么类型,那么我们在成程序中传入参数的过程中,建议保持一直,避免在查询的时候,进行类型转换,在大批量数据处理过程中,可能影响性能。
图1类型:(程序中类型)

图二类型:(数据中类型)

图1、图2中字段类型保持一致。

(15)参数化查询

所谓的“参数化SQL”就是在应用程序设置SqlCommand.CommandText的时候使用参数(如:param1),然后通过SqlCommand.Parameters.Add来设置这些参数的值。这种做法会把你准备好的命令通过sp_executesql系统存储过程来执行,使用参数化,最直接的好处就是防止SQL注入。也就是说使用这种方法,主要是为了保证数据库的安全。禁止拼接sql语句。
另外参数化查询有利于数据库查询计划的复用,比如我们查询注册日期大于2015-12-12和注册日期大于2016-12-12不同的店铺记录,我们可能这样写:

select * from T_Account where Regtime>'2015-12-12' select * from T_Account where Regtime>'2016-12-12'

上面两条语句,可以完成我们上面的查询结果集,但是sql查询计划会进行两次分析,导致查询计划不能够复用,如果用参数化查询,则可以复用查询计划:

declare @Regtime datetime; set @Regtime='2015-12-12'; select * from T_Account where Regtime>@Regtime set @Regtime='2016-12-12'; select * from T_Account where Regtime>@Regtime

只需要改变参数的值就可以了。

(16)限制JOIN个数

join表的次数不要过多,写代码的人,看到过多的join表记录都会懵逼,何况数据库了?会导致数据库执行错误的执行计划,影响性能。

(17)关闭影响的行计数信息返回

在sql语句中,可以设置Set NoAccount on,关闭查询受影响的行数,从而减少流量。

(18)除非必要SELECT语句都必须加上NOLOCK

这个是我们经常在开发中忽略的,加上nolock以后,在查询的时候,不锁表。不要只要自己爽,别人也要查询数据的,占这茅坑不拉shi是不好哦。这也是我们内部工程师的必修课提高的。

(19)使用UNION ALL替换UNION

使用union 的时候,必须满足两个表具体相同数目的列。
union all 包含全部的记录,union 包含去除重复后的结果集
Employees_China:
| E_ID| E_Name|
| :-------- | --------:|
| 01| Zhang, Hua|
| 02| Wang, Wei|
| 03| Carter, Thomas|
| 04| Yang, Ming|
Employees_USA:

E_ID E_Name

01 Adams, John

02 Bush, George

03 Carter, Thomas

04 Gates,Bill

使用 UNION 命令 列出所有在中国和美国的不同的雇员名: SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA

结果集:

>

Zhang, Hua

Wang, Wei

Carter, Thomas

Yang, Ming

Adams, John

Bush, George

Gates, Bill

使用 UNION ALL 命令 列出在中国和美国的所有的雇员: SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA

结果集:

>

Zhang, Hua

Wang, Wei

Carter, Thomas

Yang, Ming

Adams, John

Bush, George

Carter, Thomas

Gates, Bill

(20)查询大量数据使用分页或TOP
通过分页批量获取数据,避免全表扫描。
在.Net中,我们可以这样写来分页获取数据,通过分页获取图片数据,进行地址替换操作。

/// <summary> /// 批量替换图片地址 /// </summary> /// <param name="index"></param> /// <param name="size"></param> public static void BatchReplaceImgAddress(int index, int size) { const string strSql = "select Id,AccId,ImgAddress from (select ROW_NUMBER() OVER ( ORDER BY id ) as rownumber,id as Id,accid as AccId,ge_Details as ImgAddress " + "from t_GoodsExtend (nolock) ) as T where rownumber BETWEEN (@index-1)*@size+1 AND @size*@index"; var imgAddressesItems = DapperHelper.Query<ImgAddressModel>(strSql, new { index = index, size = size }).ToList(); if (!imgAddressesItems.Any()) { return; } try { Console.WriteLine("正在处理{0}~{1}条数据:", (index - 1)*size + 1, ((index - 1)*size) + size); foreach (var item in imgAddressesItems) { var imgItem = item; if (string.IsNullOrWhiteSpace(imgItem.ImgAddress)) continue; var imgAddress = imgItem.ImgAddress; const string targetReplaceStr = "baidu.com/umupload"; const string targetNewStr = "baidu.com/mobileweb/detail2"; if (imgAddress.Contains(targetReplaceStr)) { var newImgAddress = imgAddress.Replace(targetReplaceStr, targetNewStr); const string updateImgStrSql = "update t_GoodsExtend set ge_Details = @ge_Details where id= @id"; var updateResult = DapperHelper.Execute(updateImgStrSql, new { id = imgItem.Id, ge_Details = newImgAddress, }); if (updateResult > 0) { var message = string.Format("当前的店铺Id为:{0},处理记录的Id为:{1}", imgItem.AccId,imgItem.Id); Console.WriteLine(message); SimpleLog.Instance.WriteLogForFile("批量替换图片地址日志", message); } } } } catch (Exception ex) { SimpleLog.Instance.WriteLogForFile("批量替换图片地址异常", ex); } BatchReplaceImgAddress(index + 1, size); }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 救火队员的那些事(2) - CC

    救火队员的那些事(2) - CC

    2016-09-07 17:00

  • 回首一年的骚动岁月 - Akon_Coder

    回首一年的骚动岁月 - Akon_Coder

    2016-09-04 16:00

  • 那些年搞不懂的术语、概念:协变、逆变、不变体 - 农码一生

    那些年搞不懂的术语、概念:协变、逆变、不变体 - 农码一生

    2016-08-30 17:00

  • 开源的那些事儿 (一)- 如何看待开源 - LeftNotEasy

    开源的那些事儿 (一)- 如何看待开源 - LeftNotEasy

    2016-08-24 10:00

网友点评
d