Mostrando las entradas con la etiqueta SharePoint 2016. Mostrar todas las entradas
Mostrando las entradas con la etiqueta SharePoint 2016. Mostrar todas las entradas

jueves, 25 de mayo de 2017

Secretos mas reconditos en SharePoint: Cadena de conexión de ConfigDB

Siempre me he preguntado y no se si usted también donde se guarda la cadena de conexión de la base de datos de configuración de la granja de SharePoint Server.  Pienso que Esto aplica para 14,15 y 16.

Pues bien necesita irse al registro de windows permedio de regedit y navegar en las carpetas siguiendo la siguiente ruta

HKEY_Local_Machine\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\

De allí depdenderá de la versión de SharePoint.  Por ejemplo si es 2015 encontrará la carpeta 15.0 y luego Secure y dentro de ella ConfigDB y alli adentro una llave llamada dsn

La ruta completa sería:

HKEY_Local_Machine\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\15.0\Secure\ConfigDB



Y el valor esperado de la cadena de conexión de la base de datos de configuración de la granja tipicamente nombrada SharePoint_Config es:


Data Source=SPSQLDB;Initial Catalog=SharePoint_Config;Integrated Security=True;Enlist=False;Pooling=True;Min Pool Size=0;Max Pool Size=100;Connect Timeout=15


Así que ya sabe donde.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

lunes, 6 de febrero de 2017

Cuidado con la base de datos tempDB de SQL Server 2016 para un granja de SharePoint 2016

Oh! sorpresa la base de datos temporal que utiliza para realizar sus operaciones de creación, modificación y eliminación  puede creecer hasta llenar por completo el disco donde esta ubicada.   

El disco donde estaba almacenada esta base de datos tempDb tenia 2 TB y fueron consumidos en su totalidad, así que mucho cuidado.

La base de datos TempDb en Sql Server 2016 se crean archivos separados por nucleos lógicos en el caso nuestro teniamos 4 núcleos entonces creó 4 archivos separados uno por cada núcleo;un arhivo .MDF y 3 archivos .NDF.  Y estos mostraban el tamaño de 500 GB cada uno, como se muestra abajo:


Este servidor es el BackEnd de una Granja de SharePoint 2016.  Y el reporte del usuario fue que no podía agregar una bilioteca de imágenes.  Al revisar el log de SharePoint se encotró el siguiente error:

02/02/2017 16:49:30.93               w3wp.exe (0x21AC0)                                    0x2424C               SharePoint Foundation                         Database                           880j        High      SqlError: 'Could not allocate space for object 'dbo.EventCache'.'EventCache_ListId' in database 'WSS_Content_xxx' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.'    Source: '.Net SqlClient Data Provider' Number: 1105 State: 2 Class: 17 Procedure: 'proc_LogChangeEx' LineNumber: 28 Server: 'SHAREPOINTDB'                1833d19d-e9f5-b035-1066-9145bf5ded4f

Su configuración inicial fue la siguiente:

Crecimiento Inicial Tenia 1024 Mb
AutoCrecimiento
Crecimiento en 64 MB
Limite de Crecimiento No Restringido

Solución

La solución pues tendría que ser reducir el tamaño de la base de datos por medio de un Shrink, pero para ambientes de producción no es recomendado hacerlo en caliente y en horarios laborales.  Por ello se tomaron las siguientes medidas:

Procedimiento Efectuado:

1) Solicitar Ventana de Mantenimiento de Emergencía
2) Dentro de la ventana de mantenimiento se efectuó el siguiente procedimiento:
2.1.) Se ejecutaron las siguientes líneas en t-sql con el Management Studio:

use tempdb
GO

DBCC FREEPROCCACHE -- clean cache
DBCC DROPCLEANBUFFERS -- clean buffers
DBCC FREESYSTEMCACHE ('ALL') -- clean system cache
DBCC FREESESSIONCACHE -- clean session cache
DBCC SHRINKDATABASE(tempdb, 99); -- shrink tempdb

Esto liberó 450 Gb el disco que estaba lleno y no permitio reiniciar con seguridad

