您当前的位置: 首页 >  数据库

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

数据库使用误区小结

寒冰屋 发布时间:2019-09-09 22:19:05 ,浏览量:0

这里主要针对sql server数据库进行说明,记录平时工作、学习中相关要点,也是抛砖引玉,希望大神多多指导。

 

1、插入数据的时候,尤其是单行,建议不用*,而是具体写出列名称。这样后期如果由表的字段变动,也可以方便快速查找问题原因。

2、慎重使用delete,尤其是上线后的数据库。虽然使用delete确实效果明显,但是可能会带来各种灾难性的后果。

3、关于count的争议,count(*),count(1),count(列名)到底该使用哪个?答案是count(*)。count(*)是SQL92定义的标准统计数的方法。记得由看到一篇文章说,阿里巴巴开发规范中强制使用count(*)。至于有人说count(*)没有count(1)效率高。看到过一个测试说,一个张包含3300万数据的表进行测试,发现两中方式的消耗时间都是3~4秒。

4、小心单行子查询返回多行的问题,如

select * from emp where job= (select job from emp a where a.job = emp.job)

5、sql server 是不支持分组函数的嵌套使用的,如

select avg(sum(sal)) from emp group by deptno

如果要使用,需要将第一个分组函数写入临时表,在对临时表进行分组,如

select avg(sal) from (select sum(sal) as sal from emp grou by deptno) a; 

6、小心使用not in。not in 的意思即条件字段的值不会出现在子查询的结果集中,也就是不等于任何一个结果集中的值。条件字段的值会与子查询中的所有值逐一对比,当结果集中存在空值时,不等于null是永远不成立的,这就造成了查询不到任何结果。所有,一旦not in后跟的结果集中含有null,就查询不到任何记录。而in是不会出现这种问题的,因为in只要找到一个满足的条件就可以了。

7、慎重使用with(nolock)。众所周知,默认情况下sql server数据库update是会引起select阻塞的。所有很多开发人员系统使用with(nolock),这样就可以查询数据而不会引起阻塞,但是这样会造成数据库脏读。请静心想想,任何事情都是有代价的。

8、视图在项目中使用的还是很普遍的,基本上都是专供查询使用。对视图进行更新能不能成功,主要是看要更新的视图的记录是否能够在基表中找到对应记录,找到则可以更新,否则不行,这与视图是基于单一表创建还是多张表创建没有关系。但是,在不明确的情况下,我还是建议不要通过视图进行数据更新操作。

9、在查询中使用null判断、or、、函数都会造成全表扫描,从而使索引失去作用。而且全表扫描不仅仅是查询效率低的问题,有时候甚至会造成系统的大面积阻塞。

10、对于组合索引,如用字段deptno和sal作为组合索引,其中deptno在前,sal在后。当对两个字段同时使用和仅使用deptno,可以进行索引;而单独使用sal不会索引。需要注意的是,我们说的同时使用两个字段,是指的进行逻辑与操作, 对于逻辑或操作不会使用索引。

11、关于是否有必要使用外键,很多程序员是比较反感的。至少我目前解除的系统里面,基本都有没有使用。不使用外键一般由两个观点:第一个是降低表记录更改的灵活性,删除的时候也不能直接删除;第二个是降低了DML操作的效率。其实我倒觉得是因为大多系统的需求是不明确的,在开发中很多数据库表一直在改动;再加上很多项目时间紧、任务重的,所以很多开发人员是不喜欢使用外键的,更不要说各种完整性约束了。虽然说第一个观点可以说更好的规范开发,第二点,我从看到一个例子,对有无外键的情况下进行DML操作,其时间相差无几。但是理想总是丰满的,而现实却很骨干啊。

12、程序校验代替检查约束,其实很多软件设计、开发都是这么干的。但是项目大多数时候都不是一个人在开发,程序的校验不见得都能做到,所以还是建议多使用数据检查约束的。

13、关于存储过程,我个人其实不建议把过多的业务逻辑放到存储过程中。从遇到一个公司招聘,介绍说公司的项目业务逻辑都是在存储过程中,编程语言只是调用数据展示给客户,所以要求数据库理解要透彻。我都在想,你应该找个DBA更合适吧。

14、函数的功能是通过一系列计算,返回计算后的结果。所以,sql自定义的函数必有返回值,并且在函数中不能进行DML操作。

 

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0484s