none
rebuild reorgenize script LOG and explain RRS feed

  • שאלה

  • נא הגידו לי מה דעתכם :)   לאחר שתבדקו ותריצו את זה בסביבת הפיתוח שלכם  אם אתם מעוניינים בזאת :)

    הגירסא אצלי :    SQL 2005 STANDARD EDITION 

    היה לי צורך  ליצור LOG TABLE  שיגיד לי עבור כל טבלה   (שיש בה אינדקס) שעוברת  תהליך של defrag  או reorgenize

     מה היה המצב לפני   הפעולה ואחרי הפעולה + פרמטרים נוספים כגון משך הזמן שזה לקח  האם היה איחוי או בנייה מחדש וכדומה....

    אז קודם כל יצרתי טבלה לוג כזאת:  טבלה זאת תשמור את  הפרמטרים של האינדסים לפני ואחרי הפעולה של הבנייה או האיחוי.

    CREATE  TABLE  INDEX_FRAGMENTATION_LOG
    (
     DBNAME NVARCHAR (1000),
     TABLE_NAME NVARCHAR (1000),
     TBL_OBJECTID BIGINT,
     SCHEMA_NAME NVARCHAR(1000),
     INDEX_NAME NVARCHAR (1000),
     INDEX_ID INT,
     INDEX_TYPE NVARCHAR (1000),
     START_TIME DATETIME,
     END_TIME DATETIME ,
     IS_REBUILD_REORGENIZE INT,--0=REBUILD 1=REORGENIZE
     DURATION_MINTUES BIGINT,
     START_AVG_FRAG_IN_PERCENT FLOAT,
     START_FRAGMENT_COUNT BIGINT,
     START_AVG_FRAG_SIZE_IN_PAGES BIGINT,
     START_PAGE_COUNT BIGINT,
     START_INDEX_DEPTH INT,
     END_AVG_FRAG_IN_PERCENT FLOAT,
     END_FRAGMENT_COUNT BIGINT,
     END_AVG_FRAG_SIZE_IN_PAGES BIGINT,
     END_PAGE_COUNT BIGINT, 
     END_INDEX_DEPTH INT,
     REMARK NVARCHAR (1000)
     )

    לאחר מכן יצרתי פרצדורה בשם :  הפרצדורה מקבלת שם טבלה  או מערך של שמות בטבלאות ובודקת כל מיני פרמטרים ומחליטה אם לבנות את האינדקס או לאחות אותו

    הפרצדורה רושמת את נתוני האינדקס לפני ואחרי  בנייה / איחוי. (  הפרצדורה בודקת אם יש בכלל אינדקס בין היתר .....)

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: DBA -- Create date: 02\10\2012 -- Description: THIS PROC WILL GET AS PARAMETER -- TABLE NAME AND DECIDE TO REBUILD OR REORGENIZE INDEX --ON THIS TABLE ACCORDING TO FREGMANTION LEVEL --EXPLAIN : THIS PROC WILL DO THIS: --GET LIST OF TABLE TO WORK FOR --BRING FOR EVERY TABLE ALL INDEX BELONG TO --LOG FOR EVERY TABLE STATUS OF INDEX BEFORE WORKING AND AFTER WORKING --WORKING INDEX DEPENCE ON FRAG LEVEL OF THE INDEX. -- ============================================= ALTER PROCEDURE [dbo].[INDEX_MAINTENCE] --MUST SUPPLY SCHEMA TO TABLE NAME @TABLES_NAME NVARCHAR (1000) AS BEGIN SET NOCOUNT ON; --THIS TABLE HOLD INFORAMTION ABOUT INDEX BEFORE --AND AFTER MAINTENCE AND THEN LOG THIS INFORANTION TO PHYSICAL TABLE IN DB (FOR EVERY INDEX). CREATE TABLE #INDEX_FRAGMENTATION_LOG_TEMP ( ID INT IDENTITY, DBNAME NVARCHAR (1000), TABLE_NAME NVARCHAR (1000), TBL_OBJECTID BIGINT, SCHEMA_NAME NVARCHAR(1000), INDEX_NAME NVARCHAR (1000), INDEX_ID INT, --INDEX_ID=1 MAEN CLUSTER INDEX_TYPE NVARCHAR (1000), START_TIME DATETIME, END_TIME DATETIME , IS_REBUILD_REORGENIZE INT,--0=REBUILD 1=REORGENIZE DURATION_MINTUES BIGINT, START_AVG_FRAG_IN_PERCENT FLOAT, START_FRAGMENT_COUNT BIGINT, START_AVG_FRAG_SIZE_IN_PAGES BIGINT, START_PAGE_COUNT BIGINT, START_INDEX_DEPTH INT, --INDEX LAVEL END_AVG_FRAG_IN_PERCENT FLOAT, END_FRAGMENT_COUNT BIGINT, END_AVG_FRAG_SIZE_IN_PAGES BIGINT, END_PAGE_COUNT BIGINT, END_INDEX_DEPTH INT--INDEX LEVEL ) --THIS TABLE HOLD TABLE THAT WE GOING TO CHAK THEM DECLARE @TABLE_TO_FRAG TABLE ( ID INT IDENTITY (1,1), TABLE_NAME NVARCHAR (1000) ) -- ALL TABLE NAME INSERT TO TEMP TABLE INSERT @TABLE_TO_FRAG ( TABLE_NAME ) SELECT DATA AS OBJECTID FROM DBO.FN_SPLIT (@TABLES_NAME,',')

    -- HOLD INFORMATION TO LOG DECLARE @COMMAND AS NVARCHAR(4000) DECLARE @TABLE_NAME AS NVARCHAR (1000) DECLARE @OBJECTID BIGINT DECLARE @AVG_FRAGMENTATION_IN_PERCENT AS FLOAT DECLARE @AVG_FRAGMENT_SIZE_IN_PAGES AS FLOAT DECLARE @FRAGCOUNT AS FLOAT DECLARE @PAGE_COUNT AS FLOAT DECLARE @LOOP_OVER_TABLE AS INT SET @LOOP_OVER_TABLE=1 --START ANALYZE FIRST TABLE WHILE @LOOP_OVER_TABLE <=(SELECT MAX(ID) FROM @TABLE_TO_FRAG) BEGIN SET @TABLE_NAME= (SELECT TABLE_NAME FROM @TABLE_TO_FRAG WHERE ID=@LOOP_OVER_TABLE) SET @OBJECTID =(SELECT TOP 1 OBJECT_ID FROM SYS.OBJECTS WHERE TYPE LIKE 'U' AND [NAME]=@TABLE_NAME) IF @OBJECTID IS NULL BEGIN INSERT INTO [TRAFFILOG_MAIN].[dbo].[INDEX_FRAGMENTATION_LOG] ([DBNAME] ,[TABLE_NAME] ,[INDEX_ID] ,[REMARK] ) SELECT DB_NAME() ,@TABLE_NAME ,-2 --NOT SUCH TABLE MAKE SHURE TO ADD SCHEMA NAME BEFORE TALBE NAME ,'NOT SUCH TABLE NAME' END --@OBJECTID IS NULL ELSE BEGIN --IF TABLE NOT CONTAIN INDEX IF NOT EXISTS --4 (SELECT INDEX_ID FROM SYS.INDEXES WHERE [OBJECT_ID]=@OBJECTID AND INDEX_ID > 0 ) BEGIN INSERT INTO [TRAFFILOG_MAIN].[dbo].[INDEX_FRAGMENTATION_LOG] ([DBNAME] ,[TABLE_NAME] ,[INDEX_ID] ,[REMARK] ) SELECT DB_NAME() ,@TABLE_NAME ,-1 --TABLE NOT CONTAIN ANY INDEX ,'THIS TABLE NOT CONTAIN ANY INDEX' END --TABLE NOT CONTAIN INDEX ELSE --START ANALYZE INDEXES BEGIN --START IMPORT ALL INDEX THAT BELONG TO SPECIFIC TABLE WITH DATA ABOUT THE INDEX INSERT INTO #INDEX_FRAGMENTATION_LOG_TEMP ( [DBNAME] ,[TABLE_NAME] ,[TBL_OBJECTID] ,[SCHEMA_NAME] ,[INDEX_NAME] ,[INDEX_ID] ,[INDEX_TYPE] ,[START_AVG_FRAG_IN_PERCENT] ,[START_FRAGMENT_COUNT] ,[START_AVG_FRAG_SIZE_IN_PAGES] ,[START_PAGE_COUNT] ,[START_INDEX_DEPTH] ) SELECT DB_NAME (FRAG.DATABASE_ID) ,@TABLE_NAME AS TABLE_NAME ,FRAG.OBJECT_ID, SC.NAME ,INDEXES.NAME ,FRAG.INDEX_ID --ANALYZE THIS TO CHECK IF TABLE HAS CLUSTER ,FRAG.INDEX_TYPE_DESC ,FRAG.AVG_FRAGMENTATION_IN_PERCENT ,FRAG.FRAGMENT_COUNT ,FRAG.AVG_FRAGMENT_SIZE_IN_PAGES ,FRAG.PAGE_COUNT ,FRAG.INDEX_DEPTH FROM sys.dm_db_index_physical_stats (DB_ID(), @OBJECTID, NULL , NULL, 'LIMITED') AS FRAG INNER JOIN SYS.INDEXES INDEXES ON INDEXES.OBJECT_ID=FRAG.OBJECT_ID AND INDEXES.INDEX_ID=FRAG.INDEX_ID --NOT CONSIDER HEAP THIS IS NO INDEX !!! --FRAG 10 ITS OK FRAGMENTATION --AND FRAG.index_id > 0 --AND avg_fragmentation_in_percent > 10.0 INNER JOIN sys.objects OBJECTS ON OBJECTS.OBJECT_ID=INDEXES.OBJECT_ID INNER JOIN SYS.SCHEMAS SC ON SC.SCHEMA_ID=OBJECTS.SCHEMA_ID --END IMPORT ALL INDEX THAT BELONG TO SPECIFIC TABLE --CHECK IF TABLE HAVE AT LEAST ONE INDEX THAT SHOULD REBUIOLD OR REORGENIZE --IF EXISTS START HANDLE INDEX ON THIS TABLE --IF EXISTS (SELECT TOP 1 ID FROM #INDEX_FRAGMENTATION_LOG_TEMP ) --BEGIN --START ANALYZE EVERY INDEX IN CURRENT TABLE : IN THIS SECTION INDEX MUST REBUILD OR REORGENIZE --INNER LOOP ON INDEX ON ANY TABLE DECLARE @INDEXID INT DECLARE @IS_BUILD_REORGENIZE INT -- 1 BUILD --0 REOR DECLARE @INDEX_NAME NVARCHAR (2000) DECLARE @FRAG_LEVEL FLOAT DECLARE @START_BUILD_INDEX DATETIME DECLARE @SCHEMA_NAME NVARCHAR (1000) DECLARE @END_INDEX_DEPTH INT DECLARE @INNER_LOOP INT SET @INNER_LOOP=1 -- SELECT * FROM #INDEX_FRAGMENTATION_LOG_TEMP -- LOOP OVER TABLE INDEXES WHILE @INNER_LOOP <= (SELECT MAX (ID) FROM #INDEX_FRAGMENTATION_LOG_TEMP) BEGIN SET @START_BUILD_INDEX = GETDATE() --BRING ALL INDEX INFORMATION FOR SPECIFIC TABLE ON CURRENT TABLE WE CHECK BEFORE MAINTENCE SELECT @INDEXID=INDEX_ID, @INDEX_NAME= INDEX_NAME , @FRAG_LEVEL=START_AVG_FRAG_IN_PERCENT, @SCHEMA_NAME=SCHEMA_NAME FROM #INDEX_FRAGMENTATION_LOG_TEMP WHERE ID=@INNER_LOOP IF @FRAG_LEVEL > 10.0 AND @INDEXID >0 BEGIN IF @FRAG_LEVEL < 30.0 AND @FRAG_LEVEL > 10.0 BEGIN SET @IS_BUILD_REORGENIZE=0 --JUST INFORAMTION SET @command = N'ALTER INDEX [' + @INDEX_NAME + N'] ON ' + @SCHEMA_NAME+'.' + @TABLE_NAME + N' REORGANIZE'; -- PRINT N'ALTER INDEX ' + @INDEX_NAME + ' ON [' + @SCHEMA_NAME+'.' + @TABLE_NAME + N'] REORGANIZE';--N'ALTER INDEX ' + @INDEX_NAME + @SCHEMA_NAME+'.' ' ON ' + @SCHEMA_NAME+'.' @TABLE_NAME + N' REORGANIZE' END IF @FRAG_LEVEL >= 30.0 BEGIN SET @IS_BUILD_REORGENIZE=1 ----JUST INFORAMTION SET @command = N'ALTER INDEX [' +@INDEX_NAME+ N'] ON ' + @SCHEMA_NAME+'.' + @TABLE_NAME + N' REBUILD'; -- PRINT N'ALTER INDEX ' + @INDEX_NAME + N' ON [' + @SCHEMA_NAME+'.' + @TABLE_NAME + N'] REBUILD'; END EXEC (@command); -- UPDATE INFORAMTION ABOUT NEW INDEX THAT WE WORKING OF HIM SELECT @AVG_FRAGMENTATION_IN_PERCENT= FRAG.AVG_FRAGMENTATION_IN_PERCENT ,@FRAGCOUNT=FRAG.FRAGMENT_COUNT ,@AVG_FRAGMENT_SIZE_IN_PAGES= FRAG.AVG_FRAGMENT_SIZE_IN_PAGES ,@PAGE_COUNT=FRAG.PAGE_COUNT ,@END_INDEX_DEPTH=FRAG.INDEX_DEPTH -- TABLE_ID FROM sys.dm_db_index_physical_stats (DB_ID(), @OBJECTID, NULL , NULL, 'LIMITED') AS FRAG INNER JOIN SYS.INDEXES INDEXES --OBJECT_ID MEAN TABLE ID ON INDEXES.OBJECT_ID=FRAG.OBJECT_ID AND INDEXES.INDEX_ID=FRAG.INDEX_ID --WORKING ON CURRENT INDEX WHERE INDEXES.INDEX_ID= @INDEXID -- @INDEX_ID TAKEN FROM INNER LOOP UPDATE #INDEX_FRAGMENTATION_LOG_TEMP SET [END_AVG_FRAG_IN_PERCENT]=@AVG_FRAGMENTATION_IN_PERCENT ,[END_AVG_FRAG_SIZE_IN_PAGES]=@AVG_FRAGMENT_SIZE_IN_PAGES ,[END_FRAGMENT_COUNT]=@FRAGCOUNT ,[END_PAGE_COUNT]=@PAGE_COUNT ,END_INDEX_DEPTH=@END_INDEX_DEPTH ,[START_TIME]=@START_BUILD_INDEX ,END_TIME=GETDATE() WHERE ID=@INNER_LOOP --INSERT INFORAMTION TO TABLE IN DB INSERT INTO [TRAFFILOG_MAIN].[dbo].[INDEX_FRAGMENTATION_LOG] ([DBNAME] ,[TABLE_NAME] ,[TBL_OBJECTID] ,[SCHEMA_NAME] ,[INDEX_NAME] ,[INDEX_ID] ,[INDEX_TYPE] ,[START_TIME] ,[END_TIME] ,[IS_REBUILD_REORGENIZE] ,[DURATION_MINTUES] ,[START_AVG_FRAG_IN_PERCENT] ,[START_FRAGMENT_COUNT] ,[START_AVG_FRAG_SIZE_IN_PAGES] ,[START_PAGE_COUNT] ,[START_INDEX_DEPTH] ,[END_AVG_FRAG_IN_PERCENT] ,[END_FRAGMENT_COUNT] ,[END_AVG_FRAG_SIZE_IN_PAGES] ,[END_PAGE_COUNT] ,[END_INDEX_DEPTH] ,[REMARK]) SELECT [DBNAME] ,[TABLE_NAME] ,[TBL_OBJECTID] ,[SCHEMA_NAME] ,[INDEX_NAME] ,[INDEX_ID] ,[INDEX_TYPE] ,@START_BUILD_INDEX ,GETDATE() ,@IS_BUILD_REORGENIZE --IN THIS POINT MUST BE REBUILD OR REORGENIZE ,DATEDIFF (MI,@START_BUILD_INDEX,GETDATE()) ,[START_AVG_FRAG_IN_PERCENT] ,[START_FRAGMENT_COUNT] ,[START_AVG_FRAG_SIZE_IN_PAGES] ,[START_PAGE_COUNT] ,[START_INDEX_DEPTH] ,[END_AVG_FRAG_IN_PERCENT] ,[END_FRAGMENT_COUNT] ,[END_AVG_FRAG_SIZE_IN_PAGES] ,[END_PAGE_COUNT] ,@END_INDEX_DEPTH ,'INDEX FIX' FROM #INDEX_FRAGMENTATION_LOG_TEMP WHERE ID=@INNER_LOOP -- FINISH INSERT DATA TO LOG TABLW END ---> 10.0 AND @INDEXID >0 ELSE-- FRAG LEVEL BEGIN --JUST LOG NO NEED TO WORK ON THIS INDEX OR TABLE HAVE INDEX BUT TABLE IS IN HEAP INSERT INTO [TRAFFILOG_MAIN].[dbo].[INDEX_FRAGMENTATION_LOG] ([DBNAME] ,[TABLE_NAME] ,[TBL_OBJECTID] ,[SCHEMA_NAME] ,[INDEX_NAME] ,[INDEX_ID] ,[INDEX_TYPE] ,[START_TIME] ,[END_TIME] ,[IS_REBUILD_REORGENIZE] ,[DURATION_MINTUES] ,[START_AVG_FRAG_IN_PERCENT] ,[START_FRAGMENT_COUNT] ,[START_AVG_FRAG_SIZE_IN_PAGES] ,[START_PAGE_COUNT] ,[START_INDEX_DEPTH] ,[END_AVG_FRAG_IN_PERCENT] ,[END_FRAGMENT_COUNT] ,[END_AVG_FRAG_SIZE_IN_PAGES] ,[END_PAGE_COUNT] ,[END_INDEX_DEPTH] ,[REMARK]) SELECT [DBNAME] ,[TABLE_NAME] ,[TBL_OBJECTID] ,[SCHEMA_NAME] ,[INDEX_NAME] ,[INDEX_ID] ,[INDEX_TYPE] ,@START_BUILD_INDEX ,GETDATE() ,@IS_BUILD_REORGENIZE --IN THIS POINT MUST BE REBUILD OR REORGENIZE ,DATEDIFF (MI,@START_BUILD_INDEX,GETDATE()) ,[START_AVG_FRAG_IN_PERCENT] ,[START_FRAGMENT_COUNT] ,[START_AVG_FRAG_SIZE_IN_PAGES] ,[START_PAGE_COUNT] ,[START_INDEX_DEPTH] ,[END_AVG_FRAG_IN_PERCENT] ,[END_FRAGMENT_COUNT] ,[END_AVG_FRAG_SIZE_IN_PAGES] ,[END_PAGE_COUNT] ,@END_INDEX_DEPTH ,CASE WHEN @INDEXID > 0 THEN 'NO NEED TO FIX THIS INDEX FRAG LEVEL < 10' ELSE 'TABLE IS IN HEAP NOTHING TO WORK FOR' END FROM #INDEX_FRAGMENTATION_LOG_TEMP WHERE ID=@INNER_LOOP -- FINISH INSERT DATA TO LOG TABLE END --7 FRAG LEVEL CONDITION SET @INNER_LOOP=@INNER_LOOP + 1 END --END INNER LOOP --OUT OF INNER LOOP DELETE FROM #INDEX_FRAGMENTATION_LOG_TEMP --DELETE DATA ABOUT CURRENT INDEX WE WORK FOR ( WE ALLREADY LOG IT) END -- --::ELSE --START ANALYZE INDEXES IF TABLE HAVE INDEX END --::IF TABLE NOT CONTAIN INDEX --MUST RESEED FOR INNER LOOP DBCC CHECKIDENT (#INDEX_FRAGMENTATION_LOG_TEMP, reseed, 0) SET @LOOP_OVER_TABLE=@LOOP_OVER_TABLE+1 -- GO TO NEXT TABLE END --OUTERLOOP GO TO NEXT TABLE DROP TABLE #INDEX_FRAGMENTATION_LOG_TEMP END GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO


    יש להתקין את הפונקציה הבאה בנוסף :    (בשביל  לפצל מערך של  שמות טבלאות )

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[FN_SPLIT]  
    (  
     @RowData varchar(MAX),  
     @delimiter varchar(5)  
    )    
    RETURNS @RtnValue table   
    (  
     Id int identity(1,1),  
     Data nvarchar(MAX)  
    )   
    AS
    BEGIN   
     Declare @Cnt int  
     Set @Cnt = 1  
      
     While (Charindex(@delimiter,@RowData)>0)  
     Begin  
      Insert Into @RtnValue (data)  
      Select   
       Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@delimiter,@RowData)-1)))  
      
      Set @RowData = Substring(@RowData,Charindex(@delimiter,@RowData)+1,len(@RowData))  
      Set @Cnt = @Cnt + 1  
     End  
       
     Insert Into @RtnValue (data)  
     Select Data = ltrim(rtrim(@RowData))  
      
     Return  
    END
    GO
    SET ANSI_NULLS OFF
    GO
    SET QUOTED_IDENTIFIER OFF
    GO

    אשמח לשמוע פידבקים הערות והארות לשיפורים.

    שרון

     יצרתי פרצדורה שמקבלת כפרמטר שם טבלה   (או מערך של שמות)  ועושה REBIULD  או REORGENIZE  לאינדקסים בטבלה 

    יום חמישי 04 אוקטובר 2012 10:37