2.2) Reinicio del Servidor de SQL Server
2.3) Ejecución de los siguientes comandos de t-SQL:

go

USE tempdb;
GO
DBCC SHRINKFILE (tempdev, 64); --libere el espacio del archivo de base de datos y dele un tamaño de 64MB
GO
--2 1 8192 8192 472 472
DBCC SHRINKFILE (temp2, 64); --libere el espacio del archivo de base de datos y dele un tamaño de 64MB
GO
--2 3 8192 8192 184 184
DBCC SHRINKFILE (temp3, 64); --libere el espacio del archivo de base de datos y dele un tamaño de 64MB
GO
--2 4 8192 8192 120 120
DBCC SHRINKFILE (temp4, 64); --libere el espacio del archivo de base de datos y dele un tamaño de 64MB
GO
--2 5 8192 8192 32 32

2.4) Se modificó las propiedades de cada data file para que creciera un máximo de 10 Gb o 10240 Mb.

Con ello se liberó el espacio y se garantizó que no puede llegar a ser mayor a 10 Gb cada archivo de base de datos o ndf file dando un total de 40 GB que estamos es más que suficiente para las operaciones de la granja de SharePoint 2016.



Luego se probó crear la biblioteca y se efectuó la operacíon con éxito sin problemas.



En resumen tenga cuidado cuando se configura SQL Server 2016 de limitar el tamaño de la base de datos tempdb un tamaño que según estime las operaciones que realizará la base de datos pueda manejar, defina un limite máximo para los archivos MDF y LDFs de la base de datos TempDB.

Microsoft también recomienda que tenga un tamaño igual inicial y un incremento igual es decir todas esten configuradas con el mismo tamaño de crecimiento que en este caso es de bloques de 64 MB.

Datos interesantes sobre la tempdb en SQL Server 2016 puede revisar este enlace:

https://blogs.msdn.microsoft.com/psssql/2016/03/17/sql-2016-it-just-runs-faster-automatic-tempdb-configuration/


Hasta la próxima y cuidado con la tempDB.


Juan Manuel Herrera Ocheita



domingo, 22 de enero de 2017

Reporte de Uso en SharePoint 2016 reporta ceros en visitas y usuarios únicos más no en las consultas de búsqueda

Este error ha sido muy común desde la versión SharePoint Server 2013, al parecer unificar en el servicio de búsqueda con las estadísticas de uso del portal, no ha sido una experiencia muy positiva ni para los que administramos las granjas de SharePoint ni para los usuarios que analizan la información que es brinda el reporte de consumo si la comparamos con las gráficas de SharePoint 2010 que nos daban mucho más información.

Primero veamos el diseño de la arquitectura de los componentes que intervienen en las estadísticas de SharePoint.


Este diagrama es de SharePoint 2010, pero en 2013 y 2016 no ha cambiado mucho.   Aunque es parte de el servicio de Search de SharePoint, los componentes que lo integran aún son parte del diseño que viene de la versión 2010.  Ahora en el diagrama modifque algunas etiquetas para actualizarlo más posible a la versión reciente y entendamos que componentes intervienen en las estádisticas de uso de SharePoint 2016.

La arquitectura del servicio de búsqueda de SharePoint 2016 a nivel mas amplio puede revisarse en los diagramas disponibles de arquitectura del sitio de technet.  Para apreciar mejor la imagen puedes visitar el siguiente enlace:
https://msdn.microsoft.com/en-us/library/office/jj163300.aspx. el proceso Analytics Processing Component es responsable de procesar las estadísticas tanto de uso como de consulta.


Para comprender donde puede fallar las estadísticas de uso de SharePoint 2016, necesitamos  evaluar cada componente y servicio que integra la solución para generar las estadísticas de uso.   Por ello veremos cada parte que la integra a continación:

Por Aplicación de Servicios
Por Aplicación de Servicios los componentes involucrados para que el reporte de uso funciona son

Search Service o Servicio de Búsqueda
Aplicación de Servicio de busqueda compuesto por los siguientes componentes:
Administration, Crawler, Content Processing, Analytics Processing, Query Processing, Index Partition.

