DBA和開發同事的一些代溝(一)

jeanron100發表於2015-11-13
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有很多時候都有這種不明確問題的糾結。

後續繼續補充

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1837743/,如需轉載,請註明出處,否則將追究法律責任。

相關文章