Entradas populares

CRM 4.0, tablas Worflowlogbase y AsynOperationbase muy grandes



Seguro que los que trabajáis con el CRM 4.0 de Microsoft, hace poco que os estáis peleando con el y abrís la base de datos vais a la base de datos que se llama _MSCRM, y vais a revisar estas dos tablas:
  • AsyncOperationBase
  • WorkflowLogBase

En las propiedades de las tablas mirad, en tamaño y número de filas de estas tablas, seguro que os lleváis una sorpresa.... ¿A que tienen un montón de registros y ocupan muchos MB? Los motivos que provocan esto:

  1. El CRM 4.0 por defecto no elimina los flujos de trabajo (workflows) que han finalizado por lo que en la tabla workflowlogbase, se almacena mucha información innecesaria

  2. La tabla Asyncoperationbase, se emplea para guardar información del servicio asincrónico del CRM (prometo que así lo llama microsoft) MSCRMAsyncService, lo que vuelve a provocar que se guarde mucha información innecesaria.

Los pasos que seguiremos serán los siguientes:
  1. El primer paso e IMPRESCINDIBLE, HACED UNA COPIA COMPLETA DE LAS BASES DE DATOS DEL CRM

  2. Modificaremos unas claves del registro, para evitar que los workflows finalizados se guarden en la base de datos

  3. Ejecutaremos unos unos scripts en la base de datos que vaciarán las tablas Worflowlogbase y Asyncoperationbase.

Bueno pues al lio...

1-Copia de seguridad

Esto..., me imagino que ya sois mayorcitos, y además si estáis leyendo este articulo voy a presuponer que ya sabeis como hacerla..., asi que me saltaré este paso...

2-Modificación del registro de Windows:
  • iremos a la siguiente rama del registro de Windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM

  • Revisaremos si existe la siguiente clave AsyncRemoveCompletedWorkflows en el caso de que exista pondremos el valor de esta clave a 1

  • En el caso de que no exista crearemos un registro de tipo DWORD con el nombre AsyncRemoveCompletedWorkflows con el valor de este registro a 1

  • Ejecutaremos desde la linea de comandos un iisreset, que reinicirá los servicios del IIS
¿Que hacemos al añadir o poner a uno la clave del registro AsyncRemoveCompletedWorkflows? Por defecto el CRM 4.0 guarda en la BBDD los flujos de trabajo o Workflows, que han finalizado, para la mayoría de nosotros esta información que se guarda en la base de datos no es necesaria, al poner este registro AsyncRemoveCompletedWorkflows con valor 1, a partir de ese momento los workflows finalizados no se guardarán en la BBDD

3-Ejecución de scripts para vaciar de información las tablas Worflowlogbase y Asyncoperationbase.

Ahora el CRM 4.0 ya no guardará más workflows que hayan finalizado, pero que hacemos con los registros de las tablas Workflowlobase y Asyncoperationbase, que seguro que son cientos, miles o con toda seguridad varios millones... bien no preocuparos... Comentaros que todos estos scripts los debeis ejecutar en la base de datos cuyo nombre será algo similar a esto _MSCRM

  • Debeis para el "servicio de Procesamiento asincrónico de Microsoft CRM"

  • Paso Segundo vamos a crear unos indices para optimizar la ejecución del script:
CREATE NONCLUSTERED INDEX CRM_WorkflowLog_AsyncOperationID ON [dbo].[WorkflowLogBase] ([AsyncOperationID])
GO

CREATE NONCLUSTERED INDEX CRM_DuplicateRecord_AsyncOperationID ON [dbo].[DuplicateRecordBase] ([AsyncOperationID])
GO

CREATE NONCLUSTERED INDEX CRM_BulkDeleteOperation_AsyncOperationID ON [dbo].[BulkDeleteOperationBase] (AsyncOperationID)
GO

  • Paso tercero, reconstruir y actualizar los siguiente indices:
ALTER INDEX ALL ON AsyncOperationBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
GO

ALTER INDEX ALL ON WorkflowLogBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
GO
  • Paso cuarto actualizar todas las estadísticas que se verán involucradas en las queries...
UPDATE STATISTICS [dbo].[AsyncOperationBase] WITH FULLSCAN
UPDATE STATISTICS [dbo].[DuplicateRecordBase] WITH FULLSCAN
UPDATE STATISTICS [dbo].[BulkDeleteOperationBase] WITH FULLSCAN
UPDATE STATISTICS [dbo].[WorkflowCompletedScopeBase] WITH FULLSCAN
UPDATE STATISTICS [dbo].[WorkflowLogBase] WITH FULLSCAN
UPDATE STATISTICS [dbo].[WorkflowWaitSubscriptionBase] WITH FULLSCAN

  • Paso quinto y último es la ejecución del script que realmente borrar la información superflua de estas dos tablas:

IF EXISTS (SELECT name from sys.indexes
WHERE name = N'CRM_AsyncOperation_CleanupCompleted')
DROP Index AsyncOperationBase.CRM_AsyncOperation_CleanupCompleted
GO
CREATE NONCLUSTERED INDEX CRM_AsyncOperation_CleanupCompleted
ON [dbo].[AsyncOperationBase] ([StatusCode],[StateCode],[OperationType])
GO

declare @DeleteRowCount int
Select @DeleteRowCount = 2000
declare @DeletedAsyncRowsTable table (AsyncOperationId uniqueidentifier not null primary key)
declare @continue int, @rowCount int
select @continue = 1
while (@continue = 1)
begin
begin tran
insert into @DeletedAsyncRowsTable(AsyncOperationId)
Select top (@DeleteRowCount) AsyncOperationId
from AsyncOperationBase
where OperationType in (1, 9, 12, 25, 27, 10) AND StateCode = 3 AND StatusCode in (30, 32)
Select @rowCount = 0
Select @rowCount = count(*) from @DeletedAsyncRowsTable
select @continue = case when @rowCount <= 0 then 0 else 1 end
if (@continue = 1)
begin
delete WorkflowLogBase from WorkflowLogBase W, @DeletedAsyncRowsTable d
where W.AsyncOperationId = d.AsyncOperationId
delete BulkDeleteFailureBase From BulkDeleteFailureBase B, @DeletedAsyncRowsTable d
where B.AsyncOperationId = d.AsyncOperationId
delete AsyncOperationBase From AsyncOperationBase A, @DeletedAsyncRowsTable d
where A.AsyncOperationId = d.AsyncOperationId
delete @DeletedAsyncRowsTable
end
commit
end

--Drop the Index on AsyncOperationBase

DROP INDEX AsyncOperationBase.CRM_AsyncOperation_CleanupCompleted


Una vez hecho esto ir a mirar el tamaño de estas dos tablas y veréis el resultado.....
Comentaros:

  • Que es imprescindible realizar los pasos previos de creación de indices, actualizar estadísticas etc... porque sino, va a tardar un mas de un siglo en acabar... (por experiencia propia lo digo, tuve que parar el script a la mitad de ejecución

  • No ejecutar estos scripts durante horas puntas de trabajo


Bueno pues ya está, ale ale, a ejecutar scripts y borrar información innecesaria de la base de datos....

Fuente:

0 comentarios: