Como hemos comentado en anteriores post uno de los grandes problemas que tiene SharePoint es la velocidad en el tratamiento de los datos, ya sea para consulta ya sea para insertarlos en listas/bibliotecas. Para leer los datos hemos visto diversos aspectos de como mejorar y hacer que SharePoint tenga un acceso muy bueno en nuestras aplicaciones. Ahora bien en este post vamos a analizar y demostrar como podemos mejorar la inserción de los elementos en las listas.
Introducción
Porqué estamos interesado en mejorar la inserción, el proposito es claro existen diversas operaciones bien que requieren mayor rápidez que de costumbre o bien procesos de importar datos. Por ejemplo tenemos una lista de pedidos que queremos introducirla en nuestro sistema para que entre dentro de un Workflow de Trabajo. Esta lista de pedido pueden ser que nos vaya muy bien y tengamos que introducir 3.000 pedidos todas las noches.
¿De que forma nos costaría menos introducir 3.000 elementos en una lista de SharePoint?
1.- La primera forma que pensamos vamos a introducir estos 3.000 elementos utilizando la forma tradicional es decir de esta forma:
SPContext.Current.Web.AllowUnsafeUpdates = true; var list = SPContext.Current.Web.Lists.TryGetList(Lista); SPListItem item = list.AddItem(); item['Title']="Pedido"; item.Update();
Para ver cuanto tiempo estimado nos puede tardar vamos a lanzar un proceso que inserte estos 3.000 registros mediante una aplicación de Consola:
Console.WriteLine("Hora de Inicio" + DateTime.Now.ToShortTimeString()); SPSite site = new SPSite("http://demo"); SPWeb web = site.OpenWeb(); SPList list = web.Lists["Demo1"]; for (var i = 0; i < 3000; i++) { SPListItem item = list.AddItem(); item["Title"] = 1; item.Update(); } Console.WriteLine("Hora de Fin" + DateTime.Now.ToShortTimeString()); Console.ReadLine();
Tras un rato esperando los resultados son los siguientes:
Esperar 11 minutos para que tengamos que introducir los datos no creo que sea la mejor opción. Esto nos indica que como este proceso tengamos que tratar una gran cantidad de datos no es el método que tenemos que utilizar, para insertar un elemento en una lista, insertar 10 elementos puede tener un paso pero para operaciones de un volumen relativo no podemos utilizar esta opción más que nada por tiempo.
2.- La otra opción es utilizar la opción de insertar en Batch. Este proceso consiste en generar un XML en el que introducimos los elementos que queremos introducir y lo ejecutamos con el método ProcessBatchData y comprobamos cual es su velocidad. Para ello ejecutamos el siguiente código:
Console.WriteLine("Hora de Inicio" + DateTime.Now.ToShortTimeString()); SPSite site = new SPSite("http://demo"); SPWeb web = site.OpenWeb(); SPList list = web.Lists["Demo1"]; StringBuilder sbInsertScoreCard = new StringBuilder(); sbInsertScoreCard.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>"); web.AllowUnsafeUpdates = true; web.Update(); for (var i = 0; i < 3000; i++) { sbInsertScoreCard.AppendFormat("<Method ID=\"{0}\">" + "<SetList>{1}</SetList>" + "<SetVar Name=\"ID\">New</SetVar>" + "<SetVar Name=\"Cmd\">Save</SetVar>" + "<SetVar Name=\"{3}Title\">{2}</SetVar>" + "</Method>", "ScoreCard", list.ID, "urn:schemas-microsoft-com:office:office#", i); } sbInsertScoreCard.Append("</Batch>"); var mesage = web.ProcessBatchData(sbInsertScoreCard.ToString()); Console.WriteLine(mesage);
El XML a generar no tiene mucho misterio, por un lado indicamos la operación a realizar insertar/actualizar o eliminar. Y por otro lado indicamos la lista sobre la que lo vamos a realizar además de las columnas que se van a introducir en la lista.
Ahora bien si en estos 3.000 registros que introducimos hay alguno error como nos enteramos? De una forma simple en el método de ProcessBatchData nos devuelve un String en el que están los ID de los elementos introducidos y en caso de haber algún fallo se notifica también. Por lo que para controlar los errores se puede realizar de una forma muy simple.
Una vez lo ejecutamos y comprobamos que el coste total de insertar en una lista de SharePoint es de 4 minutos. Hemos disminuido en más de la mitad el tiempo de inserción. Es decir esto puede hacer que procesos relativamente pesados cueste mucho menos tiempo.
Resumen
Esta claro que SharePoint no esta ni pensado ni tiene como objeto tener la rapideza que un SQL Server nos puede proporcionar donde podemos insertar 3.000 registros en menos de 10 segundos, hay que contar que SharePoint esta montado sobre un SQL Server y que en todo el trasiego de información pues hay una perdida tanto de tiempo como de rendimiento que es lo que nos penaliza, ahora bien como comentamos en otros post en SharePoint hay muchas opciones de hacer las cosas y como en la vida misma no todo vale 🙂