Unix Code - Detail View


Date

Name

Plattform

Language

Kurzbeschreibung

Owner

Link

19.10.2001

sqlcache.awk

Unix

Shell

Display Statements in Dynamic Cache

IBM Corp. 2000

ftp://www.redbooks.ibm.com/redbooks/sg246012

DB2 ist ein Produkt der
IBM Corporation. Bitte
Copyright-  und Trademark-Hinweise beachten!

BEGIN{
OS    = "AIX";
QUERIES    = ENVIRON[ "QUERIES"     ];
DISPLAY_SQL = ENVIRON[ "DISPLAY_SQL" ];
SAVE_SQL    = ENVIRON[ "SAVE_SQL"    ];
SQL_ONLY    = ENVIRON[ "SQL_ONLY"    ];
NO_TIMING   = ENVIRON[ "NO_TIMING"   ];
NO_ROWS     = ENVIRON[ "NO_ROWS"     ];
LAST_QUERY  = ENVIRON[ "LAST_QUERY"  ];
TMP_SQL     = ENVIRON[ "TMP_SQL"     ];
WINCOLS     = ENVIRON[ "WINCOLS"     ];
header    = 0;
COLLECTED   = 1;
STMT_NUM    = 0;
MIL         = 1000000;

#printQUERIES    "=QUERIES"     ;
#printDISPLAY_SQL "=DISPLAY_SQL" ;
#printSAVE_SQL    "=SAVE_SQL"    ;
#printSQL_ONLY    "=SQL_ONLY"    ;
#printNO_TIMING   "=NO_TIMING"   ;
#printNO_ROWS     "=NO_ROWS"     ;
#printLAST_QUERY  "=LAST_QUERY"  ;
#printTMP_SQL     "=TMP_SQL"     ;
#printWINCOLS     "=WINCOLS"     ;
}

/SQL1611W/{ print }

/ Number of executions/{
  N_EXECUTIONS= "";
  N_COMPILES= "";
  T_W_PREP= "";
  T_B_PREP= "";
  R_DELETED= "";
  R_INSERTED= "";
  R_READ= "";
  R_UPDATED= "";
  R_WRITTEN= "";
  S_SORTS= "";
  T_T_EXECUTION= "";
  T_T_USER= "";
  T_T_SYSTEM= "";
}
/ Number of executions/{ N_EXECUTIONS=$NF}
/ Number of compilations/{ N_COMPILES=$NF}
/ Worst preparation time \(ms\)/{ T_W_PREP=$NF}
/ Best preparation time \(ms\)/{ T_B_PREP=$NF}
/ Rows deleted/{ R_DELETED=$NF}
/ Rows inserted/{ R_INSERTED=$NF}
/ Rows read/{ R_READ=$NF}
/ Rows updated/{ R_UPDATED=$NF}
/ Rows written/{ R_WRITTEN=$NF}
/ Statement sorts/{ S_SORTS=$NF}
/ Total execution time \(sec.ms\)/{ T_T_EXECUTION=$NF}
/ Total user cpu time \(sec.ms\)/{ T_T_USER=$NF}
/ Total system cpu time \(sec.ms\)/{ T_T_SYSTEM=$NF}

/ Statement text/{  # Begin Display

STMT_NUM=STMT_NUM + 1;
S_TEXT=substr( $0, index( $0, "=")+2 );
SQL_OUT="";

if (R_READ == "Collected")
COLLECTED=0;

if (DISPLAY_SQL == -1)
SQL_LEN = length( S_TEXT);
else
SQL_LEN = DISPLAY_SQL;

# Save SQL Text to a file, or get name of existing (duplicate) file
if ( SAVE_SQL )  Save_Sql();

headline = "";
dataline = "";

if ( SQL_ONLY )
{
if (SAVE_SQL)S_Save_Info();
}
else
{
T_A_EXEC= T_T_EXECUTION / N_EXECUTIONS;
T_A_USER= T_T_USER/ N_EXECUTIONS;
T_A_SYSTEM= T_T_SYSTEM / N_EXECUTIONS;
A_R_READ= R_READ/ N_EXECUTIONS;
A_R_WRITTEN= R_WRITTEN/ N_EXECUTIONS;
A_R_INSERTED= R_INSERTED/ N_EXECUTIONS;
A_R_UPDATED= R_UPDATED/ N_EXECUTIONS;
A_R_DELETED= R_DELETED/ N_EXECUTIONS;

N_EXECUTIONS= round_MIL( N_EXECUTIONS );
N_COMPILES= round_MIL( N_COMPILES   );
A_R_READ= round_MIL( A_R_READ     );
A_R_WRITTEN= round_MIL( A_R_WRITTEN  );
A_R_INSERTED= round_MIL( A_R_INSERTED );
A_R_UPDATED= round_MIL( A_R_UPDATED  );
A_R_DELETED= round_MIL( A_R_DELETED  );

S_Exec_Info();

if (COLLECTED && ! NO_TIMING) S_Timing_Info();

#if ( SAVE_SQL ||
#     ((! SAVE_SQL) && ! (NO_TIMING || NO_ROWS || ! COLLECTED)) )
if ( SAVE_SQL )
S_Save_Info();

if (COLLECTED && ! NO_ROWS) S_Rows_Info();
}

S_SQL_Text();

rm_Trailing();

if ( headline && ! header)
{
for (i=1; i<=length( headline); i++)
underline = underline "-";

print headline;
print underline;
header = 1;
}

if (dataline) print dataline;
}

