工作笔记总结——数据库

来源:互联网 发布:韩国媚日 知乎 编辑:程序博客网 时间:2024/06/05 03:18


1、在Mysql的客户端软件中输入多条sql语句时,如果想要执行某条语句,最好把其他的删掉,否则可能会导致你想要执行的sql不是你想要的结果,我就犯过这样的错误,明明sql写的没问题,执行后总是不对,后来发现有多条sql在一个编辑框中,不像oracle的客户端,它会执行被选中的sql,如果没有选中任何语句会全部执行。


2、DB2中表的字段长度是根据字符所占字节数,中文占2个,在项目中,在页面中队某些输入字段对长度进行校验时,明明数据库长度为50个,但是超过25个中文数据库就会报错,经过测试发现只要不是中文就可以超过25个,结合DB2的错误代码即可判断是因为超过了字段长度。


3、设计管理系统表中一般有六个字段:创建人id、创建时间、创建者部门id、更新时间、更新者id、更新者部门id


4、SQL优化

1)SQL执行原理

解析(1、在共享池中查找sql是否存在;2、检查语法) --> 绑定(查找绑定变量) --> 执行计划(执行执行计划) --> 查询(提取查询结果)

绑定变量:只解析一次,多次执行

2)select查询语句

1> 避免使用“*”,否则会查找字典得到所有列

2> from后面有多张表时需要将小表放到解析的开始端,DB2从左到右,oracle从右到左

3> where后的条件中将可以过滤掉最多的记录的放到执行的开始端,如上面的顺序

4> 避免使用having和order by,消耗资源


调优心得

目标:降低IO

设计:尽量依赖数据库的优化器,合理创建索引

编码:

1)减少全表扫描

2)合理使用临时表

3)可以将复杂的sql语句分为多个sql语句,效率反而会很高

4)减小事物的粒度,不影响业务


SQL中消耗资源的写法:

1、DISTINCT(某些情况可以使用exist替换)/UNION(两张表中没有重复数据可以使用UNION-ALL进行替换)/MINUS/INTERSECT/ORDER BY

2、至少要包含组合索引的第一列在where子句后使用才会有效,其他列无效

3、避免在索引列上使用function或者算术表达式,如max,min

低效:where sal * 12 > 2500;

高效:where sal > 2500/12;


4、模糊查询时避免将“%”放到首位

5、避免使用not,索引只知道有哪些,不知道没那些

如:

低效:where i != 0;

高效:where i>0 or i<0;


4、避免使用“1=1”作为where后的条件

5、索引列自动转换,避免使用类型不匹配的的值,如:

emp为varchar

低效:where emp = 123; //数据库内部调用emp = To_Varchar(123) 

高效:where emp = '123';


6、使用not exist (匹配成功后停止)替代not in(匹配成功后仍然匹配)

7、使用“>="替代”>",不要让数据库帮你计算

8、项目前期不建议创建索引:1)字段变动较大,维护索引;2)创建索引是否能提高效率还不一定;

9、DB2中每个中文字符占连个varchar

10、修改表字段属性长度和类型sql语句

增加字段:alter table xxx add column xxx varchar(20)

修改字段长度和类型:alter table xxx alter column set data type varchar(30)

11、在DB2中table的colume的值为NULL时,不能使用“=”和“!=”作为where后的条件判断,否则会导致查询结果不正确,可以使用“IS” "IS NOT"判断是否是NULL

示例代码如下:

select * from t_person where name !='admin' OR name IS NULL ;(将NULL最为OR条件)


12、db2数据库表通过其他客户端连接数据库修改表结构时会导致表不活动的问题,直接导致更新数据失败

解决:reorg talbe schema.tableName;在quest central中执行这句sql语句即可,在第三方客户端可能无法执行


13、在查询数据库时对null值的判断要格外小心,不能使用“!=”或“=”判断,要用“IS”或“IS NOT”


===========================未完待续=====================