Processamento Batch no SharePoint–Inserindo Itens em Lote no SharePoint

Imagine o seguinte cenário: você deseja executar várias operações de inclusão em uma lista SharePoint, seja por alguma necessidade de negócio ou para gerar uma massa de dados para teste. Como você faria? A resposta mais simples seria fazer uma função que insira um registro com dados aleatórios e chamar essa função N vezes. Isso irá funcionar, mas irá demandar bastante tempo. Se o SharePoint tivesse um meio de fazer com que a mesma operação fosse feita de maneira muito mais rápida, não seria interessante?

Neste post vamos ver um pouco sobre o processamento batch do SharePoint 2010.

Disclaimer: O objetivo do teste é ver a diferença entre os 2 métodos e não comparar a performance geral do processamento. O ambiente que testei executa no meu notebook, o que não pode ser considerado e nem comparado com dados reais de um ambiente corporativo.

Implementei uma web part que faz a inclusão de itens utilizando duas rotinas:

  • 1 por 1: método que insere itens na lista SharePoint fazendo uso do SPListItem e adicionando 1 por 1;
  • Batch: método que faz uso do método ProcessBatchData e adiciona todos os itens de uma vez (processamento batch)

 

A listagem 01 exibe o método criado para inserir os itens 1 por 1. Repare que a lista utilizada se chama ListaUmPorUm e tem apenas o campo título, que estamos preenchendo com a data e hora atual.

private void InserirUmItem()
{
    SPList list = SPContext.Current.Web.Lists["ListaUmPorUm"];
    SPListItem item = list.AddItem();
    item["Title"] = DateTime.Now.ToString();
    item.Update();
}

Listagem 01: Método que insere 1 item na lista SharePoint

 

A listagem 02 mostra a utilização do processo batch. Note que dentro do FOR está sendo montado o XML para enviar para o servidor, que possui diversos métodos (Method) com comandos e dados. O parâmetro SetList é o GUID da Lista em que os dados serão adicionados e o CMD informa o comando que será executado, no caso o SAVE. É possível construir um arquivo XML com diversos comando e dados, não apenas inserção de itens. Depois do XML montado, o método ProcessBatchData é executado e retorna uma string com o resultado. No nosso caso, irá retornar uma string com um XML informando todos os ID dos itens que foram criados. Em rotinas mais complexas, esses IDs podem ser lidos e processados com outros dados. No post Batch Delete em Listas e Bibliotecas do SharePoint – http://rodrigoromano.net/2011/10/13/batch-delete-em-listas-e-bibliotecas-do-sharepoint/ podemos ver como o método pode ser utilizado para deletar os itens de uma lista.

 

public string InserirItensBatch(int quantidade)
{
    StringBuilder comando = new StringBuilder();

    comando.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ows:Batch OnError=\"Return\">");

    for (int i = 0; i < quantidade; i++)
    {
        comando.Append(
            "<Method ID=\"A" + i.ToString() + "\">" +
                "<SetList>CBDFA40D-3471-4C02-987A-540CCAAB93DB</Setlist>" +
                "<SetVar Name=\"ID\">New</SetVar> " +
                "<SetVar Name=\"Cmd\">Save</SetVar> " +
                "<SetVar Name=\"urn:schemas-microsoft-com:office:office#Title\">" + DateTime.Now.ToString() + "</SetVar>" +
            "</Method>");
    }

    comando.Append("</ows:Batch>");

    return SPContext.Current.Web.ProcessBatchData(comando.ToString());
}

Listagem 02: Método que insere diversos itens em batch na lista SharePoint

 

A listagem 03 mostra as funções sendo chamadas para 1.000 itens. O objeto SPMonitoredScope está sendo utilizado para termos informação do tempo que a operação durou, ele irá exibi-la na Developer Dashboard (para saber mais sobre este objeto acesse o post https://fabiangehrke.com.br/2011/09/05/instrumentao-com-sharepoint-2010/).

protected void Button1_Click(object sender, EventArgs e)
{
    using (SPMonitoredScope scope = new SPMonitoredScope("InserirUmItem_1000"))
    {
        for (int i = 0; i < 1000; i++)
        {
            InserirUmItem();
        }
    }

    using (SPMonitoredScope scope = new SPMonitoredScope("InserirItensBatch_1000"))
    {
        InserirItensBatch(1000);
    }
}

Listagem 03: Clique do botão que chama a inserção 1 por 1 e batch

 

Os testes foram executados para 1, 1.000 e 10.000 itens e cada um deles foi executado 3 vezes para fins de comparação.

A tabela 01 mostra o resultado das execuções para inserir 1 item. Repare que houve muita diferença entre as 3 execuções, variou de 29 a 92%. Como para inserir 1 item a variação de tempo é muito impactante, não considero esse teste válido. A linha “Batch / 1 por 1” mostra a relação entre o tempo de execução de item a item como 100% e o método batch. Dessa forma a linha exibe o tempo do método batch em relação ao 1 por 1, ou seja, na primeira execução o batch levou 29,4% do tempo do 1 por 1.

Método Execução 1 (ms) Execução 2 (ms) Execução 3 (ms)

1 por 1

65,75

70,84

86,79

Batch

19,33

45,47

80,60

Batch / 1 por 1

29,40%

64,19%

92,83%

Tabela 01: Tempos coletados para a inserção de 1 item

 

A tabela 02 mostra o resultado para 1.000 itens e podemos ver que estamos perto de um padrão. Repare na última linha que o % é algo em torno de 51 a 58%, ou seja, o método batch levou de 51 a 58% do tempo que o método 1 por 1 levou.

Método

Execução 1 (ms)

Execução 2 (ms)

Execução 3 (ms)

1 por 1

23.288,71

26.533,74

24.002,08

Batch

13.457,84

13.631,29

13.926,73

Batch / 1 por 1

57,79%

51,37%

58,02%

Tabela 02: Tempos coletados para a inserção de 1.000 itens

 

Ao executar com 10.000 itens o padrão encontrado na execução de 1.000 se manteve bem próximo,  aqui tivemos tempos de 57 a 59%.

Método

Execução 1 (ms)

Execução 2 (ms)

Execução 3 (ms)

1 por 1

235.631,48

245.855,02

252.150,27

Batch

139.130,02

144.861,74

145.310,04

Batch / 1 por 1

59,05%

58,92%

57.63%

Tabela 03: Tempos coletados para a criação de 10.000 itens

 

Com os testes conseguimos chegar a uma conclusão: fazer via batch é um bocado mais rápido. No meu teste chegou a levar 51% do tempo, o que é quase a metade. Em outros ambiente (hardware, softwares, topologia) os resultados devem ser diferentes, mas provavelmente o método batch sempre irá ser mais performático. Pense nisso quando for fazer processos em massa em itens do SharePoint.

 

Referências

Anúncios

Uma resposta to “Processamento Batch no SharePoint–Inserindo Itens em Lote no SharePoint”

  1. Rodrigo Romano Says:

    Fabian, bem interessante esse resultado. Sabia que era mais performático, mas nunca tinha medido o quão performático é. 😀


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: