Informix OnLine Dynamic Server Handbook
BTW, the corrected version was shipped on the media accompanying the NT book.
#---------------------------------------------------------------------- # Copyright: Select Software Solutions Pty Ltd # Description: Program to create an update statistics sql file # using the recommended update statistics strategy # for Online Dynamic Server 7.2 # Developed by: Gavin Nour, Select Software Solutions Pty Ltd, 1996 # For assistance: call Select Software Solutions in Sydney, Australia # Gavin Nour mobile:0419 803 113. Email nourg@selectsoftware.com.au # # Additional comments from Gavin: # # this application can take 2 input parameters: # -d database_name # -o pathed_output_filename # # Without either parameter, the application will run against the sysmaster # database and output its results to /tmp/upd_stat.sql # #---------------------------------------------------------------------- DATABASE sysmaster MAIN DEFINE last_table,p_tabname LIKE systables.tabname, p_colname LIKE syscolumns.colname, p_head_or_comp_idx CHAR(1), scratch CHAR(2048), outfile CHAR(80), dname char(16), x , totargs SMALLINT LET dname = "sysmaster" LET outfile="/tmp/upd_stats.sql" #default output file LET totargs=NUM_ARGS() FOR x=1 TO totargs IF ARG_VAL(x) = "-d" THEN #specify database name with -d LET dname = ARG_VAL(x+1) DATABASE dname END IF IF ARG_VAL(x) = "-o" THEN #specify output file with -o LET outfile=ARG_VAL(x+1) END IF END FOR CREATE TEMP TABLE temp_schema ( tabname CHAR(18), tabid SMALLINT, colname CHAR(18), colno SMALLINT, head_or_comp_idx CHAR(1) ) CALL load_table() DECLARE get_tables CURSOR FOR SELECT tabname, colname, head_or_comp_idx FROM temp_schema ORDER BY tabname, head_or_comp_idx START REPORT create_sql_file TO outfile LET scratch="-- Update Statistics Report for the ", dname CLIPPED, " database" OUTPUT TO REPORT create_sql_file(scratch) LET scratch="-- Created: ", TODAY USING "mm/dd/yyyy" OUTPUT TO REPORT create_sql_file(scratch) LET last_table = "-" FOREACH get_tables INTO p_tabname, p_colname, p_head_or_comp_idx IF p_tabname <> last_table THEN LET scratch= "UPDATE STATISTICS MEDIUM FOR TABLE ", p_tabname CLIPPED, " DISTRIBUTIONS ONLY ;" OUTPUT TO REPORT create_sql_file(scratch) END IF IF p_head_or_comp_idx ="H" THEN LET scratch= "UPDATE STATISTICS HIGH FOR TABLE ", p_tabname CLIPPED, " (",p_colname CLIPPED,");" OUTPUT TO REPORT create_sql_file(scratch) END IF IF p_head_or_comp_idx ="C" THEN LET scratch= "UPDATE STATISTICS LOW FOR TABLE ", p_tabname CLIPPED, " (",p_colname CLIPPED,");" OUTPUT TO REPORT create_sql_file(scratch) END IF LET last_table=p_tabname END FOREACH FINISH REPORT create_sql_file END MAIN FUNCTION load_table() DEFINE p_tabname LIKE systables.tabname, p_tabid LIKE systables.tabid, x SMALLINT, scratch CHAR(2048) LET p_tabname = NULL FOR x=1 TO NUM_ARGS() LET scratch=ARG_VAL(x) IF scratch="-table" THEN LET p_tabname=ARG_VAL(x+1) EXIT FOR END IF END FOR IF p_tabname IS NOT NULL THEN LET scratch="SELECT tabname, tabid FROM systables WHERE tabname='", p_tabname CLIPPED,"'" ELSE LET scratch="SELECT tabname, tabid FROM systables WHERE tabid > 99" END IF PREPARE get_tab_prep FROM scratch DECLARE get_tab CURSOR FOR get_tab_prep FOREACH get_tab INTO p_tabname, p_tabid CALL get_col( p_tabname, p_tabid ) CALL get_idx(p_tabid ) END FOREACH END FUNCTION FUNCTION get_col( p_tabname ,p_tabid ) DEFINE p_tabname LIKE systables.tabname, p_tabid LIKE systables.tabid, p_colname LIKE syscolumns.colname, p_colno LIKE syscolumns.colno, scratch CHAR(2048) LET scratch = "SELECT colname ,colno FROM syscolumns WHERE tabid=",p_tabid PREPARE get_col_prep FROM scratch DECLARE get_col CURSOR FOR get_col_prep FOREACH get_col INTO p_colname, p_colno INSERT INTO temp_schema ( tabname, tabid, colname, colno , head_or_comp_idx ) VALUES ( p_tabname, p_tabid, p_colname, p_colno, NULL ) END FOREACH END FUNCTION FUNCTION get_idx(p_tabid) DEFINE p_tabid LIKE systables.tabid, p_colno LIKE syscolumns.colno, p_sysindexes RECORD LIKE sysindexes.* , scratch CHAR(2048), x SMALLINT LET scratch="SELECT * FROM sysindexes WHERE tabid=",p_tabid PREPARE get_idx_prep FROM scratch DECLARE get_idx CURSOR FOR get_idx_prep FOREACH get_idx INTO p_sysindexes.* #------------------------------------------------------------------- # Mark any column which heads an index #------------------------------------------------------------------- IF p_sysindexes.part1 IS NOT NULL THEN UPDATE temp_schema SET head_or_comp_idx="H" WHERE tabid=p_sysindexes.tabid AND colno=p_sysindexes.part1 END IF #------------------------------------------------------------------- # Mark any column which is in a composite index but is not the # leading column #------------------------------------------------------------------- FOR x=2 TO 16 #up to 16 columns in an index LET p_colno = get_part(x,p_sysindexes.*) IF p_colno=0 THEN #All columns have been dealt with EXIT FOR END IF LET scratch= "UPDATE temp_schema ", " SET head_or_comp_idx='C'", " WHERE tabid=",p_sysindexes.tabid, " AND head_or_comp_idx IS NULL", #do not overwrite a "H" " AND colno=",p_colno USING "<<<<" PREPARE upd_schema_prep FROM scratch EXECUTE upd_schema_prep END FOR #------------------------------------------------------------------- END FOREACH END FUNCTION FUNCTION get_part(x,p_sysindexes) DEFINE p_sysindexes RECORD LIKE sysindexes.*, x SMALLINT CASE x WHEN 2 RETURN p_sysindexes.part2 WHEN 3 RETURN p_sysindexes.part3 WHEN 4 RETURN p_sysindexes.part4 WHEN 5 RETURN p_sysindexes.part5 WHEN 6 RETURN p_sysindexes.part6 WHEN 7 RETURN p_sysindexes.part7 WHEN 8 RETURN p_sysindexes.part8 WHEN 9 RETURN p_sysindexes.part9 WHEN 10 RETURN p_sysindexes.part10 WHEN 11 RETURN p_sysindexes.part11 WHEN 12 RETURN p_sysindexes.part12 WHEN 13 RETURN p_sysindexes.part13 WHEN 14 RETURN p_sysindexes.part14 WHEN 15 RETURN p_sysindexes.part15 WHEN 16 RETURN p_sysindexes.part16 END CASE END FUNCTION REPORT create_sql_file ( scratch ) DEFINE scratch CHAR(2048) OUTPUT LEFT MARGIN 0 RIGHT MARGIN 0 BOTTOM MARGIN 0 TOP MARGIN 0 PAGE LENGTH 1 FORMAT ON EVERY ROW PRINT scratch CLIPPED END REPORT