WSS_UsageApplication
Servicio para capturar la salud de la granja y uso de las aplicaciones Web.

State Service Application
Servicio para almacenar temporalmente la información de las sesiones de los usuarios, requerido por servicios como InfoPath y WSS_UsageApplication

Por Bases de Datos

Search_Service_Application_AnalyticsReportingStoreDB 
Base de datos del servicio de búsqueda del componente
WSS_Logging
Base de datos derl servicio WSS_UsageApplication
SharePoint_StateService
Almacena temporalmente la sesión del usuario

Por Timer Jobs de la granja

Microsoft SharePoint Foundation Usage Data Import
Importa los archivos usage log para la base de datos WSS_Logging.
Microsoft SharePoint Foundation Usage Data  Maintenance
Ejecuta mantenimiento a la base de datos WSS_Logging
Microsoft SharePoint Foundation Usage Data Processing
Registra el uso de las aplicaciones web en los archivos de usage log 

Por archivos en el file system

Los archivos .usage almacenados en la ubicación configurada en Usage and Health data Collection.  Si no fue modificada la ubicación predeterminada puede ubicarla en la siguente ruta: %SytemDrive%\Program Files\Common Files\Microsoft Shared\Web Server Extensions\[SharePoint Version]\Bin\Logs.

Estos archivos son trasladados a la base de datos wss_logging.

Los archivos .log almacenados en la carpeta EventStore que de forma predeterminada la ubicación es %SystemDrive%\Program Files\Microsoft Office Servers\[SharePoint Version]\Data\Office Server\Analytics_[Guid]\EventStore\[Day of the Date]

Finalmente ahora veamos que validaciones debemos de hacer cuando el reporte nos despliega cero en las visitas y usuarios únicos.

VALIDACIONES

1. Configuración de Usage and Health data Collection

Para ello debe ir al Central Administration, Monitoring, Configure usage and health data collection
Validar que este seleccionado el checkbox Enable Usage data collection 
Validar que esten seleccionados los eventos por lo menos Page Requests
Validar la ubicación del directorio donde se almacenan los archivos usage en: Usage Data Collection Settings, Log file location:
Validar que este configurado Logging DataBase la casilla Databaseserver y DatabaseName


2. Definición de Trabajos en el TimerJob de SharePoint

Validar que las definiciones de trabajo del Timer Job esten habilitadas y calendarizadas de la siguiente forma:


3. Ejecución del State Service o Servicio de Estado de Sesión


Validar que el State service este creado sino ejecutar en SharePoint 2016 Management Shell la sigientes líneas de comando:

$serviceApp = New-SPStateServiceApplication -Name "StateService App"
New-SPStateServiceDatabase -Name "SharePoint_StateService" -ServiceApplication $serviceApp
New-SPStateServiceApplicationProxy -Name "StateService App Proxy" -ServiceApplication $serviceApp -DefaultProxyGroup


4. WSS_UsageApplication Proxy este Iniciado


Si el proxy de este servicio aparece not started es necesario provisionarlo de nuevo con las siguientes líneas:


Get-SPServiceApplicationProxy
$usage = Get-SPServiceApplicationProxy -Identity [Guid de WSS_UsageApplication]
$usage.Provision()

5. Existencia de Archivos .usage

Verificar la ubicación de los archivos .usage y la fecha ultima de creación de los archivos
Monitoring, 

Para ello debe ir al Central Administration, Monitoring, Configure usage and health data collection
Validar la ubicación del directorio donde se almacenan los archivos usage en: Usage Data Collection Settings, Log file location:

Luego validar que los archivos .usage existan con fecha actual.  En caso de no estar deberá validar que este habilitado la configuración de Usage and Health data Collection (punto no.1).

6. Validar si los reportes ya generan datos un día después
Lamentablemente no hay forma de visualizar esta información sino un día después, asi que habrá que esperar.


SharePoint4Fun,

Juan Manuel Herrera Ocheita


lunes, 9 de enero de 2017

Una línea de comando de PowerShell sencilla pero poderosa en su contenido SharePoint 2010,2013,2016

