Home
    Mantenimiento en Base de Datos

    El mantenimiento de una base de datos siempre como la de Aranda FIELDE SERVICE AFLS, es muy importante para mantener toda la información actualizada y en un nivel óptimo. Estas operaciones de mantenimiento se podrán ejecutar dos veces al mes. También es posible modificar la frecuencia del mantenimiento, teniendo en cuenta la actividad que recibe la base de datos en producción y el volumen de datos que maneja. Este mantenimiento es recomendable realizarlo dos veces al mes, a menos de que el nivel de transacciones sea muy alto.

    LOG DE TRANSACCIONES:

    • Especifique un límite de crecimiento del archivo de registro.
    • Especifique una velocidad de crecimiento del archivo de registro que evite que se excedan los 2 segundos en una operación de ampliación del mismo. Normalmente puede usar entre 30 Mb y 60 Mb.
    • Si usa el modelo de recuperación completo, defina una estrategia de recuperación y respaldo basada en el log de transacciones, para facilitar que se reutilice el espacio dispuesto por los archivos de registro.
    • Si usa el modelo de recuperación simple, tenga en cuenta que el log de transacciones crecerá lentamente, pero podría afectar la estrategia de recuperación que tenga definida para la base de datos.

    DESFRAGMENTAR ÍNDICES:

    Las tareas de desfragmentación de índices ayudan a mejorar el rendimiento de las bases de datos porque mejoran el acceso a los datos en el disco; es recomendable realizar estas tareas de forma periódica para garantizar un buen funcionamiento de la base de datos. Estas tareas ayudan a que los planes de ejecución se compilen con las estadísticas más recientes de la base de datos.


    Nota: Asegúrese de medir el impacto de las operaciones de scripts proporcionados por terceros en sus bases de datos. En ningún caso Aranda SOFTWARE se hará responsable por los daños generados en la información o en el esquema de la base de datos, tras la ejecución de scripts que no hayan sido referenciados por personal autorizado de Aranda SOFTWARE.


    Si desea desfragmentar índices y actualizar estadísticas, realice el siguiente procedimiento:

    1. Asegúrese de que ningún usuario se encuentre editando, consultando o ingresando datos en las herramientas de la suite de Aranda. Para esto puede detener los servicios de Internet Informatión Services (IIS).

    2. Detenga los servicios de la Suite de Aranda en el servidor de aplicaciones.

    3. Ejecute el script (Script desfragmentación de índices y actualización de estadísticas). No es recomendable actualizar estadísticas con demasiada frecuencia pues esto invalida los planes de ejecución almacenados en la caché del servidor. Por este motivo en el script encontrará el parámetro @statistics con el valor ‘OFF’. Cuando desee actualizar las estadísticas cambie el parámetro mencionado al valor ‘ON’.

    4. Inicie nuevamente todos los servicios de la Suite Aranda e Internet Information Services (IIS).


    --Script desfragmentación de índices y actualización de estadísticas 
    use DATABASE --Nombre de la base de datos
    declare @statistics nvarchar(3) = 'OFF'; --Modifique este valor a 'ON' para actualizar estadísticas.
    declare @sentence nvarchar(128),
    @initdate datetime,
    @inaldate datetime;
    declare cur_indices cursor for with index_fragment (object_id, index_id, avg_fragmentation_in_percent) as (
      SELECT
        object_id,
        index_id,
        avg_fragmentation_in_percent
      FROM
        sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'LIMITED')
      WHERE
        (
          (avg_fragmentation_in_percent > 15)
          OR (avg_page_space_used_in_percent < 60)
        )
        AND page_count > 5
        AND index_id NOT IN(0)
        AND object_id NOT IN(
          	OBJECT_ID('AFLS_APP_LOG'),
          	OBJECT_ID('AFLS_ASSIGNMENT_ENGINE_LOG'),
    OBJECT_ID('AFLS_MAPS_API_USED_LOG'),
          	OBJECT_ID('AFLS_LOG_CRUD_ADDITIONAL_FIELD'),
    	OBJECT_ID('AFW_AUDIT'),
    	OBJECT_ID('AFW_MAIL_HISTORY'),
    	OBJECT_ID('AFW_WORKER_LOG')
        )
    )
    SELECT
      'ALTER INDEX ' + ind.[name] + ' ON ' + sc.[name] + '.' + OBJECT_NAME(t.object_id) + ' REBUILD' sentence
    FROM
      index_fragment t
      INNER JOIN sys.indexes ind ON t.object_id = ind.object_id
      AND t.index_id = ind.index_id
      INNER JOIN sys.objects ob ON t.object_id = ob.object_id
      INNER JOIN sys.schemas sc ON sc.schema_id = ob.schema_id
    Union
    
    select
      'update statistics ' + OBJECT_NAME(object_id)
    from
      index_fragment
    where
      @statistics = 'ON' open cur_indices fetch cur_indices into @sentence while(@@FETCH_STATUS = 0) begin
    set
      @initdate = GETDATE();
    exec sp_executesql @sentence;
    print @sentence + ' tiempo de ejecución: ' + convert(
      varchar(10),
      datediff(millisecond, @initdate, GETDATE())
    );
    fetch cur_indices into @sentence;
    end close cur_indices;
    deallocate cur_indices;
    declare cur_indices cursor for with index_fragment (object_id, index_id, avg_fragmentation_in_percent) as (
      SELECT
        object_id,
        index_id,
        avg_fragmentation_in_percent
      FROM
        sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'LIMITED')
      WHERE
        (
          (
            avg_fragmentation_in_percent > 10
            AND avg_fragmentation_in_percent < 15
          )
          OR (
            avg_page_space_used_in_percent < 75
            AND avg_page_space_used_in_percent > 60
          )
        )
        AND page_count > 5
       AND dm_db_index_physical_stats.index_id NOT IN (0)
       AND object_id NOT IN(
          OBJECT_ID('AFLS_APP_LOG'),
          	OBJECT_ID('AFLS_ASSIGNMENT_ENGINE_LOG'),
    OBJECT_ID('AFLS_MAPS_API_USED_LOG'),
          	OBJECT_ID('AFLS_LOG_CRUD_ADDITIONAL_FIELD'),
    	OBJECT_ID('AFW_AUDIT'),
    	OBJECT_ID('AFW_MAIL_HISTORY'),
    	OBJECT_ID('AFW_WORKER_LOG')
        )
    )
    SELECT
      'ALTER INDEX ' + ind.[name] + ' ON ' + sc.[name] + '.' + OBJECT_NAME(t.object_id) + ' REORGANIZE' sentence
    FROM
      index_fragment t
      INNER JOIN sys.indexes ind ON t.object_id = ind.object_id
      AND t.index_id = ind.index_id
      INNER JOIN sys.objects ob ON t.object_id = ob.object_id
      INNER JOIN sys.schemas sc ON sc.schema_id = ob.schema_id
    union
    select
      'update statistics ' + OBJECT_NAME(object_id)
    from
      index_fragment
    where
      @statistics = 'ON' open cur_indices fetch cur_indices into @sentence while(@@FETCH_STATUS = 0) begin
    set
      @initdate = GETDATE();
    exec sp_executesql @sentence;
    print @sentence + ' tiempo de ejecución: ' + convert(
      varchar(10),
      datediff(millisecond, @initdate, GETDATE())
    );
    fetch cur_indices into @sentence;
    end close cur_indices;
    deallocate cur_indices;
    GO