תשובות

  • אהלן חבר,

    האמת שזה סקריפט חביב :)!

    השאלה האמיתית היא למה לא לשבור תראש ולהמציא את הגלגל ?

    בו נגיד שואללה הסקריפט הוא בחיתוליו אני חושב וקצת מפריע לי הקטע שחובה לשלוח לו טבלה/טבלאות ספציפיות והוא לא יודע להתמודד עם הDB/כל הDB באינסנטס ולבצע את
    הדיפרג הנדרש...
    יש מספר דברים גם שהוא לא מכסה שעולים לי כמו לדוגמא:

    • ניהול שגיאות בTRY/CATCH
    • בניית האינדקס בהתאם לגרסאת הINSTANCE עם אפשרויות מיוחדות: ONLINE/OFFLINE
    • בדיקה האם יש LOBS באינדקס ובמידה וכן אז לא ניתן בכלל לבנות בתצורה של ONLINE עד גרסאת 2012 לדעתי
    • לוג שכולל גם שגיאות במידה והפעולה הנדרשת לא הצליחה
    • ובאופן כללי קונפיגורציה רחבה יותר של כל תהליך התחזוקה הנ"ל :)

    אז לאן אני חותר ?
    שבאמת אין צורך להמציא את הגלגל, הוא כבר הומצא בהמון גרסאות ע"י הרבה מאוד DBA אדירים וותיקים פשוט צריך לקחת את הכח ולדעת איך להתשמש בו לדעתי.

    אני משתמש בעקרון בסקריפט מכאן :

    http://sqlfool.com/2011/06/index-defrag-script-v4-1/

    הוא דיי מורכב האמת בגלל כמות האפשרויות שיש בו, אבל יש פירוט בצורה טובה מאוד על כל פרט ופרט בסקריפט.

    אני קצת שיניתי אותו וקינפגתי את הסקריפט על פי הצרכים שלי ומצאתי מעט באגים אבל זה היה הרבה יותר פשוט לתקן את ה"מכונת זמן" הזאת מאשר לבנות מכונת זמן חדשה :)

    בכל אופן אני בטוח שהייתה לך התנסות מפנקת בלבנות את הסקריפט בכל זאת אז לא הפסדת שום דבר!

    בברכה וחג שמחה ומפנק,


    חיים פישנר.

    • סומן כתשובה על-ידי Eran Sharvit יום רביעי 10 אוקטובר 2012 14:29
    יום שישי 05 אוקטובר 2012 12:20