Distribuir contenido es de vital importancia, pero cuando son muchas las bases de datos y colecciones de sitios creadas al restaurar una granja se complica saber donde esta la colección de sitios, por lo que es importanet que contenmos con un listado de las aplicaciones web, sus colecciones y base de datos de contenido.
 
Cuando creamos de cero una granja y deseamos montar manualmente las base de datos de contenido, es importante saber cual es la base de datos de contenido que tiene la colección de sitios primaria ya que esta debe de restaurarse de primera instancia. 

También es importante cuando el contenido esta distribuído que base de datos de contendio tiene la colección de sitios que deseamos restaurar.




El comando deberá ejecutarse desde un servidor de SharePoint desde SharePoint Management Shell.  Y la línea de comando  es la siguiente:

Get-spsite -Limit all | select url, webapplication, contentdatabase | Export-Csv e:\infoware\listados\ColeccionesSitios.csv -NoTypeInformation

Url WebApplication ContentDatabase
http://miportal SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content
http://miportal/logistica SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_DataCross
http://miportal/portales SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Portales
http://miportal/sites/permisos SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Search_Center
http://miportal/sites/apps SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=SharePoint_OC
http://miportal/sites/capacitacion SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=SharePoint_OC
http://miportal/sites/inversiones SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Inversiones
http://miportal/sites/seguridad SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content
http://miportal/sites/Proyectos SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_ProyectosIT
http://miportal/sites/prueba_EC SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Esthela_Prueba
http://miportal/sites/search SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Search_Center
http://miportal/sites/sharedspace SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_SharedSpace
http://miportal/sites/temp SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content
http://miportal/sites/temporal SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_ProyectosIT
http://miportal/sitios/rrhh SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=SharePoint_OC
http://miportal/sitios/prueba3 SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Esthela_Prueba
http://miportal/sitios/test SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Portales
http://miportal:21387/sites/prueba SPWebApplication Name=Aplicacion Prueba SPContentDatabase Name=WSS_Content_PRUEBA
http://miportal:21387/sites/prueba2 SPWebApplication Name=Aplicacion Prueba SPContentDatabase Name=WSS_Content_PRUEBA
http://miportal:21387/sites/prueba3 SPWebApplication Name=Aplicacion Prueba SPContentDatabase Name=WSS_Content_PRUEBA
http://miportal:24301/sites/prueba SPWebApplication Name=Sitio Federado SPContentDatabase Name=WSS_Content_SITIOFEDERADO

En este ejemplo ficticio vemos que la base de datos de contenido primaria se llama WSS_Content.


Esta será la primera que debemos de montar a través del comando

mount-SPContentDatabase -Name Wss_Content -url http://miportal

Para más información sobre el comando puede utilizar la siguiente línea de comando:

get-help mount-SPContentDatabase -full

Eso esto por este artículo.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita





lunes, 2 de enero de 2017

Cómo habilitar Distribute Cache en un Servidor Custom Role SharePoint 2016

Distribute Cache es un MinRole en SharePoint 2016.  Pero que pasa si no tenemos los servidores requeridos para separar este Rol entonces debemos de habilitarlo en un  Custom Role que es diremos la forma tradicional de hacerlo.

No hay una referencia documentada oficial aún para hacerla, pero el sentido común nos puede guiar y es que la forma de habilitarlo vía powershell en SharePoint 2013 debería ser la forma en que podemos habilitarlo en SharePoint 2016 en un Custom Role.

Si deseas saber mas sobre MinRoles puede ser este post que escribí hace algún tiempo:

https://jmhogua.blogspot.com/search?q=minrole

Retornando al tema entonces debemos  primero ir al servidor que tiene el Custom Role.  Para saber cual es podemos verlo desde el Central Administration, System Settings, Convert server role in this farm.



Luego vemos el rol de cada servidor

Entonces en el servidor con Role Custom este levantamos una instancia de Management Shell for SharePoint 2016 y ejecutamos el comando Add-SPDistributeCacheServiceInstance.


Y eso es todo ya se provisionó el Distribute Cache en ese servidor.  Ahora si vemos en el Central Administration los servicios corriendo en ese Servidor nos despliega el servicio.



