DBA同学在工作中不可避免和开发同学打交道,和开发的同学在交流中还是有不少的小插曲,有些想想也蛮有意思,但是有些是痛点。
我举几个例子来说明,可能比较片面,但是只是为了说明问题,达到交流的目的即可。
###oracle知识和sql水平不足
ddl中的commit
我相信很多DBA都会看到这样的sql脚本。
create table test(id number,name varchar2(30));
commit;
其实这个就是对于ddl的理解有偏差,ddl压根就不需要这样的commit
弄巧成拙的 exists
之前碰到一个开发同事写的sql大体是下面的样子
select *from test where id in (xxxx) and exists(select *from big_table )
可以看出他还是认为exists要好一些,但是实际上用的时候没用好。
让人 匪夷所思的 数据库
经常开发同事会给我提出要求,我们需要创建几个数据库,我一听想这个请求还是蛮大的,需要考虑存储,网络,服务器等等,然后弄明白之后,其实他说的就是创建几个数据库用户。如果是MySQL这么说还算对,我听到的都是Oracle的,难道都是故意刺激我。我每次提醒他们,那是数据库用户,他们会不以为然的说,恩,就是你说的那么个东西,好吧。
不合理的表关联
这种案例也听过不少碰到过不少,我见到比较多的还是十多个表做关联,不过性能还算能过得去,最近听到一个同事碰到一个sql里面的表关联有40多个,而且还是用MySQL,我听了这种复杂度,简直要绝望。
高水位线的问题
之前碰到一个案例,有一天突然数据库归档量急剧增多。最后一番调查之后发现,开发同学使用了delete from test这种操作,这个test表数据量非常大。
下面是我和开发同事的对话
开发同事 [19:27]:
delete全表都要下工单是吧
我们最近在整理几个数据库的数据
杨建荣 [19:28]:
不能做这种操作,如果需要清理数据,开工单给DBA,让DBA来做。
开发同事 [19:28]:
好的
杨建荣 [19:28]:
你这样清理,表里高水位线,会越来越高,影响比较大。
开发同事[19:29]:
恩
杨建荣 [19:32]:
刚刚一个小时,日志切了900多次,正常应该是2~5次
开发同事[19:32]:
并不懂 +o(
杨建荣 [19:33]:
就是影响比较大的意思,就跟开发的日志量突然多了500倍的感觉一样;)
最后我又给他解释了一会,他似乎明白了,但是最后的收效就是delete全表会有很大的影响。
####对索引的过度喜好
发现有的开发同事对于索引还是很依赖,恨不得每个字段都建一个索引。
比如下面形式的语句
create table(id1,id2,id3);
create index on (id1);
create index on (id2);
create index on (id3);
如果查询条件满足的情况下,其实可以做个复合索引的。索引太多,对于dml影响不小,而且很多时候执行计划效率也高不了。
大表加个字段
如果给大表加个字段,对于DBA来说就是一个很头疼的事情,尤其是大表,分区表,数据量非常大的情况下,那就非常耗费时间和精力,应用那么又要保证停机时间,所以还是一件挺纠结的事情。我们在exadata上也看到过,大表加个default值的字段,实在是再没法快了。
可能从开发角度来说就是简单的一个sql语句,不能那么想啊。
开发同学的潜台词
开发同学可能需要表达的是事情A,可能我们需要做事情A,B,C,D, 这个时候需要了解开发同学的潜台词
比如下面这个对话,开发同事让我来赋予表访问的select权限,很简单的操作,马上做好了。
开发同事15:30:
这个用户也没有那些表的那些权限啊
杨建荣15:31
权限有的
开发同事15:31
刚才确实查不到表
现在好了
。。
杨建荣15:31
听你一解释,我明白了,你是说还没有同义词啊。
刚建了同义词
开发同事15:32
哦哦
现在好了
最后一琢磨,开发同事的要求是能够访问到表,现网环境中存在owner用户,连接用户,owner用户存放真正的数据,连接用户是通过同义词来访问,对开发来说就需要直接访问即可。
所以他们所说的开通权限,DBA需要做的就是开通访问权限,然后创建同义词。然后开通响应的防火墙和端口。。。。
###“未知问题”
调试一个存储过程
最近有个开发同事来找我,让我帮她调试一个存储过程,我问她是我负责的环境吗,她说不知道,那给我环境我在本地试一下,她说具体环境也记不得了,目前在已经配置好的环境里面运行存储过程有问题,好吧,我一看存储过程,好几百行,先耐着性子问了问最近有什么变化。
最后还是试着帮他调试了一下,发现原来报错是NO DATA FOUND这种错误。
最后我给她写了一个简单的模拟pl/sql来说明问题,她才终于明白问题,要不还在和我纠结到底是写varchar还是varchar2
乱码导致的sql问题
有下面这么一段聊天内容,是关于部署一个存储过程的。是一个重要的数据环境。
杨建荣 [16:20]:
这个存储过程你测试了吗?
开发同事[16:21]:
我内网测试了
可以修改成功么?
杨建荣 [16:21]:
有报警
警告
开发同事 [16:24]:
修改不了?
我内网没有报警呢
开发同事 [16:29]:
没问题啊
内网
是不是弄错了
我刚还测试了呢
一样的
开发同事 [16:41]:
删完了编译不成功
应该没问题的
杨建荣 [17:01]:
好的。最后用iconv搞定了。有个别注释的字符集兼容问题
这个问题说来惭愧,也是这么字符集没有考虑好,结果运行的时候抛出了警告,结果找开发,开发说测试过了,但是部署就是有问题,开发说我就改了一行两行的内容,就这么想来想去,最后才发现是字符集的兼容,其实开发和DBA有很多时候都有这种不明确问题的纠结。
后续继续补充
我举几个例子来说明,可能比较片面,但是只是为了说明问题,达到交流的目的即可。
###oracle知识和sql水平不足
ddl中的commit
我相信很多DBA都会看到这样的sql脚本。
create table test(id number,name varchar2(30));
commit;
其实这个就是对于ddl的理解有偏差,ddl压根就不需要这样的commit
弄巧成拙的 exists
之前碰到一个开发同事写的sql大体是下面的样子
select *from test where id in (xxxx) and exists(select *from big_table )
可以看出他还是认为exists要好一些,但是实际上用的时候没用好。
让人 匪夷所思的 数据库
经常开发同事会给我提出要求,我们需要创建几个数据库,我一听想这个请求还是蛮大的,需要考虑存储,网络,服务器等等,然后弄明白之后,其实他说的就是创建几个数据库用户。如果是MySQL这么说还算对,我听到的都是Oracle的,难道都是故意刺激我。我每次提醒他们,那是数据库用户,他们会不以为然的说,恩,就是你说的那么个东西,好吧。
不合理的表关联
这种案例也听过不少碰到过不少,我见到比较多的还是十多个表做关联,不过性能还算能过得去,最近听到一个同事碰到一个sql里面的表关联有40多个,而且还是用MySQL,我听了这种复杂度,简直要绝望。
高水位线的问题
之前碰到一个案例,有一天突然数据库归档量急剧增多。最后一番调查之后发现,开发同学使用了delete from test这种操作,这个test表数据量非常大。
下面是我和开发同事的对话
开发同事 [19:27]:
delete全表都要下工单是吧
我们最近在整理几个数据库的数据
杨建荣 [19:28]:
不能做这种操作,如果需要清理数据,开工单给DBA,让DBA来做。
开发同事 [19:28]:
好的
杨建荣 [19:28]:
你这样清理,表里高水位线,会越来越高,影响比较大。
开发同事[19:29]:
恩
杨建荣 [19:32]:
刚刚一个小时,日志切了900多次,正常应该是2~5次
开发同事[19:32]:
并不懂 +o(
杨建荣 [19:33]:
就是影响比较大的意思,就跟开发的日志量突然多了500倍的感觉一样;)
最后我又给他解释了一会,他似乎明白了,但是最后的收效就是delete全表会有很大的影响。
####对索引的过度喜好
发现有的开发同事对于索引还是很依赖,恨不得每个字段都建一个索引。
比如下面形式的语句
create table(id1,id2,id3);
create index on (id1);
create index on (id2);
create index on (id3);
如果查询条件满足的情况下,其实可以做个复合索引的。索引太多,对于dml影响不小,而且很多时候执行计划效率也高不了。
大表加个字段
如果给大表加个字段,对于DBA来说就是一个很头疼的事情,尤其是大表,分区表,数据量非常大的情况下,那就非常耗费时间和精力,应用那么又要保证停机时间,所以还是一件挺纠结的事情。我们在exadata上也看到过,大表加个default值的字段,实在是再没法快了。
可能从开发角度来说就是简单的一个sql语句,不能那么想啊。
开发同学的潜台词
开发同学可能需要表达的是事情A,可能我们需要做事情A,B,C,D, 这个时候需要了解开发同学的潜台词
比如下面这个对话,开发同事让我来赋予表访问的select权限,很简单的操作,马上做好了。
开发同事15:30:
这个用户也没有那些表的那些权限啊
杨建荣15:31
权限有的
开发同事15:31
刚才确实查不到表
现在好了
。。
杨建荣15:31
听你一解释,我明白了,你是说还没有同义词啊。
刚建了同义词
开发同事15:32
哦哦
现在好了
最后一琢磨,开发同事的要求是能够访问到表,现网环境中存在owner用户,连接用户,owner用户存放真正的数据,连接用户是通过同义词来访问,对开发来说就需要直接访问即可。
所以他们所说的开通权限,DBA需要做的就是开通访问权限,然后创建同义词。然后开通响应的防火墙和端口。。。。
###“未知问题”
调试一个存储过程
最近有个开发同事来找我,让我帮她调试一个存储过程,我问她是我负责的环境吗,她说不知道,那给我环境我在本地试一下,她说具体环境也记不得了,目前在已经配置好的环境里面运行存储过程有问题,好吧,我一看存储过程,好几百行,先耐着性子问了问最近有什么变化。
最后还是试着帮他调试了一下,发现原来报错是NO DATA FOUND这种错误。
最后我给她写了一个简单的模拟pl/sql来说明问题,她才终于明白问题,要不还在和我纠结到底是写varchar还是varchar2
set serveroutput on
declare
a varchar2(10);
begin
select '' into a from dual where rownum<1;
dbms_output.put_line(a);
end;
/
乱码导致的sql问题
有下面这么一段聊天内容,是关于部署一个存储过程的。是一个重要的数据环境。
杨建荣 [16:20]:
这个存储过程你测试了吗?
开发同事[16:21]:
我内网测试了
可以修改成功么?
杨建荣 [16:21]:
有报警
警告
开发同事 [16:24]:
修改不了?
我内网没有报警呢
开发同事 [16:29]:
没问题啊
内网
是不是弄错了
我刚还测试了呢
一样的
开发同事 [16:41]:
删完了编译不成功
应该没问题的
杨建荣 [17:01]:
好的。最后用iconv搞定了。有个别注释的字符集兼容问题
这个问题说来惭愧,也是这么字符集没有考虑好,结果运行的时候抛出了警告,结果找开发,开发说测试过了,但是部署就是有问题,开发说我就改了一行两行的内容,就这么想来想去,最后才发现是字符集的兼容,其实开发和DBA有很多时候都有这种不明确问题的纠结。
后续继续补充
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1837743/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23718752/viewspace-1837743/