כל התגובות

  • קריאה לפרצדורה תתבצע כך:

              [dbo].[INDEX_MAINTENCE]

    'TABLE_NAME'


    יום חמישי 04 אוקטובר 2012 10:42
  • אהלן חבר,

    האמת שזה סקריפט חביב :)!

    השאלה האמיתית היא למה לא לשבור תראש ולהמציא את הגלגל ?

    בו נגיד שואללה הסקריפט הוא בחיתוליו אני חושב וקצת מפריע לי הקטע שחובה לשלוח לו טבלה/טבלאות ספציפיות והוא לא יודע להתמודד עם הDB/כל הDB באינסנטס ולבצע את
    הדיפרג הנדרש...
    יש מספר דברים גם שהוא לא מכסה שעולים לי כמו לדוגמא:

    • ניהול שגיאות בTRY/CATCH
    • בניית האינדקס בהתאם לגרסאת הINSTANCE עם אפשרויות מיוחדות: ONLINE/OFFLINE
    • בדיקה האם יש LOBS באינדקס ובמידה וכן אז לא ניתן בכלל לבנות בתצורה של ONLINE עד גרסאת 2012 לדעתי
    • לוג שכולל גם שגיאות במידה והפעולה הנדרשת לא הצליחה
    • ובאופן כללי קונפיגורציה רחבה יותר של כל תהליך התחזוקה הנ"ל :)

    אז לאן אני חותר ?
    שבאמת אין צורך להמציא את הגלגל, הוא כבר הומצא בהמון גרסאות ע"י הרבה מאוד DBA אדירים וותיקים פשוט צריך לקחת את הכח ולדעת איך להתשמש בו לדעתי.

    אני משתמש בעקרון בסקריפט מכאן :

    http://sqlfool.com/2011/06/index-defrag-script-v4-1/

    הוא דיי מורכב האמת בגלל כמות האפשרויות שיש בו, אבל יש פירוט בצורה טובה מאוד על כל פרט ופרט בסקריפט.

    אני קצת שיניתי אותו וקינפגתי את הסקריפט על פי הצרכים שלי ומצאתי מעט באגים אבל זה היה הרבה יותר פשוט לתקן את ה"מכונת זמן" הזאת מאשר לבנות מכונת זמן חדשה :)

    בכל אופן אני בטוח שהייתה לך התנסות מפנקת בלבנות את הסקריפט בכל זאת אז לא הפסדת שום דבר!

    בברכה וחג שמחה ומפנק,


    חיים פישנר.

    • סומן כתשובה על-ידי Eran Sharvit יום רביעי 10 אוקטובר 2012 14:29
    יום שישי 05 אוקטובר 2012 12:20
  •  היי תודה על הערות אני אקח לתשומת ליבי

    שרון

    יום רביעי 10 אוקטובר 2012 08:11