通過shell指令碼生成資料統計資訊的報表

jeanron100發表於2014-05-05
對於統計資訊的收集,不同的環境中使用的策略也會有很大的不同,有的按照一定的時間頻率來收集,有的比較穩定的系統根據資料的增長頻率來收集,使用者比較穩定的系統,甚至都不再收集統計資訊。

以下是使用shell生成的統計資訊報表效果,可以在備份庫中進行這些資訊的收集,可以看到哪些表的查詢耗費的時間較多,當前資料條數和統計資訊中的資料條數。
#############################################################################     
table_name               volumn_size Elapsed_time     acutal_cnt       stat_cnt 
#############################################################################     
TEST_AUDIT_BALANCE             SMALL      00:00:00.06              0               0   
TEST_FILE_SYSTEM_DEF           SMALL      00:00:00.00            114              114  
TEST_SITEID                    SMALL      00:00:00.00            112              112  
TEST_MISSING_SEQ               SMALL      00:00:00.00              0                0  
TEST_GL_DETAILED_DATA          HUGE       00:00:18.24      315001510        310553395  
TEST_INVOICE                   SMALL      00:00:02.97        3024771          3024729  
TEST_TAX_ITEM                  MEDIUM     00:00:23.45       25826165         25825805  
TEST_TRANSACTION_LOG           MEDIUM     00:00:13.71       15642936         15407469  



使用的shell指令碼如下,簡單對指令碼的實現做了解釋。
##############################################
首先使用sqlplus來生成資料的當前資料條數,這個地方可以使用動態sql來生成,或者使用指定的sql語句,我就不重複貼了。
需要使用兩個引數,一個是連線的使用者名稱/密碼,一個是指定的指令碼來執行得到資料的條數。

print "
        WHENEVER SQLERROR EXIT 5
set pages 0
set timing on
set feedback off
        connect $1  \n
        @@$2
        " | sqlplus  -s /nolog > tab_stat.log

輸出的內容格式如下所示:
TEST_AUDIT_BALANCE             SMALL                  0  
Elapsed: 00:00:00.09                                     
TEST_FILE_SYSTEM_DEF           SMALL                 114 
Elapsed: 00:00:00.09                                     
TEST_SITEID                    SMALL                 112 
Elapsed: 00:00:00.09                                     
TEST_MISSING_SEQ               SMALL                   0 
Elapsed: 00:00:00.09                                     
TEST_GL_DETAILED_DATA          HUGE             315001510
Elapsed: 00:00:18.24                                     
TEST_INVOICE                   SMALL              3024771
Elapsed: 00:00:02.97                                     
TEST_TAX_ITEM                  MEDIUM            25826165
Elapsed: 00:00:23.45                                     
TEST_TRANSACTION_LOG           MEDIUM            15642936
Elapsed: 00:00:13.71                                     


下面進行資料拆分,得到兩個檔案,一個檔案得到所有表的資料條數,另外一個檔案得到執行的時間  
#print 2 files with table data counts and the other for elapsed time
awk 'NR%2==1' tab_stat.log |cat -n >tab_cnt_lst.log
awk 'NR%2==0' tab_stat.log |awk '{print $2}' |cat -n >tab_stat_time.log

然後把兩個檔案內容merge起來
#print file with elapsed time as one column
join tab_cnt_lst.log tab_stat_time.log |awk   '{print $2,$3,$5,$4}' |sort > tab_stat_act_cnt.log

顯示的內容如下:
TEST_AUDIT_BALANCE             SMALL      00:00:00.06              0   
TEST_FILE_SYSTEM_DEF           SMALL      00:00:00.00            114   
TEST_SITEID                    SMALL      00:00:00.00            112   
TEST_MISSING_SEQ               SMALL      00:00:00.00              0   
TEST_GL_DETAILED_DATA          HUGE       00:00:18.24      315001510   
TEST_INVOICE                   SMALL      00:00:02.97        3024771   
TEST_TAX_ITEM                  MEDIUM     00:00:23.45       25826165   
TEST_TRANSACTION_LOG           MEDIUM     00:00:13.71       15642936   
    

然後從當前的統計資訊中得到資料的條數。
print "
        WHENEVER SQLERROR EXIT 5
set pages 0
set feedback off
        connect $1  \n
        SELECT
                TABLE_NAME,NUM_ROWS
        FROM
                USER_TABLES
        ORDER BY 1;
        " | sqlplus  -s /nolog |sort > tab_stat_cnt.log
輸出格式類似下面所示。
TEST_AUDIT_BALANCE                    0   
TEST_FILE_SYSTEM_DEF                114   
TEST_SITEID                         112   
TEST_MISSING_SEQ                      0   
TEST_GL_DETAILED_DATA         315001510   
TEST_INVOICE                    3024771   
TEST_TAX_ITEM                  25826165   
TEST_TRANSACTION_LOG           15642936   


最後把檔案的內容merge到一起,輸出報表。
#print report with table actual data counts and stat data counts
join tab_stat_act_cnt.log tab_stat_cnt.log|awk '
BEGIN{
print "#############################################################################"
printf "%-30s %-10s %11s %-15s  %-15s \n", "table_name","volumn_size","Elapsed_time","acutal_cnt","stat_cnt"
print "#############################################################################"
}
{printf "%-30s %-10s %11s %-15s  %-15s \n",$1,$2,$3,$4,$5}' |tee  final_tab_stat_rpt.lst

得到了最終的報表內容,可以在此基礎上進行分析和統計,如果統計值和實際的資料條數相差比較大,就可以針對性的進行統計資訊收集。
#############################################################################     
table_name               volumn_size Elapsed_time     acutal_cnt       stat_cnt 
#############################################################################     
TEST_AUDIT_BALANCE             SMALL      00:00:00.06              0               0   
TEST_FILE_SYSTEM_DEF           SMALL      00:00:00.00            114              114  
TEST_SITEID                    SMALL      00:00:00.00            112              112  
TEST_MISSING_SEQ               SMALL      00:00:00.00              0                0  
TEST_GL_DETAILED_DATA          HUGE       00:00:18.24      315001510        310553395  
TEST_INVOICE                   SMALL      00:00:02.97        3024771          3024729  
TEST_TAX_ITEM                  MEDIUM     00:00:23.45       25826165         25825805  
TEST_TRANSACTION_LOG           MEDIUM     00:00:13.71       15642936         15407469  


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

相關文章