Y eso es todo.

SharePointFun,

Juan Manuel Herrera Ocheita


domingo, 25 de diciembre de 2016

Plan de Mantenimiento de las bases de datos para Granja de SharePoint

Aunque solo hay referencia de un Plan de mantenimiento para SharePoint 2010, SharePoint 2016 aún se corre sobre SQL Server y por tanto validar las bases de datos, reindexarlas y hacer un shrink de vez e cuando es algo que puede ayudar a mejorar el rendimiento y la salud de las bases de datos de SharePoint.

Básicamente el mantenimiento de SQL Server para SharePoint cubre los siguientes aspectos:


  1. Comprobación de la integridad de la base de datos
  2. Shrink de base de datos (ocasional cuando sea muy necesario)
  3. Desfragmentación de los índices mediante su reorganización o regeneración


Pero en vez de utilizar el asistente de SQL Server Management Studio les detallare los scripts 

Listado de bases de datos

select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb'); 

Con este query se puede generar un listado de todas las bases de datos que con excel nos puede servir para generar los comandos  t-sql más facilmente.


Comprobación de la integridad de la base de datos


DBCC CHECKDB ([SharePoint_Config]) WITH PHYSICAL_ONLY 

* Limita la comprobación a la integridad de la estructura física de los encabezados de página y registro y la coherencia de la asignación de la base de datos

https://msdn.microsoft.com/en-us/library/ms176064.aspx

Shrink de base de datos (ocasional cuando sea muy necesario)
Esto aunque no es muy recomendado se hace necesario cuando necesitamos disponer de espacio libre y hay mucho espacio sin ocupar especialmente cuando se ha depurado contenido en el portal de gran volumen.  El Comando es el siguiente:


DBCC SHRINKDATABASE  ([SharePoint_Config],TRUNCATEONLY)
Desfragmentación de los índices mediante su reorganización o regeneración

Este script fue tomado del sitio abajo indicado funciona muy bien y toma como necesario la reindexación si el porcentaje de desfragmentación es mayor al 30% y si tiene más de 1000 páginas la tabla analizada de la base de datos.

-- Ensure a USE statement has been executed first.
use [WSS_Content_GUID]
go
SET NOCOUNT ON

