#!/bin/sh
: '{{ TOOLDOC 1
/*
* NAME : ioptimise - optimise an Informix database
*
* USAGE : ioptimise [ <database> | <database> ... ]
*
* ARGUMENTS : <database> - name of a target database.
*
* DESCRIPTION : ioptimise optimises an Informix database.
*
* OPTIONS : none
*
* NOTES : none
*
* PERMS : 555
*
* STATUS : SUPPORTED
*
* SEE ALSO : OptimiseWholeDatabase
*
* SCCS ID : @(#)ioptimise 1.7
*
* DATED : 96/07/23 14:22:48
*
* CONTINUUS : %version : 1%
*
*/
'
: '
/*
*
* NAME : OptimiseWholeDatabase
*
* DESCRIPTION : Collects statistics for the whole database in an optimal way
* Reference Guide to 7.1 feature Enhancements
*
* PARAMETERS : database
*
* NOTES : this procedure has three parts to collecting the stats
* collect medium stats for the whole datasbase but ignore index
* distributions
*/'
OptimiseWholeDatabase()
{
echo "UPDATE STATISTICS MEDIUM DISTRIBUTIONS ONLY" | dbaccess "$1" >/dev/null 2>&1
# collect high stats for all first columns in indexes
# first create a script with the first sql statement
# then edit out the junk with sed
# then run the script
(
cat <<!
SELECT
'UPDATE STATISTICS HIGH FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.tabid > 99
AND c.part1 = b.colno
AND c.tabid = b.tabid
AND b.tabid = a.tabid
ORDER BY
tabname;
!
) | dbaccess "$1" 2>/dev/null | sed 's/.*[ ][ ]//' | dbaccess "$1" > /dev/null 2>&1
# similarly for this next script which collects stats for all indexed
# columns that are never the first column in an index
# i.e. ones that are not selected above
(
dbaccess "$1" <<!
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part2 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part2 = b.colno
AND c.part2 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part3 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part3 = b.colno
AND c.part3 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part4 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part4 = b.colno
AND c.part4 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part5 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part5 = b.colno
AND c.part5 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part6 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part6 = b.colno
AND c.part6 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part7 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part7 = b.colno
AND c.part7 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part8 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part8 = b.colno
AND c.part8 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part9 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part9 = b.colno
AND c.part9 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part10 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part10 = b.colno
AND c.part10 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid=a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part11 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part11 = b.colno
AND c.part11 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part12 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part12 = b.colno
AND c.part12 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part13 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part13 = b.colno
AND c.part13 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part14 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part14 = b.colno
AND c.part14 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part15 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part15 = b.colno
AND c.part15 > 0
AND c.tabid > 99
AND c.tabid = b.tabid
AND b.tabid = a.tabid
UNION
SELECT DISTINCT
'UPDATE STATISTICS LOW FOR TABLE ',
tabname,
'(',
colname,
');'
FROM
systables a,
syscolumns b,
sysindexes c
WHERE
c.part16 NOT IN (
SELECT
d.part1
FROM
sysindexes d
WHERE
c.tabid = d.tabid
)
AND c.part16 = b.colno
and c.part16 > 0
and c.tabid > 99
and c.tabid = b.tabid
and b.tabid = a.tabid
!
) 2>/dev/null | sed 's/.*[ ][ ]//' | dbaccess "$1" > /dev/null 2>&1
}
OptimiseWholeDatabase $1
exit 0

Last Updated