Español

Cómo: Informar de las estadísticas de versiones de geodatabase en una geodatabase de SQL Server

Resumen

Las instrucciones proporcionadas describen cómo informar de las estadísticas de versiones de geodatabase en una geodatabase de SQL Server. El siguiente script SQL informa sobre una geodatabase versionada en SQL Server. El resultado enumera el número de versiones, el número de versiones que bloquean la versión PREDETERMINADA para que se comprima en el estado 0, así como los nombres del propietario de las primeras cinco versiones de bloqueo, el número de estados, el número de entradas en la tabla state_lineages y el número de filas en la tabla versionada y las tablas delta.

  • Este script es comparable a los de las geodatabases de Oracle (KB 000010358). Sin embargo, no se han probado todos los escenarios.
  • Este script funciona de manera óptima en las geodatabases SQL Server con esquemas SDE y DBO normales.
  • Si fuera necesario, cambie el esquema SDE a DBO manualmente en el script. (CTRL-H, "sde.", "dbo.")
  • El resultado se envía a la pestaña Mensajes de SQL Server Management Studio.

Procedimiento

Siga las instrucciones proporcionadas a continuación.

  1. Copie y pegue el siguiente script en un editor de SQL o SQL Server Management Studio.
  2. Si fuera necesario, cambie el esquema de las tablas de SDE a DBO (CTRL-H, "sde.", "dbo.").
  3. Ejecute el script.
SET NOCOUNT ON


--Quite la marca de comentario de esta sentencia CREATE TABLE y de la declaración INSERT INTO
--en las líneas 150 y 151 para generar una tabla permanente que contenga los recuentos agregados y eliminados.
/* create table delta_info
(
    id int identity(1,1),
    table_name nvarchar(100),
    registration_id int,
    adds int,
    deletes int
) */

DECLARE @versions_info_tab TABLE
(
    ver_info_state_id int,
    source_lin int,
    com_anc_id int,
    lin_name int,
    state_id int
)

DECLARE @blocking_list TABLE
(
    state_id int,
    name varchar(100)
)

DECLARE @delta_table_info TABLE
(
    a_table_name nvarchar(50),
    d_table_name nvarchar(50),
    a_table_count int,
    d_table_count int
)

DECLARE @ver_count int = (SELECT COUNT(*) FROM sde.SDE_versions)
DECLARE @state_count int = (SELECT COUNT(*) FROM sde.sde_states)
DECLARE @state_lineages_count int = (SELECT COUNT(*) cnt FROM sde.SDE_state_lineages)

-- Si nunca se ha comprimido la geodatabase, la tabla SDE_compress_log no existe.
DECLARE @last_compress varchar(15)
IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN ('SDE', 'DBO') AND table_name = 'SDE_compress_log')
BEGIN
       SET @last_compress = CONVERT(varchar(15), (SELECT MAX(compress_end) FROM sde.SDE_compress_log), 1)
END
ELSE
BEGIN
       SET @last_compress = 'No compress log table';
END

DECLARE @ver_info_state_id int, @message varchar(100) = '', @source_lin int, 
        @com_anc_id int, @lin_name int, @state_id int, @ver_blocking int = 0,
        @cur_max_state int, @pos int, @idx int, @s1 int = 0, @s2 int = 0, @s3 
        int = 0, @s4 int = 0, @s5 int = 0, @blocking_ver_name nvarchar(100), 
        @blocking_ver_count int, @table_info_name varchar(100), @table_info_reg_id int,
        @table_info_owner varchar(100), @p_stmt nvarchar(200),@a_stmt nvarchar(max), 
        @d_stmt nvarchar(max), @row_count int

DECLARE table_info_cur CURSOR FOR
    SELECT owner, table_name, registration_id
    FROM sde.sde_table_registry
    WHERE sde.sde_table_registry.object_flags&8 = 8
        
DECLARE ver_list_cur CURSOR FOR
    SELECT DISTINCT state_id
      FROM sde.sde_versions
      WHERE name = 'DEFAULT' and owner IN ('SDE', 'DBO')
      ORDER BY state_id;

SELECT @state_id=state_id, @lin_name = lineage_name FROM sde.sde_states
WHERE state_id = (SELECT state_id FROM sde.sde_versions WHERE name = 'DEFAULT' and owner IN ('SDE', 'DBO'));

SET @cur_max_state = @state_id
PRINT '========== Estadísticas de versiones ================='
PRINT ''
PRINT 'Número de versiones: ' + CONVERT(varchar, @ver_count)
PRINT '=============='
OPEN ver_list_cur
FETCH NEXT FROM ver_list_cur INTO @ver_info_state_id
    WHILE @@FETCH_STATUS = 0