-- adapted from "Rebuild or reorganize indexes (with configuration)" from MSDN Books Online
-- (http://msdn.microsoft.com/en-us/library/ms188917.aspx)

-- =======================================================
-- || Configuration variables:
-- || - 10 is an arbitrary decision point at which to
-- || reorganize indexes.
-- || - 30 is an arbitrary decision point at which to
-- || switch from reorganizing, to rebuilding.
-- || - 0 is the default fill factor. Set this to a
-- || a value from 1 to 99, if needed.
-- =======================================================
DECLARE @reorg_frag_thresh   float        SET @reorg_frag_thresh   = 10.0
DECLARE @rebuild_frag_thresh float        SET @rebuild_frag_thresh = 30.0
DECLARE @fill_factor         tinyint      SET @fill_factor         = 80
DECLARE @report_only         bit                SET @report_only         = 1

-- added (DS) : page_count_thresh is used to check how many pages the current table uses
DECLARE @page_count_thresh    smallint   SET @page_count_thresh   = 1000

-- Variables required for processing.
DECLARE @objectid       int
DECLARE @indexid        int
DECLARE @partitioncount bigint
DECLARE @schemaname     nvarchar(130)
DECLARE @objectname     nvarchar(130)
DECLARE @indexname      nvarchar(130)
DECLARE @partitionnum   bigint
DECLARE @partitions     bigint
DECLARE @frag           float
DECLARE @page_count     int
DECLARE @command        nvarchar(4000)
DECLARE @intentions     nvarchar(4000)
DECLARE @table_var      TABLE(
                          objectid     int,
                          indexid      int,
                          partitionnum int,
                          frag         float,
                                                  page_count   int
                        )

-- Conditionally select tables and indexes from the
-- sys.dm_db_index_physical_stats function and
-- convert object and index IDs to names.
INSERT INTO
    @table_var
SELECT
    [object_id]                    AS objectid,
    [index_id]                     AS indexid,
    [partition_number]             AS partitionnum,
    [avg_fragmentation_in_percent] AS frag,
      [page_count]                           AS page_count
FROM
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE
    [avg_fragmentation_in_percent] > @reorg_frag_thresh
      AND
      page_count > @page_count_thresh
      AND
    index_id > 0
     

-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR
    SELECT * FROM @table_var

-- Open the cursor.
OPEN partitions

-- Loop through the partitions.
WHILE (1=1) BEGIN
    FETCH NEXT
        FROM partitions
        INTO @objectid, @indexid, @partitionnum, @frag, @page_count

    IF @@FETCH_STATUS < 0 BREAK

    SELECT
        @objectname = QUOTENAME(o.[name]),
        @schemaname = QUOTENAME(s.[name])
    FROM
        sys.objects AS o WITH (NOLOCK)
        JOIN sys.schemas as s WITH (NOLOCK)
        ON s.[schema_id] = o.[schema_id]
    WHERE
        o.[object_id] = @objectid

    SELECT
        @indexname = QUOTENAME([name])
    FROM
        sys.indexes WITH (NOLOCK)
    WHERE
        [object_id] = @objectid AND
        [index_id] = @indexid

    SELECT
        @partitioncount = count (*)
    FROM
        sys.partitions WITH (NOLOCK)
    WHERE
        [object_id] = @objectid AND
        [index_id] = @indexid

    -- Build the required statement dynamically based on options and index stats.
    SET @intentions =
        @schemaname + N'.' +
        @objectname + N'.' +
        @indexname + N':' + CHAR(13) + CHAR(10)
    SET @intentions =
        REPLACE(SPACE(LEN(@intentions)), ' ', '=') + CHAR(13) + CHAR(10) +
        @intentions
    SET @intentions = @intentions +
        N' FRAGMENTATION: ' + CAST(@frag AS nvarchar) + N'%' + CHAR(13) + CHAR(10) +
        N' PAGE COUNT: '    + CAST(@page_count AS nvarchar) + CHAR(13) + CHAR(10)

    IF @frag < @rebuild_frag_thresh BEGIN
        SET @intentions = @intentions +
            N' OPERATION: REORGANIZE' + CHAR(13) + CHAR(10)
        SET @command =
            N'ALTER INDEX ' + @indexname +
            N' ON ' + @schemaname + N'.' + @objectname +
            N' REORGANIZE; ' +
            N' UPDATE STATISTICS ' + @schemaname + N'.' + @objectname +
            N' ' + @indexname + ';'

    END
    IF @frag >= @rebuild_frag_thresh BEGIN
        SET @intentions = @intentions +
            N' OPERATION: REBUILD' + CHAR(13) + CHAR(10)
        SET @command =
            N'ALTER INDEX ' + @indexname +
            N' ON ' + @schemaname + N'.' +     @objectname +
            N' REBUILD'
    END
    IF @partitioncount > 1 BEGIN
        SET @intentions = @intentions +
            N' PARTITION: ' + CAST(@partitionnum AS nvarchar(10)) + CHAR(13) + CHAR(10)
        SET @command = @command +
            N' PARTITION=' + CAST(@partitionnum AS nvarchar(10))
    END
    IF @frag >= @rebuild_frag_thresh AND @fill_factor > 0 AND @fill_factor < 100 BEGIN
        SET @intentions = @intentions +
            N' FILL FACTOR: ' + CAST(@fill_factor AS nvarchar) + CHAR(13) + CHAR(10)
        SET @command = @command +
            N' WITH (FILLFACTOR = ' + CAST(@fill_factor AS nvarchar) + ')'
    END

    -- Execute determined operation, or report intentions
    IF @report_only = 0 BEGIN
        SET @intentions = @intentions + N' EXECUTING: ' + @command
        PRINT @intentions        
        EXEC (@command)
    END ELSE BEGIN
        PRINT @intentions
    END
      PRINT @command

END

-- Close and deallocate the cursor.
CLOSE partitions
DEALLOCATE partitions

GO
--===========================================
--[dbo].[AllDocStreams].[AllDocStreams_CI]:
-- FRAGMENTATION: 19.7798%
-- PAGE COUNT: 557169
-- OPERATION: REORGANIZE
--ALTER INDEX [AllDocStreams_CI] ON [dbo].[AllDocStreams] REORGANIZE;  UPDATE STATISTICS [dbo].[AllDocStreams] [AllDocStreams_CI];
--=============================================
--[dbo].[AllDocVersions].[AllDocVersions_PK]:
-- FRAGMENTATION: 12.833%
-- PAGE COUNT: 21959
-- OPERATION: REORGANIZE
--ALTER INDEX [AllDocVersions_PK] ON [dbo].[AllDocVersions] REORGANIZE;  UPDATE STATISTICS [dbo].[AllDocVersions] [AllDocVersions_PK];
--===================================
--[dbo].[AllLinks].[Links_Forward]:
-- FRAGMENTATION: 26.2066%
-- PAGE COUNT: 48793
-- OPERATION: REORGANIZE
--ALTER INDEX [Links_Forward] ON [dbo].[AllLinks] REORGANIZE;  UPDATE STATISTICS [dbo].[AllLinks] [Links_Forward];
--====================================
--[dbo].[AllLinks].[Links_Backward]:
-- FRAGMENTATION: 25.3887%
-- PAGE COUNT: 44059
-- OPERATION: REORGANIZE
--ALTER INDEX [Links_Backward] ON [dbo].[AllLinks] REORGANIZE;  UPDATE STATISTICS [dbo].[AllLinks] [Links_Backward];
--=======================================
--[dbo].[EventCache].[EventCache_Time]:
-- FRAGMENTATION: 25.687%
-- PAGE COUNT: 1674
-- OPERATION: REORGANIZE
--ALTER INDEX [EventCache_Time] ON [dbo].[EventCache] REORGANIZE;  UPDATE STATISTICS [dbo].[EventCache] [EventCache_Time];
--=========================================
--[dbo].[EventCache].[EventCache_ListId]:
-- FRAGMENTATION: 22.176%
-- PAGE COUNT: 3603
-- OPERATION: REORGANIZE
--ALTER INDEX [EventCache_ListId] ON [dbo].[EventCache] REORGANIZE;  UPDATE STATISTICS [dbo].[EventCache] [EventCache_ListId];
--=================================
--[dbo].[EventLog].[EventLog_Id]:
-- FRAGMENTATION: 32.5723%
-- PAGE COUNT: 16207
-- OPERATION: REBUILD
-- FILL FACTOR: 80
--ALTER INDEX [EventLog_Id] ON [dbo].[EventLog] REBUILD WITH (FILLFACTOR = 80)
--=============================================
--[dbo].[AllUserData].[AllUserData_ParentId]:
-- FRAGMENTATION: 13.7654%
-- PAGE COUNT: 1006816
-- OPERATION: REORGANIZE
--ALTER INDEX [AllUserData_ParentId] ON [dbo].[AllUserData] REORGANIZE;  UPDATE STATISTICS [dbo].[AllUserData] [AllUserData_ParentId];
--=================================
--[dbo].[Workflow].[Workflow_CI]:
-- FRAGMENTATION: 15.8641%
-- PAGE COUNT: 3385
-- OPERATION: REORGANIZE
--ALTER INDEX [Workflow_CI] ON [dbo].[Workflow] REORGANIZE;  UPDATE STATISTICS [dbo].[Workflow] [Workflow_CI];
--=======================================
--[dbo].[AuditData].[AuditData_OnItem]:
-- FRAGMENTATION: 12.085%
-- PAGE COUNT: 243318
-- OPERATION: REORGANIZE
--ALTER INDEX [AuditData_OnItem] ON [dbo].[AuditData] REORGANIZE;  UPDATE STATISTICS [dbo].[AuditData] [AuditData_OnItem];

Bueno eso es todo por ahora, con esto terminamos la serie que tiene que ver con bases de datos y la granja de SharePoint en sus versiones 2010,2013 y 2016.

SharePoint4fun!,

Juan Manuel Herrera Ocheita