awk實際運用之——過濾sql腳本

有以下需求

1個名爲DROPINDEXES.SQL的腳本,會執行刪除索引的語句
1個名爲CREATEINDEXES.SQL的腳本,會建立出來DROPINDEXES.SQL腳本刪掉的索引
須要有方法確認刪掉的索引都被從新建立出來,沒有漏掉的。若是缺乏索引,可能會致使應用程序性能出現問題。

問題分析

首先,須要從DROPINDEXES.SQL中抽取出來刪掉的索引列表,名爲DROPINDEXES_filtered.txt; 從CREATEINDEXES中抽取出來刪掉的索引列表,名爲CREATEINDEXES_filtered.txt
而後,針對抽取出來的 DROPINDEXES_filtered.txt和CREATEINDEXES_filtered.txt進行對比,就能夠知道刪掉的有沒有被建立出來了。

數據樣本

DROPINDEXES.SQL的樣本以下:

Drop index PS_Y_GP_HR_TAS;
Drop index PS_GARN_OPERANDS;
Drop index PS_GB_BINDVAL_TBL;
Drop index PS_ACAD_PLAN_LANG;
Drop index PS_TL_RI_EMPL1;

CREATEINDEXES.SQL的樣本以下:

CREATE UNIQUE INDEX SYSADM.PS_Y_GP_HR_TAS ON SYSADM.PS_Y_GP_HR_TAS (EMPLID, EMPL_RCD, EFFDT DESC, EFFSEQ)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 40960 NEXT 106496 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE PSINDEX ;

CREATE UNIQUE INDEX SYSADM.PS_GARN_OPERANDS ON SYSADM.PS_GARN_OPERANDS (STATE_GARN_LAW, GARN_RULE_ID, EFFDT DESC, GARN_STEP)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 40960 NEXT 106496 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE PSINDEX ;

CREATE UNIQUE INDEX SYSADM.PS_GB_BINDVAL_TBL ON SYSADM.PS_GB_BINDVAL_TBL (PROCESS_INSTANCE, GB_GROUP_ID2, PNLGRPNAME, GB_EFFDT DESC, EDITTABLE)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 40960 NEXT 106496 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE PSINDEX ;

CREATE UNIQUE INDEX SYSADM.PS_ACAD_PLAN_LANG ON SYSADM.PS_ACAD_PLAN_LANG (INSTITUTION, ACAD_PLAN, LANGUAGE_CD, EFFDT DESC)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE( INITIAL 40960 NEXT 106496 MAXEXTENTS 2147483645
PCTINCREASE 0)
TABLESPACE PSINDEX ;

CREATE INDEX SYSADM.PS_TL_RI_EMPL1 ON SYSADM.PS_TL_RI_EMPL1 (PROCESS_INSTANCE, EMPLID, EMPL_RCD, EFFDT DESC, END_DT)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE( INITIAL 40960 NEXT 106496 MAXEXTENTS 2147483645
PCTINCREASE 0)
TABLESPACE PSINDEX ;

腳本編寫

針對DROPINDEX.SQL,使用下面腳本過濾出索引列表DROPINDEX_filtered:sql

awk '{print $3}' DROPINDEX.SQL | cut -d ';' -f 1 > DROPINDEX_filtered.txt

針對CREATEINDEX.SQL,使用下面腳本過濾出索引列表CREATEINDEX_filtered.txt:bash

grep -P "^CREATE\ INDEX|CREATE\ UNIQUE\ INDEX" CREATEINDEX.SQL | awk -f filter.awk | cut -d '.' -f 2  > CREATEINDEX_filtered.txt

其中,filter.awk的內容以下:性能

{
if ( $2 == "INDEX" ) print $3;
else if ( $2 == "UNIQUE" ) print $4;
}

最終獲得的清單樣子以下:
DROPINDEX_filtered.txtcode

PS_Y_GP_HR_TAS
PS_GARN_OPERANDS
PS_GB_BINDVAL_TBL
PS_ACAD_PLAN_LANG
PS_TL_RI_EMPL1

CREATEINDEX_filtered.txt索引

PS_Y_GP_HR_TAS
PS_GARN_OPERANDS
PS_GB_BINDVAL_TBL
PS_ACAD_PLAN_LANG
PS_TL_RI_EMPL1

知識點

  1. awk的用法(-f 指定awk腳本文件(在須要較複雜判斷時使用))
  2. cut的用法(-d指定分隔符,-f指定須要顯示的列)

以上例子,但願對你們有用。
have a good day.class

相關文章
相關標籤/搜索