domingo, 3 de abril de 2016

Los secretos de las listas de SharePoint (2003,2007,2010,2013)

Investigando y evaluando la lentitud de una granja de SharePoint me llevo a indagar como SharePoint almacena las listas y aunque ya lo sabia no me habia percatado de lo siguiente:
Todas las listas de SharePoint se almacena en una sola tabla llamada AllLists en la base de datos de contenido (WSS_Content_????????????).


Segundo hallazgo todos los elementos de todas las listas incluyen las bibliotecas (que son listas especializadas) se almacenan un una sola lista llamada AllDocs.

Tercer hallazgo y aún mas revelador, los elementos eliminados permenecen en la lista hasta que el proceso de papelera de reciclaje los elimine en algún momento.  Observen lo siguiente:

En la Interfaz Web la lista aparece sin elementos
Pero a nivel de base de datos es otra historia Al ejecutar los siguientes Comandos T-SQL :

SELECT
*
FROM [WSS_Content_Reuniones].[dbo].[AllLists]
where --tp_Title like '%factura%'
tp_id = '00DA3DE4-D8AF-4EF1-A956-E44CBFEF1012'
SELECT count(*) as totalelements
FROM [WSS_Content_Reuniones].[dbo].[AllDocs]
where ListId = '00DA3DE4-D8AF-4EF1-A956-E44CBFEF1012'



Entonces si realizamos cargas grandes de documentos o elementos de las listas, aunque los eliminemos impactaran las cargas futuras de los elmentos y en las consultas que se hagan a la tabla.
Ahora cual es el campo que identifica si fue eliminado un elemento de la lista.  Veamos la siguiente consulta

SELECT
*
FROM [WSS_Content_Reuniones].[dbo].[AllDocs]
where ListId = '00DA3DE4-D8AF-4EF1-A956-E44CBFEF1012'
AND LEN(DeleteTransactionId) = 0




El campo es el DeleteTransacionId que si la logintud = 0 quiere decir que no esta eliminado, y lo único no eliminado es el encabezado de la lista y las páginas de la lista.
Para eliminar de la papelera de reciclaje los elementos podemos ejecutar las siguientes lineas:

$site = Get-SPSite http://sp2013man/sites/prueba
$site.RecycleBin | where {$_.DirName -like '*pruebaFacturas'} | foreach{ $site.RecycleBin.Delete($_.Id)}
$site.RecycleBin.Count // resultado = 3
Si ejecutamos el siguiente
SELECT count(*) as totalelements
    FROM [WSS_Content_Reuniones].[dbo].[AllDocs]
    where ListId = '00DA3DE4-D8AF-4EF1-A956-E44CBFEF1012'
El resultado es ahora:



Bueno en esta aprendimos que SharePoint para grandes volumenes de datos no es del todo la mejor opción de hecho encontré el siguiente artículo de msdn https://msdn.microsoft.com/en-us/library/ff647105.aspx
Using SharePoint Lists vs. Database Tables



Así que cuando pensemos grandes volumentes de elementos por el esquema de la base de datos de contenido de SharePoint no es una buena idea.

Hasta la proxima amigos!

No hay comentarios.: