数据库相关经验

  1. SQL语句写left join等表连接的时候要注意连接条件,一对一的关系要把关联条件写完整,避免产生一对多的错误,这是很多新人容易踩的坑,这个地方写的时候一定要仔细。这种错误主要出现在报表的查询语句,还有看板后端脚本,开发报表的时候还有看板数据获取时要仔细,要自己测一遍看数据有没有问题。
  2. 不能直接对子查询进行group by操作,可以通过其他表关联子查询或者把子查询写成with子句进行group by操作。
  3. SQLServer通过数据库链接访问MySQL数据库的配置。需要注意的是,安装的MySQL驱动要与SQLServer位数一致,都32位或都64位。要使用select * from openquery(数据源,sql)的方式做查询。
  4. MySQL的with子句需要在with后加上recursive,MySQL不能使用也不需要with(nolock),isnull要用ifnull代替。简单场景不建议使用with子句。
  5. 数据库链接MySQL时要注意MySQL的时间小数点后7位,SQLServer时间小数点后只有3位,从MySQL获取的时间字段要先截取才能存入SQLServer。
  6. 数据库链接服务器使用需要注意的问题: 当链接服务器不在线时(关机),执行链接数据库的语句会等待将近一分钟的时间才反馈执行失败,因为有登录超时时间。所以在执行相关语句前要先判断链接服务器能否ping通,通过代码执行cmd命令ping链接服务器地址。这里还是存在一个超时时间,我们要把ping的超时时间设置小一点。以lua脚本为例。 local code = os.execute("ping -n 2 -w 100 192.168.1.184") 这是设置发送两个数据包,每个数据包超时时间100毫秒。code为0表示地址是通的,code为1表示地址不通。 当代码里判断code为0时,才去执行链接数据库的SQL。 对接其他系统的数据库基本上不需要判断ping,因为发生断线的概率很小,而ping会消耗一些时间。如果确实需要,可以通过服务端自动脚本去ping,写入Redis作为判断依据。设备工控机上的数据库是需要做连接判断的,因为设备关机的时候,工控机通常也是关机的。
  7. 判断字符串是否可转numeric,可以用SQLServer自带的函数isnumeric去判断,比如isnumeric('100.3')=1说明可以转换,isnumeric('aaa')=0说明不可转换,用replace函数去判断不严谨也容易出问题。
  8. 查询选择节点的所有子节点,尽量不使用递归查询。可以查全部数据然后用CTNTreeUtil的getSub(id,help)方法,自己写递归方法去遍历可能性能太差。
  9. 查询条件或关联条件最好不要出现比如isnull(is_delete,0)=0这种,很影响性能。设计表的时候字段默认值0可以避免这个问题。如果表比较大,并且存在很多null值了,就不好通过update语句批量修改了,那就写成(is_delete=0 or is_delete is null),这种写法对性能影响不大。
  10. 查询本周的所有日期
    select convert(varchar(10),dateadd(dd,number,DATEADD(week,DATEDIFF(week,0,getdate()),0)),120) as dt from master..spt_values
    where type='P' and dateadd(dd,number,DATEADD(week,DATEDIFF(week,0,getdate()),0))<=DATEADD(week,DATEDIFF(week,0,getdate()),6)
    
Copyright © TouchNet 2015 all right reserved,powered by Gitbook最后修订时间: 2022-06-21 09:21:02

results matching ""

    No results matching ""