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;
/
这个pl/sql块中select *from dual where rownum<1肯定是没有结果的,所以错误的原因其实就在于存储过程中的这种类似查询没有数据导致的。
乱码导致的sql问题
有下面这么一段聊天内容,是关于部署一个存储过程的。是一个重要的数据环境。
杨建荣 [16:20]:
这个存储过程你测试了吗?
开发同事[16:21]:
我内网测试了
可以修改成功么?
杨建荣 [16:21]:
有报警
警告
开发同事 [16:24]:
修改不了?
我内网没有报警呢
开发同事 [16:29]:
没问题啊
内网
是不是弄错了
我刚还测试了呢
一样的
开发同事 [16:41]:
删完了编译不成功
应该没问题的
杨建荣 [17:01]:
好的。最后用iconv搞定了。有个别注释的字符集兼容问题
这个问题说来惭愧,也是这么字符集没有考虑好,结果运行的时候抛出了警告,结果找开发,开发说测试过了,但是部署就是有问题,开发说我就改了一行两行的内容,就这么想来想去,最后才发现是字符集的兼容,其实开发和DBA有很多时候都有这种不明确问题的纠结。
后续继续补充