PROJECT SERVER 2010. PROBLEMAS DE RENDIMIENTO EN PROJECT SERVER 2010 CUANDO AUMENTA EL NUMERO DE REGISTROS DE LAS SHADOW TABLES.

Hola, buenas

en este post queremos haceros partícipes del siguiente artículo:

https://support.microsoft.com/kb/2598007

Donde se mencionan los problemas de rendimiento que podemos tener cuando aumentan rápidamente el número de registros de las Shadow Tables.

Este hotfix administra el número de registros de la “tabla de sombra”, para que el número de registros no aumente demasiado.

Independientemente, nos indican la posibilidad de usar el siguiente script para  limpiar los registros de las “shadow tables” de manera genérica.

Antes de ejecutar el script, es conveniente tener en cuanta los siguientes puntos:

  • Realizar una copia de seguridad de las bases de datos de Project Server.
  • Para evitar problemas inesperados, relacionados con los datos de las bases de datos, es conveniente parar el Servicio de Cola de Project Server en los servidores de aplicación, cuando no haya habido actividad durante varias horas.
  • Es conveniente validar el script en un entorno de desarrollo o pruebas, usando una copia de seguridad restaurada de las bases de datos de Producción.
  • Monitorizar cuanto tiempo pasa para que se ejecute el script en el entorno mencionado anteriormente. El tiempo necesario para completar esto depende del servidor SQL Server y del número de registros que tengan que ser eliminados. Esto nos resultará útil para preparar la ventana de mantenimiento donde ejecutemos este plan de acción.

 

El script que mencionamos anteriomente es el siguiente:

      1.- Debemos ejecutar el siguiente script en las bases de datos de Draft y Published:

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

--Clean up       MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW
      IF object_id('tempdb..#TempTaskCFShadow') IS NOT NULL
      BEGIN 
      drop table #TempTaskCFShadow 
      END 
 
    CREATE table #TempTaskCFShadow (pid uniqueidentifier, tid uniqueidentifier, revCount int, mdpid uniqueidentifier)
     
      INSERT #TempTaskCFShadow (pid, tid, revCount, mdpid)
      SELECT PROJ_UID, TASK_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                        FROM MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW
                        GROUP BY PROJ_UID , TASK_UID, MD_PROP_UID
     
      DELETE
      FROM MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW
        FROM MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempTaskCFShadow AS newtable
      where originalTable.MD_PROP_UID = newtable.mdpid AND
      originalTable.PROJ_UID = newtable.pid AND
      originalTable.TASK_UID = newtable.tid AND
      originalTable.DELETED_REV_COUNTER <> newtable.revCount
                        
        DROP TABLE #TempTaskCFShadow
 
--Clean up MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW
      IF object_id('tempdb..#TempAssnCFShadow') IS NOT NULL
      BEGIN 
      drop table #TempAssnCFShadow 
      END
 
      CREATE table #TempAssnCFShadow (pid uniqueidentifier, asid uniqueidentifier, revCount int, mdpid uniqueidentifier)
     
      INSERT #TempAssnCFShadow (pid, asid, revCount, mdpid)
      SELECT PROJ_UID, assn_uid, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                        FROM MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW
                        GROUP BY PROJ_UID , ASSN_UID, MD_PROP_UID
     
      DELETE
      FROM MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW
        FROM MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempAssnCFShadow AS newtable
      where originalTable.MD_PROP_UID = newtable.mdpid AND
      originalTable.PROJ_UID = newtable.pid AND
      originalTable.ASSN_UID= newtable.asid AND
      originalTable.DELETED_REV_COUNTER <> newtable.revCount
                        
        DROP TABLE #TempAssnCFShadow
 
 
--Clean up       MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW
      IF object_id('tempdb..#TempProjResCFShadow') IS NOT NULL
      BEGIN 
      drop table #TempProjResCFShadow 
      END 
 
      CREATE table #TempProjResCFShadow (pid uniqueidentifier, resid uniqueidentifier, revCount int, mdpid uniqueidentifier)
     
      INSERT #TempProjResCFShadow (pid, resid, revCount, mdpid)
      SELECT PROJ_UID, RES_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                        FROM MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW
                        GROUP BY PROJ_UID , RES_UID, MD_PROP_UID
     
      DELETE
      FROM MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW
        FROM MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempProjResCFShadow AS newtable
      where originalTable.MD_PROP_UID = newtable.mdpid AND
      originalTable.PROJ_UID = newtable.pid AND
      originalTable.RES_UID = newtable.resid AND
      originalTable.DELETED_REV_COUNTER <> newtable.revCount
                        
      DROP TABLE #TempProjResCFShadow
     
 
--Clean up MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW
      IF object_id('tempdb..#TempProjCFShadow') IS NOT NULL
      BEGIN 
      drop table #TempProjCFShadow 
      END 
 
      CREATE table #TempProjCFShadow (pid uniqueidentifier, revCount int, mdpid uniqueidentifier)
     
      INSERT #TempProjCFShadow (pid, revCount, mdpid)
      SELECT PROJ_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                        FROM MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW
                        GROUP BY PROJ_UID , MD_PROP_UID   
     
      DELETE
      FROM MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW
        FROM MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempProjCFShadow AS newtable
      where originalTable.MD_PROP_UID = newtable.mdpid AND
      originalTable.PROJ_UID = newtable.pid AND
      originalTable.DELETED_REV_COUNTER <> newtable.revCount
            
        DROP TABLE #TempProjCFShadow

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

       2.- Después de ejecutar el script 1 en las bases de datos Draft y Published, debemos ejecutar el siguiente script, sólo en la base de datos Published:

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

--Clean up MSP_RES_CUSTOM_FIELD_VALUES_SHADOW
 
      IF object_id('tempdb..#TempResCFShadow') IS NOT NULL
      BEGIN 
      drop table #TempResCFShadow 
      END 
 
      CREATE table #TempResCFShadow (resid uniqueidentifier, revCount int, mdpid uniqueidentifier)
     
      INSERT #TempResCFShadow (resid, revCount, mdpid)
      SELECT RES_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                        FROM MSP_RES_CUSTOM_FIELD_VALUES_SHADOW
                        GROUP BY RES_UID, MD_PROP_UID
     
      DELETE
      FROM MSP_RES_CUSTOM_FIELD_VALUES_SHADOW
        FROM MSP_RES_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempResCFShadow AS newtable
      where originalTable.MD_PROP_UID = newtable.mdpid AND
      originalTable.RES_UID = newtable.resid AND
      originalTable.DELETED_REV_COUNTER <> newtable.revCount
            
        DROP TABLE #TempResCFShadow

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

Esperamos os resulte de interés, un saludo

 

Jorge Puig