BEGIN
        SELECT @row_count = COUNT(*) FROM sde.sde_state_lineages WHERE lineage_name = @lin_name AND lineage_id <= @state_id
        SELECT @source_lin = lineage_name FROM sde.SDE_states where state_id = @ver_info_state_id
        ;WITH sel_max_lin_id AS 
        (
            SELECT lineage_id FROM sde.sde_state_lineages WHERE lineage_name = @lin_name AND lineage_id <= @state_id
INTERSECT
            SELECT lineage_id FROM sde.sde_state_lineages WHERE lineage_name = @source_lin AND lineage_id <= @ver_info_state_id
        )
        SELECT @com_anc_id = (SELECT MAX(lineage_id) FROM sel_max_lin_id)

        INSERT INTO @versions_info_tab VALUES(@ver_info_state_id, @source_lin, @com_anc_id, @lin_name, @state_id);

    FETCH NEXT FROM ver_list_cur INTO @ver_info_state_id
    
END;
CLOSE ver_list_cur

-- Generar tabla de nombres de versiones de bloqueo
;WITH get_block_ver AS
(
   SELECT owner+'.'+name as name, state_id FROM sde.sde_versions
       WHERE state_id NOT IN
           (SELECT DISTINCT lineage_id FROM sde.sde_state_lineages
                WHERE lineage_name IN
                 (SELECT DISTINCT lineage_name FROM sde.sde_state_lineages
                  WHERE lineage_id IN (SELECT ver_info_state_id FROM @versions_info_tab)  -- usando solo los valores del cursor que filtra la versión predeterminada
              )
        )    
)

INSERT INTO @blocking_list
SELECT state_id, name FROM get_block_ver -- WHERE state_id < @ver_info_state_id -- AND name NOT LIKE '%SYNC%'

DECLARE blocking_ver_name_cur CURSOR FOR
    SELECT name FROM @blocking_list
SET @blocking_ver_count = (SELECT COUNT(*) FROM @blocking_list)

PRINT 'Número de versiones que bloquean la versión PREDETERMINADA: ' + CONVERT(varchar, @blocking_ver_count)
PRINT 'Versiones de bloqueo: '
OPEN blocking_ver_name_cur
FETCH NEXT FROM blocking_ver_name_cur INTO @blocking_ver_name
WHILE @@FETCH_STATUS = 0
BEGIN
    

        PRINT '    ' + @blocking_ver_name
        FETCH NEXT FROM blocking_ver_name_cur INTO @blocking_ver_name
END
CLOSE blocking_ver_name_cur
PRINT '=============='
PRINT ''
PRINT 'Número de estados: ' + CONVERT(varchar, @state_count)
PRINT 'Número de linajes de estado: ' + CONVERT(varchar, @state_lineages_count)
PRINT 'Última operación de compresión: ' + CONVERT(varchar, @last_compress)
PRINT ''

OPEN table_info_cur
FETCH NEXT FROM table_info_cur INTO @table_info_owner, @table_info_name, @table_info_reg_id
WHILE @@FETCH_STATUS = 0
BEGIN
        DECLARE @a_count int, @d_count int
        PRINT 'Tabla:  ' + @table_info_owner + '.'+  @table_info_name + ' (' + CONVERT(varchar, @table_info_reg_id) + ')'
        SET @a_stmt = N'SELECT @a_count=COUNT(*) FROM ' + @table_info_owner + '.a' + CONVERT(varchar, @table_info_reg_id)
        EXEC sp_executesql @query = @a_stmt, @params = N'@a_count INT OUTPUT', @a_count = @a_count OUTPUT

        SET @d_stmt = N'SELECT @d_count=COUNT(*) FROM ' + @table_info_owner + '.D' + CONVERT(varchar, @table_info_reg_id)
        EXEC sp_executesql @query = @d_stmt, @params = N'@d_count INT OUTPUT', @d_count = @d_count OUTPUT

        INSERT INTO @delta_table_info VALUES 
        (
            @table_info_owner + '.a' + CONVERT(varchar, @table_info_reg_id),
            @table_info_owner + '.D' + CONVERT(varchar, @table_info_reg_id),
            @a_count,
            @d_count
        )
        /* INSERT INTO dbo.delta_info (table_name, registration_id, adds, deletes)
        VALUES (@table_info_name, @table_info_reg_id, @a_count, @d_count) */
        PRINT 'Recuento de agregados:    ' + CONVERT(varchar, @a_count)
        PRINT 'Recuento de eliminados: ' + CONVERT(varchar, @d_count)
        PRINT ''
        FETCH NEXT FROM table_info_cur INTO @table_info_owner, @table_info_name, @table_info_reg_id
END

CLOSE table_info_cur

DEALLOCATE ver_list_cur
DEALLOCATE blocking_ver_name_cur
DEALLOCATE table_info_cur

 
Ejemplo de salida:
​==========Estadísticas de versiones=================
 
Número de versiones: 2   ==============
Número de versiones que bloquean la versión PREDETERMINADA: 1
Versiones de bloqueo: 
    dbo.QA
 
Número de estados: 3577
Número de linajes del estado: 100015
Última operación de compresión: 2018-01-09
 
Tabla:  DBO.CONTROLCORNER (45)
Recuento de agregados:    124
Recuento de eliminados: 124
 
Tabla:  DBO.PLSSBOUNDARY (46)
Recuento de agregados:    8
Recuento de eliminados: 8

Información relacionada