################################################################################
function round_MIL( val ) {

if ( val > MIL ) val = int( val / MIL ) "M";
return val;
}

################################################################################
function S_Exec_Info() {

headline = headline sprintf( \
"%4.4s | %6.6s %6.6s | %10.10s | ",
"Qnum",
"Exec's",
"Comp's",
"BestPrepMS");
dataline = dataline sprintf( \
"|%3s | %6s %6s | %10s | ",
STMT_NUM,
N_EXECUTIONS,
N_COMPILES,
T_B_PREP);
}

################################################################################
function S_Timing_Info() {

headline = headline sprintf( \
"%10.10s %10.10s %10.10s | ",
"ExecSEC.MS",
"UserSEC.MS",
"SystSEC.MS");
dataline = dataline sprintf( \
"%10.10s %10.10s %10.10s | ",
T_A_EXEC,
T_A_USER,
T_A_SYSTEM);
}

################################################################################
function S_Rows_Info() {

SPACERHEAD="";
SPACER="";
WINCOL_Spacing();

headline = headline sprintf( \
"%6.6s %6.6s %s%10.10s   %10.10s %10.10s | ",
"R_Read",
"Writtn",
SPACERHEAD,
"Inserted",
"Updated",
"Deleted");
dataline = dataline sprintf( \
"%6.6s %6.6s %s%10.10s   %10.10s %10.10s | ",
A_R_READ,
A_R_WRITTEN,
SPACER,
A_R_INSERTED,
A_R_UPDATED,
A_R_DELETED);
}

################################################################################
function S_Save_Info() {

headline = headline sprintf( \
"%8.8s | ",
"SQL-File");
#if ( ( ! SQL_ONLY ) || ( SQL_ONLY && S_TEXT ) )
dataline = dataline sprintf( \
"%8s | ",
SQL_OUT);
}

################################################################################
function S_SQL_Text() {

if ( DISPLAY_SQL )
headline = headline sprintf( \
"%-*s | ",
SQL_LEN, "SQL-Text");
if (S_TEXT && SQL_LEN)
dataline = dataline sprintf( \
"%-*.*s | ",
SQL_LEN, SQL_LEN, S_TEXT);
}

################################################################################
function WINCOL_Spacing() {

if ( COLLECTED && ! ( NO_TIMING || NO_ROWS ) )
{
if (SAVE_SQL)
{
if (WINCOLS == 80)
{
headline = headline "   | ";
dataline = dataline "   | ";
SPACERHEAD="| ";
SPACER="| ";
}
else if (WINCOLS == 132)
{
SPACERHEAD="|";
SPACER="|";
}
}
else # No SAVE_SQL info
{
if (WINCOLS == 80)
{
headline = headline "         |    | ";
dataline = dataline "         |    | ";
SPACERHEAD="| ";
SPACER="| ";
}
else if (WINCOLS == 132)
{
headline = headline "        | ";
dataline = dataline "        | ";
SPACERHEAD="| ";
SPACER="| ";
}
}
}
}

################################################################################
function rm_Trailing() {
# Get rid of trailing separator

if ( substr( headline, (len=length( headline))-2) == " | " )
{
headline = substr( headline, 1, (len - 3) );
dataline = substr( dataline, 1, (len - 3) );
}
}

################################################################################
function Save_Sql() {
# Save SQL Text to a file, or get name of existing (duplicate) file

DUPFILE="";
print S_TEXT > TMP_SQL;
close( TMP_SQL);

# Check if a duplicate SQL file exists
if ( OS == "AIX" )
{
# Get filesize of TMP_SQL
"ls -l " TMP_SQL | getline DIRLINE;
close( "ls -l " TMP_SQL );
DFN=split( DIRLINE, DIRARRAY);
FILESIZE=DIRARRAY[5];

# Loop thru sql files in reverse creation order
# Compare only if same filesize
while ( (DUPFILE == "") &&
("ls -lt " QUERIES "/[0-9]*.sql" | getline DIRLINE ) )
{
DFN=split( DIRLINE, DIRARRAY);
if ((DIRARRAY[5] == FILESIZE) &&
    (TMP_SQL != DIRARRAY[DFN])  )
{
"diff " TMP_SQL " " DIRARRAY[DFN]   \
" >/dev/null 2>&1 && "              \
"basename "  DIRARRAY[DFN] | \
getline DUPFILE;
close(  "diff " TMP_SQL " " DIRARRAY[DFN]   \
" >/dev/null 2>&1 && "              \
"basename "  DIRARRAY[DFN] );
}
}
close( "ls -lt " QUERIES "/[0-9]*.sql" );

system( "rm " TMP_SQL);
}
else# Untested
{
# delete TMP_SQL
}

if ( DUPFILE != "" )
{  # A duplicate SQL file was found
SQL_OUT = DUPFILE;
}
else
{  # Create SQL file
LAST_QUERY=LAST_QUERY + 1;
SQL_OUT=LAST_QUERY ".sql";
print S_TEXT > QUERIES "/" SQL_OUT;
}
}

© Gernot Ruban