/*************************************************************************
 * The contents of this file are subject to the Adempiere License.  You may
 * obtain a copy of the License at    http://www.adempiere.org/license.html 
 * Software is on an  "AS IS" basis,  WITHOUT WARRANTY OF ANY KIND, either 
 * express or implied. See the License for details. Code: Adempiere ERP+CRM
 * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
 *************************************************************************
 * $Id: DBA_Indexes.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
 ***
 * Title:	Rebuild Indexes in Tablespace USERS
 * Description:
 *		Ensure storage is PctIncrease 0 and MaxExtents Unlimited
 ************************************************************************/
DECLARE
	--	In wrong tablespace
	CURSOR Cur_Move IS
		SELECT	Index_Name
		FROM	USER_INDEXES
		WHERE	Index_Type<>'LOB'		--	no LOB
		  AND	TableSpace_Name != 'USERS';
	--	Fix Storage issues
	CURSOR Cur_Storage IS
		SELECT	Index_Name 
		FROM	USER_INDEXES
		WHERE	Index_Type<>'LOB'		--	no LOB
		  AND	Pct_Increase > 0 OR Max_Extents < 4097;
	--	Not Analyzed within the last 7 days
	CURSOR Cur_Stat IS
		SELECT	Index_Name
		FROM	USER_INDEXES
		WHERE	Index_Type<>'LOB'		--	no LOB 
		  AND DURATION IS NULL			--	no Temp Table
		  AND	(Last_Analyzed IS NULL OR Last_Analyzed < SysDate-7);
	--
	Cmd					VARCHAR2(256);
BEGIN
	FOR i IN Cur_Move LOOP
		DBMS_OUTPUT.PUT_LINE('Index ' || i.Index_Name || ' moved');
		Cmd := 'ALTER INDEX ' || i.Index_Name || ' REBUILD TABLESPACE USERS COMPUTE STATISTICS';
		EXECUTE IMMEDIATE cmd;
	END LOOP;
	FOR i IN Cur_Storage LOOP
		DBMS_OUTPUT.PUT_LINE('Index ' || i.Index_Name || ' storage fixed');
		Cmd := 'ALTER INDEX ' || i.Index_Name 
			|| ' STORAGE (PCTINCREASE 0 MAXEXTENTS UNLIMITED)';
		EXECUTE IMMEDIATE cmd;
	END LOOP;
	FOR i IN Cur_Stat LOOP
		DBMS_OUTPUT.PUT_LINE('Index ' || i.Index_Name || ' analyzed');
		Cmd := 'ALTER INDEX ' || i.Index_Name || ' REBUILD COMPUTE STATISTICS';
		EXECUTE IMMEDIATE cmd;
	END LOOP;
	COMMIT;
END;
/