|
Archives of the TeradataForumMessage Posted: Fri, 04 Dec 2003 @ 22:23:51 GMT
Dear All, The FORUM is still quiet active, I came to check it after a pretty long time. I got the things working!!! :-) . Thanks to you all esp. Rudel, Vishal, Vivek and all others. I am posting the macro just for any future reference. It returns the following three answer sets: 1. Single column and single column indexes. 2. Multi column stats 3. Multi column index stats /*********************************************************************/ REPLACE MACRO GetStatsInfo ( DBName Varchar(30) ) AS ( /* Generate script for single column stats and single column index stats */ SELECT 'COLLECT STATISTICS ON '||TRIM(dbase.DatabaseName)||'.'||TRIM(tvm.TVMName)|| ( CASE WHEN TD.databasename IS NULL THEN ' COLUMN '||TRIM(tvfields.FieldName)||';' WHEN td.indexname is Null THEN ' INDEX ('||TRIM(tvfields.FieldName)||');' ELSE ' INDEX '||TRIM(td.indexname)||';' END) (TITLE '') FROM DBC.Dbase INNER JOIN DBC.TVM ON tvm.DatabaseId = dbase.DatabaseId INNER JOIN DBC.tvfields ON tvm.tvmid = tvfields.tableid LEFT JOIN ( SELECT databasename,tablename,IndexNumber,indexname,MIN(Columnname) AS COL FROM DBC.Indices GROUP BY 1,2,3,4 HAVING MIN(Columnname) = MAX(Columnname) OR IndexName IS NOT NULL) AS TD ON TD.databasename = dbase.DatabaseName AND TD.tablename = TVM.tvmname AND TD.COL = tvfields.FieldName WHERE tvfields.FieldStatistics IS NOT NULL AND Dbase.OwnerName IN ( Sel child From dbc.children Where parent = :DBName) ORDER BY dbase.DatabaseName, tvm.TVMName; /* Generate script for multi column stats It has a max of 17 columns used for collecting stats */ sel 'Collect stats on ' || trim(ms1.databasename) || '.' || = trim(ms1.tablename) || ' column ( ' , Case When ms1.ColumnName IS NOT NULL THEN ms1.ColumnName ELSE '' END, Case When ms2.ColumnName IS NOT NULL THEN ', ' || ms2.ColumnName ELSE '' END, Case When ms3.ColumnName IS NOT NULL THEN ', ' || ms3.ColumnName ELSE '' END, Case When ms4.ColumnName IS NOT NULL THEN ', ' || ms4.ColumnName ELSE '' END, Case When ms5.ColumnName IS NOT NULL THEN ', ' || ms5.ColumnName ELSE '' END, Case When ms6.ColumnName IS NOT NULL THEN ', ' || ms6.ColumnName ELSE '' END, Case When ms7.ColumnName IS NOT NULL THEN ', ' || ms7.ColumnName ELSE '' END, Case When ms8.ColumnName IS NOT NULL THEN ', ' || ms8.ColumnName ELSE '' END, Case When ms9.ColumnName IS NOT NULL THEN ', ' || ms9.ColumnName ELSE '' END, Case When ms10.ColumnName IS NOT NULL THEN ', ' || ms10.ColumnName ELSE '' END, Case When ms11.ColumnName IS NOT NULL THEN ', ' || ms11.ColumnName ELSE '' END, Case When ms12.ColumnName IS NOT NULL THEN ', ' || ms12.ColumnName ELSE '' END, Case When ms13.ColumnName IS NOT NULL THEN ', ' || ms13.ColumnName ELSE '' END, Case When ms14.ColumnName IS NOT NULL THEN ', ' || ms14.ColumnName ELSE '' END, Case When ms15.ColumnName IS NOT NULL THEN ', ' || ms15.ColumnName ELSE '' END, Case When ms16.ColumnName IS NOT NULL THEN ', ' || ms16.ColumnName ELSE '' END, ');' From dbc.multicolumnstats ms1 Left Outer Join dbc.multicolumnstats ms2 On (ms1.Databasename = ms2.Databasename And ms1.Tablename = ms2.Tablename And ms1.StatisticsId = ms2.StatisticsId And ms2.ColumnPosition = 2) Left Outer Join dbc.multicolumnstats ms3 On (ms1.Databasename = ms3.Databasename And ms1.Tablename = ms3.Tablename And ms1.StatisticsId = ms3.StatisticsId And ms3.ColumnPosition = 3) Left Outer Join dbc.multicolumnstats ms4 On (ms1.Databasename = ms4.Databasename And ms1.Tablename = ms4.Tablename And ms1.StatisticsId = ms4.StatisticsId And ms4.ColumnPosition = 4) Left Outer Join dbc.multicolumnstats ms5 On (ms1.Databasename = ms5.Databasename And ms1.Tablename = ms5.Tablename And ms1.StatisticsId = ms5.StatisticsId And ms4.ColumnPosition = 5) Left Outer Join dbc.multicolumnstats ms6 On (ms1.Databasename = ms6.Databasename And ms1.Tablename = ms6.Tablename And ms1.StatisticsId = ms6.StatisticsId And ms4.ColumnPosition = 6) Left Outer Join dbc.multicolumnstats ms7 On (ms1.Databasename = ms7.Databasename And ms1.Tablename = ms7.Tablename And ms1.StatisticsId = ms7.StatisticsId And ms4.ColumnPosition = 7) Left Outer Join dbc.multicolumnstats ms8 On (ms1.Databasename = ms8.Databasename And ms1.Tablename = ms8.Tablename And ms1.StatisticsId = ms8.StatisticsId And ms4.ColumnPosition = 8) Left Outer Join dbc.multicolumnstats ms9 On (ms1.Databasename = ms9.Databasename And ms1.Tablename = ms9.Tablename And ms1.StatisticsId = ms9.StatisticsId And ms4.ColumnPosition = 9) Left Outer Join dbc.multicolumnstats ms10 On (ms1.Databasename = ms10.Databasename And ms1.Tablename = ms10.Tablename And ms1.StatisticsId = ms10.StatisticsId And ms4.ColumnPosition = 10) Left Outer Join dbc.multicolumnstats ms11 On (ms1.Databasename = ms11.Databasename And ms1.Tablename = ms11.Tablename And ms1.StatisticsId = ms11.StatisticsId And ms4.ColumnPosition = 11) Left Outer Join dbc.multicolumnstats ms12 On (ms1.Databasename = ms12.Databasename And ms1.Tablename = ms12.Tablename And ms1.StatisticsId = ms12.StatisticsId And ms4.ColumnPosition = 12) Left Outer Join dbc.multicolumnstats ms13 On (ms1.Databasename = ms13.Databasename And ms1.Tablename = ms13.Tablename And ms1.StatisticsId = ms13.StatisticsId And ms4.ColumnPosition = 13) Left Outer Join dbc.multicolumnstats ms14 On (ms1.Databasename = ms14.Databasename And ms1.Tablename = ms14.Tablename And ms1.StatisticsId = ms14.StatisticsId And ms4.ColumnPosition = 14) Left Outer Join dbc.multicolumnstats ms15 On (ms1.Databasename = ms15.Databasename And ms1.Tablename = ms15.Tablename And ms1.StatisticsId = ms15.StatisticsId And ms4.ColumnPosition = 15) Left Outer Join dbc.multicolumnstats ms16 On (ms1.Databasename = ms16.Databasename And ms1.Tablename = ms16.Tablename And ms1.StatisticsId = ms16.StatisticsId And ms4.ColumnPosition = 16) Where ms1.databasename IN ( Sel child From dbc.children Where parent = :DBName) And ms1.ColumnPosition = 1; /* Generate script for multi column index stats */ SELECT 'COLLECT STATISTICS ON = '||TRIM(TD.DatabaseName)||'.'||TRIM(TD.tableName) (TITLE ''), ' INDEX('|| TRIM(TD.col1)||TRIM(TD.col2)||TRIM(TD.col3) (TITLE ''), ' = '||TRIM(TD.col4)||TRIM(TD.col5)||TRIM(TD.col6)||TRIM(TD.col7)||');' (TITLE '') FROM ( SELECT Indices.databasename,Indices.tablename,Indices.IndexNumber, MAX( CASE WHEN Columnposition = 1 THEN columnname Else '' END) AS COL1, MAX( CASE WHEN Columnposition = 2 THEN ','||TRIM(columnname) Else '' END) AS COL2, MAX( CASE WHEN Columnposition = 3 THEN ','||TRIM(columnname) Else '' END) AS COL3, MAX( CASE WHEN Columnposition = 4 THEN ','||TRIM(columnname) Else '' END) AS COL4, MAX( CASE WHEN Columnposition = 5 THEN ','||TRIM(columnname) Else '' END) AS COL5, MAX( CASE WHEN Columnposition = 6 THEN ','||TRIM(columnname) Else '' END) AS COL6, MAX( CASE WHEN Columnposition = 7 THEN ','||TRIM(columnname) Else '' END) AS COL7 FROM DBC.Indices ,( SELECT databasename,tablename,IndexNumber FROM DBC.Indexstats WHERE IndexName IS NULL AND IndexStatistics IS NOT NULL) AS TD1 WHERE Indices.IndexName IS NULL AND td1.databasename = Indices.databasename AND td1.tablename = Indices.tablename AND td1.IndexNumber = Indices.IndexNumber GROUP BY 1,2,3 Having MIN(ColumnPOSITION) < MAX(Columnposition)) AS TD ,DBC.Dbase WHERE TD.databasename = dbase.DatabaseName AND Dbase.OwnerName IN ( Sel child From dbc.children Where parent = :DBName) ORDER BY 1 ; ); /*****************************************************************/ The second query currently looks a bit crude, but didnot have enough time to fix it. May be some day later!!! My 2 AUDs for all those who responded!!! Cheers, Prabhjot.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||
Copyright 2016 - All Rights Reserved | ||||||||||||||||||||||||||||||||||||||||||||||||
Last Modified: 15 Jun 2023 | ||||||||||||||||||||||||||||||||||||||||||||||||