awk实际运用之——过滤sql脚本

0

有如下需求

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:

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

针对CREATEINDEX.SQL,使用下面脚本过滤出索引列表CREATEINDEX_filtered.txt:

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.txt

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.

你可能感兴趣的

载入中...