Entradas populares
-
Aquí os pongo una lista de los faros más altos del mundo: Faro Jeddah : este es el mayor favor que se ha construido nunca, está localizado e...
-
En el Reino Unido, han desvelado una maquina que tiene mas de 2000 años de antiguedad. Segun comentan empleando calculos matematicos babilo...
-
El cañón en cuestión (llamada DORA ) fue creado por la empresa Krupp durante la II Guerra Mundial. Hitler quería un arma capaz de "atra...
CRM 4.0, tablas Worflowlogbase y AsynOperationbase muy grandes
10:02 |
Publicado por
Killiam |
Editar entrada
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:
- 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
- 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:
- El primer paso e IMPRESCINDIBLE, HACED UNA COPIA COMPLETA DE LAS BASES DE DATOS DEL CRM
- Modificaremos unas claves del registro, para evitar que los workflows finalizados se guarden en la base de datos
- 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:
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].[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:
Suscribirse a:
Enviar comentarios (Atom)
0 comentarios:
Publicar un comentario