I found this (http://blogs.msdn.com/crm/archive/2008/07/29/managing-size-of-asyncoperationbase-table-in-crm-4-0.aspx) very interesting article about the size of your MSCRM database.
Several GB were present in ours already, mostly because of the AsyncOperationBase table.
I had the change the code to get it working on my CRM 4. I remove the part about the operationtype to delete all kind of objects, but left it for this example. Here is the result:
QueryExpression expression = new QueryExpression();
expression.EntityName = EntityName.asyncoperation.ToString();
ColumnSet cs=new ColumnSet();
cs.Attributes=new string[] { "asyncoperationid" };
expression.ColumnSet = cs;
ConditionExpression cState = new ConditionExpression();
cState.AttributeName = "statecode";
cState.Operator = ConditionOperator.Equal;
cState.Values = new object[1];
cState.Values[0] = (int)AsyncOperationState.Completed;
ConditionExpression cCompletedon = new ConditionExpression();
cCompletedon.AttributeName = "completedon";
cCompletedon.Operator = ConditionOperator.OlderThanXMonths;
cCompletedon.Values = new object[1];
cCompletedon.Values[0] = 1;
ConditionExpression cOperationtype = new ConditionExpression();
cOperationtype.AttributeName = "operationtype";
cOperationtype.Operator = ConditionOperator.NotEqual;
cOperationtype.Values = new object[1];
cOperationtype.Values[0] =10;//(int)AsyncOperationType.Workflow;
FilterExpression fe = new FilterExpression();
fe.Conditions = new ConditionExpression[] { cState, cCompletedon, cOperationtype };
expression.Criteria = fe;
Guid[] emptyRecipients = new Guid[0];
BulkDeleteRequest request = new BulkDeleteRequest();
request.JobName = "Bulk delete completed asyncoperations to free up space";
request.QuerySet = new QueryBase[] { expression };
request.ToRecipients = emptyRecipients;
request.CCRecipients = emptyRecipients;
request.SendEmailNotification = false;
request.RecurrencePattern = string.Empty;
request.StartDateTime = new CrmDateTime();
//enable this code for recurring job
/*request.StartDateTime.Value = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
request.RecurrencePattern = "FREQ=DAILY;";//INTERVAL=7;*/
try
{
BulkDeleteResponse response =(BulkDeleteResponse)Service.Execute(request);
Response.Write(string.Format("Bulk delete job id: {0}", response.JobId));
}
catch (SoapException ex)
{
Response.Write(ex.ToString() + "
" + ex.Detail.InnerXml.ToString());
}