源資料就是個日誌文字資訊
2008/1/11 02:14:33:181 181 00001c68 seqid 418370 toback()=true len=154 msgid=x00000202
2008/1/11 02:14:33:181 181 00001c68 seqid 418370 tofront()=true len=260 msgid=x08000202 beip=192.168.1.162 beport=22049
2008/1/11 03:05:42:330 330 00004110 seqid 418370 toback()=true len=154 msgid=x00000202
2008/1/11 03:05:42:346 346 00004110 seqid 418370 tofront()=true len=261 msgid=x08000202 beip=192.168.1.163 beport=22049
要的結果是統計一下,各時段對應的超時毫秒的數量
理論上也不複雜,能找出資料規律,進行分組統計而已,但問題在於:
首先統計是上下文相關的,即通過上下文的資料相計算才能獲取到相應的指標
其次如何判斷上下文的場景,根據幾組字段判斷都有問題,即得不到唯一的標示
原來想著應該是輕而易舉的事情,先把資料匯入oracle吧
有日期有時間,需要把文字的日期時間處理成oracle的date型別,可偏偏date型別不支援毫秒運算,第乙個問題出來了,依賴於日誌中已有的毫秒進行上下文計算又有一定的問題。
先統計了再說吧
select b.hours,
case when overlap<10 then '<10ms'
when overlap<20 then '10-20'
when overlap<30 then '20-30'
when overlap<40 then '30-40'
when overlap<50 then '40-50'
when overlap<60 then '50-60'
when overlap<70 then '60-70'
when overlap<80 then '70-80'
when overlap<90 then '80-90'
else '>90ms'
end tt,
count(*)
from
select a.f,a.d from
select k,a,b,f,d,g,c,
lag(c, 1, 0) over (partition by f,d order by b,g) lastc,
lag(b, 1, 0) over (partition by f,d order by b,g) lastb,
case when c - lag(c, 1, 0) over (order by tt)>=0 then c - lag(c, 1, 0) over (order by tt)
else c - lag(c, 1, 0) over (order by tt)+1000 end aa
from test6 t
) awhere a.g='tofront()=true' and a.aa>90 )
order by f,d,b,g
) bgroup by b.hours,
case when overlap<10 then '<10ms'
when overlap<20 then '10-20'
when overlap<30 then '20-30'
when overlap<40 then '30-40'
when overlap<50 then '40-50'
when overlap<60 then '50-60'
when overlap<70 then '60-70'
when overlap<80 then '70-80'
when overlap<90 then '80-90'
else '>90ms'
end結果統計出來了,結果非預期的,又對幾條資料進行了統計和明細的對比,發現確實有些小問題,可問題出在**,也說不清楚。
為了解釋清楚這個問題,還是對資料加上行號吧,再次進行對比,發現資料的位置變化了,和原本的日誌順序是不一樣的。
為了解決這個問題,還是用rownum加上表資料生成到另外一張測試表吧,再去看看行號和日誌的順序是否能夠對應,卻發現日誌的插入順序和行號是不一致的!
又問了下同事,業務邏輯到底是怎樣的,答曰:日誌中上下文的順序是很嚴格的
看來需要徹底解決行號問題了。
又在excel中做了一下測試,excel做測試很容易,先獲取上條記錄的毫秒資訊,再進行排序,再把資料進行篩選,然後再進行分組判斷,最後進行交叉表的生成。
對應大資料量來說,excel的拖拉顯然就滿了很多,其次還需要函式、排序、複製資料,總的來說還是比較耗時的。
還是想想怎麼解決行號問題吧,確保行號就是資料的原始順序,首先加了乙個sequence,後來又在該表中增加了乙個觸發器,然後把資料重新匯入一遍
create or replace trigger trigger_test6
before insert on test6
for each row
declare
begin
select tt.nextval into :new.tt from dual;
end trigger_test6;
再去驗證資料的順序,這次才算正常了
資料正常了,業務邏輯就簡單多了,只需要把最核心的部分修改一下,按行號排序即可
select rr,k,a,b,f,d,g,c,
lag(c, 1, 0) over (order by tt) lastc,
lag(b, 1, 0) over (order by tt) lastb
from test6 t
統計完成後,再拷貝到excel中進行資料透視表轉換,再把**資料拷貝出來,加一些美觀資訊即可。
該件事情還是沒有得到完美解決
主要是毫秒的處理,理論上是時間的直接相減即可,可由於oracle的date型別無法直接處理,只能採用日誌中的毫秒字段進行相減了,碰到相減為負的,則再加回來1000,多少有些問題。
再其次,oracle匯入時的資料順序有問題,不過我想也許是我自己還沒找解決問題的根本原因吧。
本文出自 「不勝人生一場醉」 部落格
一次詭異的full gc查詢問題全過程
背景 乙個服務突然所有機器開始頻繁full gc。而服務本身沒有任何改動和發布記錄。上線檢視gc log日誌,日誌如下 從日誌來看,每次發生full gc的時候都比較奇怪,主要有兩點,第一 old區域和perm的區域使用率很低,沒有到達觸發full gc的條件,第 二 專案中配置的是cms,為什麼沒...
記一次資料提取過程
某次需要乙個中文電碼本,然而網上搜到的要麼收費,要麼不行,所以打算自己做乙份,但是看了下資料量實在太大只能放棄,那麼怎麼辦呢。收到乙個軟體teleccodetool 可以查詢漢字對應的電碼,隨即準備提取,過程記錄如下。無關的檔案已經刪除了,只剩三個核心檔案 乙個個看,第乙個配置檔案開啟沒啥有用的訊息...
一次資料變更的審核過程
今天正在做乙個資料變更操作,突然乙個開發的同學找到我,看起來比較著急的樣子,說想讓我做乙個資料變更。當然在這種時候,我正在做的資料變更操作已經被打斷了,已經有一些不願意了,而且還要緊急變更,在沒有得到指令碼,沒有環境,沒有指令碼說明,對於這種三無要求我一向都是比較排斥的。所以我靜下來,讓他提供這些資...