Um einen Überblick über die Füllstände von aller Benutzer/UserTabellen im Sybase IQ zu bekommen müsste man für jede Tabelle die Stored Procedure sp_iqtablesize ausführen. Das kann schnell mühsam werden. Mit der folgenden Stored Procedure geht das schneller. Allerdings benötigt die Procedure auch Ressourcen und sollte darum nur ausgeführt werden, wenn der IQ nicht oder nur wenige benutzt wird.
Mit dem beigefügten Event wird die Procedure sp_iqUserTableSize täglich um 1 Uhr Nachts ausgeführt.
-- -- Quelle: http://www.sybinfo.de/asiq/historie-und-abfrage-der-groessen-fuellstaende-von-usertabellen/ -- -- Autor: Frank Massholder -- Name: sp_iqUserTableSize -- Das Script ist für den freien Gebrauch "freeware" -- es wird jedoch keine Garantie darauf gegeben "no warentie" -- -- Erstelle eine Stored Procdedure, um die Größen/Füllstände der -- Benutzertabellen im Sybase IQ zu archivieren -- ALTER PROCEDURE sp_iqUserTableSize AS BEGIN DECLARE @TableName varchar(64) DECLARE @TblName varchar(64) DECLARE @TblOwner varchar(64) DECLARE @TblSize char(20) DECLARE @ControlTblName varchar(64) DECLARE @cntTblName int DECLARE @i int SELECT @TblName = ('TblName') SELECT @ControlTblName = ('ControTblName') SELECT @cntTblName = (SELECT count(*) FROM dbo.sp_iqtable()) DECLARE cur_TableName CURSOR FOR SELECT table_owner+'.'+table_name FROM dbo.sp_iqtable() ORDER BY table_owner FOR READ ONLY OPEN cur_TableName SET @i = 1 WHILE (@i <= @cntTblName) BEGIN FETCH NEXT cur_TableName INTO @TableName SELECT @ControlTblName = ( SELECT @TblName ) SELECT @TblName = ( SELECT Tablename FROM dbo.sp_iqtablesize(''+@TableName+'') ) SELECT @TblOwner = ( SELECT Ownername FROM dbo.sp_iqtablesize(''+@TableName+'') ) SELECT @TblSize = ( SELECT KBytes FROM dbo.sp_iqtablesize(''+@TableName+'') ) INSERT INTO DBA.TBL_UserTableSize ( LogDate , Ownername , Tablename , KBytes ) VALUES ( getdate() , ''+@TblOwner+'' , ''+@TblName+'' , ''+@TblSize+'' ) -- Wenn die Ausgabe auf dem isql Prompt ausgegeben werden soll, -- muss die PRINT-Anweisung auskommentiert werden. -- (Hinweis: Verwende für Sybase IQ besser dbisql oder squish als isql) -- PRINT @TblOwner || '.' || @TblName || ' SIZE: ' || @TblSize SET @i = @i + 1 END CLOSE cur_TableName DEALLOCATE CURSOR cur_TableName -- Lösche Daten, die älter als ein Jahr sind DELETE DBA.TBL_UserTableSize WHERE LogDate <= DATEADD(month, -12, getdate()) COMMIT END
-- -- Erstelle die Tabelle zur Archivierung der täglichen Füllstände aller Usertabellen -- CREATE TABLE TBL_UserTableSize ( LogDate date , Ownername varchar(128) NULL , Tablename varchar(128) NULL , KBytes char(20) ) -- -- Erstelle einen unique Index. -- Falls die SP händisch ausgeführt wird, verhindert er doppelte -- Einträge innerhalb eines Tages. -- CREATE UNIQUE INDEX idx_1 ON DBA.TBL_UserTableSize ( LogDate , Ownername , Tablename )
-- -- Quelle: http://www.sybinfo.de/asiq/historie-und-abfrage-der-groessen-fuellstaende-von-usertabellen/ -- -- Autor: Frank Massholder -- Name: ev_ArcUserTableSize -- Das Script ist für den freien Gebrauch "freeware" -- es wird jedoch keine Garantie darauf gegeben "no warentie" -- -- Erstelle ein Even, das die Stored Procedure einmal täglich -- um 1 Uhr Nachts ausführt. -- CREATE EVENT ev_ArcUserTableSize SCHEDULE START TIME '1:00AM' EVERY 24 HOURS ON ( 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') HANDLER BEGIN CALL sp_iqUserTableSize END -- -- Ein Select Statement, um die täglichen Größen der User-Tabellen abzufragen. -- SELECT convert(varchar(15), Ownername), convert(varchar(40), Tablename), KBytes FROM DBA.TBL_UserTableSize WHERE LogDate = getdate() ORDER BY convert(int, KBytes)
Hinweis: Das Script ist kostenlos und steht zur freien Verfügung. Es wird keinerlei Garantie dafür übernommen. Die Ausführung diese Quelltextes bitte erst nach ausgiebigen Tests auf einem Entwicklungs-Server in ein Produktionssystemen einspielen.