Como resolver o problema do limite de 2000 itens de lista consultados por uma query CAML em colunas indexadas do tipo Lookup no SharePoint

2012-08-31 Off Por gambin

Como resolver o problema do limite de 2000 itens de lista consultados por uma query CAML em colunas indexadas do tipo Lookup no SharePoint

Olá Pessoal!

Espera só um minutinho que eu também estou terminando de ler o título deste post 🙂

Mas afinal, o que significa tudo isso??

# Onde tudo começou!

Tudo começou quando precisei criar um site utilizado para controle e reserva de recursos.

Até aí tudo bem – criação de listas, bibliotecas, dataviews, event receivers, workflows e customização de forms prontas a fim de garantir a melhor usabilidade da ferramenta.

Dentro de poucos dias, tudo já estava testado, aprovado e pronto para ir em ambiente de produção! 😀

 

# Uma melhoria

Com o novo sistema em produção, #todosficafeliz, mas com o aumento da lista utilizada para armazenar o histórico e informações de futuras reservas, logo esta foi ganhando um volume considerável.

Como best practice, implementei a indexação das colunas mais utilizadas conforme recomendado pelas melhores fontes:

http://technet.microsoft.com/en-us/library/cc263028(v=office.12).aspx

Using indexed columns to improve view performance

As mentioned above, the performance of views degrades if the number of items displayed exceeds 2,000 items. A useful technique for limiting the number of items to display in a view is to index a column used in the view, and then to filter the view based on that column so that 2,000 or fewer items are displayed. (An indexed column is one that Office SharePoint Server 2007 maintains a record of to make view-related queries more efficient.)

 

Feitas as melhorias, começam os problemas. NOOOOOOOOOOOOO!!

 

# O(s) problema(s) 😕

Simplesmente o Event Receiver utilizado para de executar a validação de entrada de dados parou de funcionar, permitindo então a reserva de recursos em períodos conflitantes. Só isso!!!

Depois de alguns dias fritando o cérebro sobre todas as possibilidades, pude perceber que o problema não era nada do que eu estava pensando.

Maiores detalhes nesta thread: http://social.msdn.microsoft.com/Forums/is/sharepointdevelopment/thread/91a0ca31-4c05-4c24-8291-f9784f14ecf6?prof=required

 

# A causa raiz 😐

Este problema está relacionado diretamente quando você utiliza uma query CAML onde todas as condições abaixo são verdadeiras:

– Uma das colunas é do tipo Lookup

– Esta coluna lookup está indexada

– A lista possui mais de 2000 itens

Difícil foi chegar nesta conclusão ;p

 

# A solução 😉

Neste caso temos duas alternativas.

– No caso da query em CAML, basta substituirmos o tipo do valor de ‘Lookup‘ para ‘Integer‘. Ex:

<Value Type='Integer'>100</Value>

– Ou permanecer com a mesma query CAML apenas desabilitando a indexação da coluna lookup da lista.

 

# Lições Aprendidas

Não é porque é uma best practice que você pode aplicá-la sem testar o cenário idêntico (ou o mais próximo possível) em um ambiente de homologação.

Por este motivo, a indexação das colunas foi uma de minhas últimas preocupações, que poderia ser rapidamente resolvida.

 

# Agradecimentos e referências

Tudo isto que está no post foram baseados em fatos reais os responsáveis por me tirar algumas horas de sono a mais na última semana, no entanto acredito que não teria chegado a essa solução tão cedo se não fosse pela ajuda do pessoal do blog da BlackNinja Software.

Tá certo que este material foi escrito em 2009, mas essas coisas acontecem como o cometa halley – aparecem somente a cada 76 anos e quase ninguém conhece quem o tenha visto ;p

Portanto segue abaixo o link de referência e meu agradecimento a esses caras legais 😀

http://blackninjasoftware.com/2009/05/12/why-should-indexing-a-sharepoint-field-break-your-caml-query/

 

Abraços e até o próximo post!