#Author    : Glenn Cummings
#Date      : 12.01.2004
#Parameter 1. Datenbank 
#          2. Tabellename 
#
#Dieses Skript ermittelt die interne Fragmentierung der Daten einer Tabelle
#
#Dieses Skript hat nur einen einzigen Mancko:
# Da die Bitmapepages und die Indexpages gleich gekennzeichnet sind:
#Man kann auch mit diesem Skript Partitionen die nur Indexdaten haben, z. Bp. 
#bei detachierten Index, und wenn mit diesesm Skript eine der s.g. Partitionen
#kontrollieren will, erscheint dass diese Tabelle oder Partition z.Bp. 
#15521 IndexPage hat, und das ist falsch!
#Muß man wissen (und jeder IFX-Administrator soll es wissen) alle 4031 kommt 
#eine Bitmappage, oder anderes gesagt, nach einer Bitmappage kommen 4031 
#unterschiedliche Pages.
#
UNLOAD=/tmp/pagelist.$$
TABLE=$2
DBASE=$1
dbaccess sysmaster <<%EOF
unload to $UNLOAD
select * 
  from sysptnbit 
 where pb_partnum = (select partnum 
                       from systabnames 
                      where tabname = "$2"
                        and dbsname = "$1" );
%EOF

cat $UNLOAD | \
awk '
BEGIN { FS="|" }
{ 
  if ( NR == 1 )
  {
     printf "Interne Struktur der Tabelle: %s in der Datenbank: %s \n\n", tabelle, db 
     counter == 0 
     vorige = $3
  }
  if ( vorige == $3 )
  {
     counter = counter + 1
  }
  else
  { 
     if ( vorige == 0 ) {
        beschreibung = "Freie Page"
        counter8 = counter8 + counter
     }
 
     if ( vorige == 4 ) {
        beschreibung = "Data Page mit noch freien Platz"
        counter8 = counter8 + counter
     }
 
     if ( vorige == 8 ) {
        if ( counter8 == 0 ) {
           beschreibung = "Bitmap Page"
           counter8 = 0
           } else {
           if ( counter8 == 4031 ) {
              beschreibung = "next Bitmap Page"
              counter8 = 0
              } else { 
              beschreibung = "Index Page"
           }
        }
     }

     if ( vorige == 12 ) {
        beschreibung = "volle Data Page"
        counter8 = counter8 + counter
     }
 
     printf "     %10s    %10s  %-50s\n", vorige, counter, beschreibung
     vorige = $3
     counter = 1
  }
}
END { 
     if ( vorige == 0 ) {
        beschreibung = "Freie Page"
     }
 
     if ( vorige == 4 ) {
        beschreibung = "Data Page mit noch freien Platz"
     }

     if ( vorige == 8 ) {
        if ( NR == 1 ) {
           beschreibung = "Bitmap Page"
           } else {
           if ( counter8 == 4031 ) {
              beschreibung = "next Bitmap Page"
              } else { 
              beschreibung = "Index Page"
              counter8 = counter8 + counter
           }
        }
     }

     if ( vorige == 12 ) {
        beschreibung = "volles Data Page"
     }
 
     printf "     %10s    %10s  %-50s\n", vorige, counter, beschreibung
}
' tabelle=${TABLE} db=${DBASE}
rm $UNLOAD
