Obje araDBA.usp_Pull_Metadata
Demo modu

DBA.usp_Pull_Metadata

yordam

DB-11 · değişiklik 11.10.2026 · Obje aramaya dön

İfadeler

5 ifade · 5.564 çalışma · toplam 0,5 sn
Sorgu (query_hash)ÇalışmaOrt. süre (ms) Ort. CPU (ms)Ort. okumaSüredeki pay
0x7F68C57C3178E341 4.924 0,1 0,1 4 %76,5
0xDE4CBCF706981D8F 279 0,3 0,3 39 %17,1
0xC51908C91667CE2E 293 0,1 0,1 3 %3,8
0xEF58301BFC231D5C 35 0,2 0,2 39 %1,9
0xE41ACA2305D17449 33 0,1 0,1 1 %0,7

Bağımlılıklar

Doğrudan referanslar (sys.sql_expression_dependencies); dinamik SQL ve geç bağlanan adlar görünmeyebilir.
DBA.usp_Pull_MetadataDBA.usp_Pull_Metadata DBA.usp_Collect_MetadataDB-11.DBA.usp_Collect_Metadata · aynı veritabanı DBA.fn_GetSettingNvarcharDB-11.DBA.fn_GetSettingNvarchar · aynı veritabanı DBA.fn_NowDB-11.DBA.fn_Now · aynı veritabanı DBA.usp_GetRemoteVersionDB-11.DBA.usp_GetRemoteVersion · aynı veritabanı DBA.usp_RemoteInsertDB-11.DBA.usp_RemoteInsert · aynı veritabanıKullananlar Kullandıkları
aynı veritabanıbaşka veritabanılinked server
YönNesneTürKapsam
kullanıyor DBA.fn_GetSettingNvarchar fonksiyon aynı veritabanı
kullanıyor DBA.fn_Now fonksiyon aynı veritabanı
kullanıyor DBA.usp_GetRemoteVersion yordam aynı veritabanı
kullanıyor DBA.usp_RemoteInsert yordam aynı veritabanı
kullanan DBA.usp_Collect_Metadata yordam aynı veritabanı
Tanım
CREATE   PROCEDURE DBA.usp_Pull_Metadata
    @ServerID int, @DBLinkName sysname, @DatabaseName sysname
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @use nvarchar(400) = N'USE ' + QUOTENAME(@DatabaseName) + N'; ';
    DECLARE @lit nvarchar(400) = N'N''' + REPLACE(@DatabaseName, N'''', N'''''') + N'''';
    DECLARE @sid nvarchar(12) = CAST(@ServerID AS nvarchar(12));
    -- #1191: tarih metne gömülmez, @Arg1 (yyyymmdd) parametresiyle gider; gömülü sabit her gün yeni QDS query_id doğuruyordu
    DECLARE @snapDay bigint = CAST(CONVERT(char(8), CAST(DBA.fn_Now() AS date), 112) AS bigint);
    -- R05-3: kaynak saat dilimi (@Arg3) biliniyorsa tarihler satır bazında AT TIME ZONE ile çevrilir (DST doğru);
    -- bilinmiyorsa anlık offset (DST geçişinden önceki değerlerde 1 saat sapabilir).
    DECLARE @hdr nvarchar(400) = N'SET NOCOUNT ON; DECLARE @Arg1 bigint = ?, @Arg2 bigint = ?, @Arg3 nvarchar(max) = ?; '
                               + N'DECLARE @off int = DATEDIFF(minute, SYSDATETIME(), SYSUTCDATETIME()), @tz nvarchar(128) = NULLIF(@Arg3, N''''), '
                               + N'@snap datetime = CONVERT(datetime, CONVERT(char(8), @Arg1), 112); ';
    DECLARE @tz nvarchar(128) = NULLIF(DBA.fn_GetSettingNvarchar(N'Collect.SourceTimeZone', N''), N'');
    IF @tz IS NULL
    BEGIN
        CREATE TABLE #tz (tz nvarchar(128) NULL);
        EXEC DBA.usp_RemoteInsert @DBLinkName, N'#tz', N'tz',
            N'DECLARE @Arg1 bigint = ?, @Arg2 bigint = ?, @Arg3 nvarchar(max) = ?;
              IF CAST(SERVERPROPERTY(''ProductMajorVersion'') AS int) >= 16 EXEC (N''SELECT CURRENT_TIMEZONE_ID()'');
              ELSE SELECT CAST(NULL AS nvarchar(128));';
        SET @tz = (SELECT TOP (1) tz FROM #tz);
    END

    DECLARE @q TABLE (seq int, Target sysname, Cols nvarchar(max), Body nvarchar(max));
    INSERT @q VALUES
    (1, N'perf.Stg_MetaObject', N'object_id, SchemaName, ObjectName, ObjectType, CreateDateUtc, ModifyDateUtc',
     N'o.object_id, SCHEMA_NAME(o.schema_id), o.name, o.type, CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, o.create_date) ELSE CONVERT(datetime, o.create_date AT TIME ZONE @tz AT TIME ZONE N''UTC'') END, CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, o.modify_date) ELSE CONVERT(datetime, o.modify_date AT TIME ZONE @tz AT TIME ZONE N''UTC'') END
       FROM sys.objects AS o WHERE o.is_ms_shipped = 0 AND o.type IN (''U'',''V'',''P'',''FN'',''IF'',''TF'',''TR'')'),
    (2, N'perf.Stg_MetaColumn', N'object_id, column_id, ColumnName, TypeName, MaxLength, [Precision], Scale, IsNullable, IsIdentity, IsComputed, ComputedDefinition, CollationName, IsSparse',
     N'c.object_id, c.column_id, c.name, TYPE_NAME(c.user_type_id), c.max_length, c.precision, c.scale, c.is_nullable, c.is_identity, c.is_computed,
       cc.definition, c.collation_name, c.is_sparse
       FROM sys.columns AS c JOIN sys.objects AS o ON o.object_id = c.object_id
       LEFT JOIN sys.computed_columns AS cc ON cc.object_id = c.object_id AND cc.column_id = c.column_id
       WHERE o.is_ms_shipped = 0 AND o.type IN (''U'',''V'')'),
    (3, N'perf.Stg_MetaIndex', N'object_id, index_id, IndexName, IndexType, TypeDesc, IsUnique, IsPrimaryKey, IsUniqueConstraint, HasFilter, FilterDefinition, [FillFactor], IsDisabled, DataCompression, PartitionCount',
     N'i.object_id, i.index_id, i.name, i.type, i.type_desc, i.is_unique, i.is_primary_key, i.is_unique_constraint, i.has_filter, i.filter_definition,
       i.fill_factor, i.is_disabled,
       (SELECT TOP (1) p.data_compression_desc FROM sys.partitions AS p WHERE p.object_id = i.object_id AND p.index_id = i.index_id ORDER BY p.partition_number),
       (SELECT COUNT(*) FROM sys.partitions AS p WHERE p.object_id = i.object_id AND p.index_id = i.index_id)
       FROM sys.indexes AS i JOIN sys.objects AS o ON o.object_id = i.object_id
       WHERE o.is_ms_shipped = 0 AND o.type IN (''U'',''V'') AND i.is_hypothetical = 0'),
    (4, N'perf.Stg_MetaIndexColumn', N'object_id, index_id, index_column_id, column_id, key_ordinal, is_descending_key, is_included_column, partition_ordinal',
     N'ic.object_id, ic.index_id, ic.index_column_id, ic.column_id, ic.key_ordinal, ic.is_descending_key, ic.is_included_column, ic.partition_ordinal
       FROM sys.index_columns AS ic JOIN sys.objects AS o ON o.object_id = ic.object_id
       JOIN sys.indexes AS i ON i.object_id = ic.object_id AND i.index_id = ic.index_id
       WHERE o.is_ms_shipped = 0 AND o.type IN (''U'',''V'') AND i.is_hypothetical = 0'),
    (5, N'perf.Stg_MetaStatistics', N'object_id, stats_id, StatsName, AutoCreated, UserCreated, NoRecompute, HasFilter, FilterDefinition, LastUpdatedUtc, [Rows], RowsSampled, ModificationCounter',
     N's.object_id, s.stats_id, s.name, s.auto_created, s.user_created, s.no_recompute, s.has_filter, s.filter_definition,
       CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, sp.last_updated) ELSE CONVERT(datetime, sp.last_updated AT TIME ZONE @tz AT TIME ZONE N''UTC'') END, sp.rows, sp.rows_sampled, sp.modification_counter
       FROM sys.stats AS s JOIN sys.objects AS o ON o.object_id = s.object_id
       OUTER APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS sp
       WHERE o.is_ms_shipped = 0 AND o.type = ''U'''),
    (6, N'perf.Stg_MetaStatisticsColumn', N'object_id, stats_id, stats_column_id, column_id',
     N'sc.object_id, sc.stats_id, sc.stats_column_id, sc.column_id
       FROM sys.stats_columns AS sc JOIN sys.objects AS o ON o.object_id = sc.object_id
       WHERE o.is_ms_shipped = 0 AND o.type = ''U'''),
    (7, N'perf.Stg_MetaModuleDefinition', N'object_id, Definition',
     N'm.object_id, m.definition FROM sys.sql_modules AS m JOIN sys.objects AS o ON o.object_id = m.object_id WHERE o.is_ms_shipped = 0'),
    (8, N'perf.Stg_MetaForeignKey', N'fk_object_id, FkName, ParentObjectId, ReferencedObjectId, IsDisabled, IsNotTrusted, DeleteAction, UpdateAction',
     N'fk.object_id, fk.name, fk.parent_object_id, fk.referenced_object_id, fk.is_disabled, fk.is_not_trusted,
       fk.delete_referential_action_desc, fk.update_referential_action_desc
       FROM sys.foreign_keys AS fk WHERE fk.is_ms_shipped = 0'),
    (9, N'perf.Stg_MetaForeignKeyColumn', N'fk_object_id, constraint_column_id, parent_column_id, referenced_column_id',
     N'fkc.constraint_object_id, fkc.constraint_column_id, fkc.parent_column_id, fkc.referenced_column_id FROM sys.foreign_key_columns AS fkc'),
    (10, N'perf.Stg_MetaTableSize', N'object_id, SnapshotDateUtc, [RowCount], ReservedMB, DataMB, IndexMB, UnusedMB, PartitionCount',
     N'ps.object_id, @snap,
       SUM(CASE WHEN ps.index_id IN (0,1) THEN ps.row_count ELSE 0 END),
       SUM(ps.reserved_page_count) * 8 / 1024.0,
       SUM(CASE WHEN ps.index_id IN (0,1) THEN ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count ELSE 0 END) * 8 / 1024.0,
       (SUM(ps.used_page_count) - SUM(CASE WHEN ps.index_id IN (0,1) THEN ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count ELSE 0 END)) * 8 / 1024.0,
       (SUM(ps.reserved_page_count) - SUM(ps.used_page_count)) * 8 / 1024.0,
       COUNT(DISTINCT ps.partition_number)
       FROM sys.dm_db_partition_stats AS ps JOIN sys.objects AS o ON o.object_id = ps.object_id
       WHERE o.is_ms_shipped = 0 AND o.type = ''U'' GROUP BY ps.object_id'),
    -- #1191: index başına iki ilişkili OUTER APPLY sys.sysrowsets üzerinde eager index spool kuruyordu (DB-10 2,6 sn);
    -- önceden gruplanmış LEFT JOIN aynı sonucu 0,5 sn'de verir
    (11, N'perf.Stg_MetaIndexUsage', N'object_id, index_id, SnapshotDateUtc, user_seeks, user_scans, user_lookups, user_updates, LastUserSeekUtc, LastUserScanUtc, LastUserLookupUtc, LastUserUpdateUtc, SqlServerStartUtc,
          IndexRowCount, IndexSizeMB, LeafInserts, LeafUpdates, LeafDeletes, LeafAllocations, RowLockWaitMs, PageLatchWaitMs, PageIoLatchWaitMs',
     N'i.object_id, i.index_id, @snap, ISNULL(u.user_seeks, 0), ISNULL(u.user_scans, 0), ISNULL(u.user_lookups, 0), ISNULL(u.user_updates, 0),
       CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, u.last_user_seek) ELSE CONVERT(datetime, u.last_user_seek AT TIME ZONE @tz AT TIME ZONE N''UTC'') END, CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, u.last_user_scan) ELSE CONVERT(datetime, u.last_user_scan AT TIME ZONE @tz AT TIME ZONE N''UTC'') END, CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, u.last_user_lookup) ELSE CONVERT(datetime, u.last_user_lookup AT TIME ZONE @tz AT TIME ZONE N''UTC'') END, CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, u.last_user_update) ELSE CONVERT(datetime, u.last_user_update AT TIME ZONE @tz AT TIME ZONE N''UTC'') END,
       (SELECT CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, sqlserver_start_time) ELSE CONVERT(datetime, sqlserver_start_time AT TIME ZONE @tz AT TIME ZONE N''UTC'') END FROM sys.dm_os_sys_info),
       sz.RowCnt, sz.SizeMB, op.Ins, op.Upd, op.Del, op.Alloc, op.LockMs, op.LatchMs, op.IoMs
       FROM sys.indexes AS i JOIN sys.objects AS o ON o.object_id = i.object_id
       LEFT JOIN sys.dm_db_index_usage_stats AS u ON u.database_id = DB_ID() AND u.object_id = i.object_id AND u.index_id = i.index_id
       LEFT JOIN (SELECT ps.object_id, ps.index_id, SUM(ps.row_count) AS RowCnt, CAST(SUM(ps.used_page_count) * 8 / 1024.0 AS decimal(18,2)) AS SizeMB
                  FROM sys.dm_db_partition_stats AS ps GROUP BY ps.object_id, ps.index_id) AS sz ON sz.object_id = i.object_id AND sz.index_id = i.index_id
       LEFT JOIN (SELECT x.object_id, x.index_id, SUM(x.leaf_insert_count) AS Ins, SUM(x.leaf_update_count) AS Upd, SUM(x.leaf_delete_count) AS Del,
                         SUM(x.leaf_allocation_count) AS Alloc, SUM(x.row_lock_wait_in_ms) AS LockMs, SUM(x.page_latch_wait_in_ms) AS LatchMs,
                         SUM(x.page_io_latch_wait_in_ms) AS IoMs
                  FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) AS x GROUP BY x.object_id, x.index_id) AS op ON op.object_id = i.object_id AND op.index_id = i.index_id
       WHERE o.is_ms_shipped = 0 AND o.type IN (''U'',''V'') AND i.is_hypothetical = 0'),
    (12, N'perf.Stg_MetaMissingIndex', N'index_handle, SnapshotDateUtc, object_id, EqualityColumns, InequalityColumns, IncludedColumns, UserSeeks, UserScans, AvgTotalUserCost, AvgUserImpact, LastUserSeekUtc',
     N'd.index_handle, @snap, d.object_id, d.equality_columns, d.inequality_columns, d.included_columns,
       s.user_seeks, s.user_scans, s.avg_total_user_cost, s.avg_user_impact, CASE WHEN @tz IS NULL THEN DATEADD(minute, @off, s.last_user_seek) ELSE CONVERT(datetime, s.last_user_seek AT TIME ZONE @tz AT TIME ZONE N''UTC'') END
       FROM sys.dm_db_missing_index_details AS d
       JOIN sys.dm_db_missing_index_groups AS g ON g.index_handle = d.index_handle
       JOIN sys.dm_db_missing_index_group_stats AS s ON s.group_handle = g.index_group_handle
       WHERE d.database_id = DB_ID()'),
    -- Partition: RANGE RIGHT/LEFT fark etmeksizin p. partition'ın alt sınırı (p-1). boundary'dir
    (13, N'perf.Stg_MetaPartition', N'object_id, index_id, SchemeName, FunctionName, PartitionColumn, BoundaryType, BoundaryOnRight, PartitionCount, NonEmptyPartitions, FirstBoundary, LastBoundary, FirstDataPartition, LastDataPartition, DataLowerBoundary, LastPartitionRows, MaxPartitionRows',
     N'i.object_id, i.index_id, ds.name, pf.name,
       (SELECT c.name FROM sys.index_columns AS ic JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
         WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.partition_ordinal = 1),
       (SELECT TYPE_NAME(pp.user_type_id) FROM sys.partition_parameters AS pp WHERE pp.function_id = pf.function_id AND pp.parameter_id = 1),
       pf.boundary_value_on_right, pf.fanout, st.NonEmpty,
       (SELECT CASE WHEN CAST(SQL_VARIANT_PROPERTY(v.value, ''BaseType'') AS sysname) IN (''date'', ''datetime'', ''datetime2'', ''smalldatetime'', ''datetimeoffset'') THEN CONVERT(nvarchar(100), CAST(v.value AS datetime2), 121) ELSE CAST(v.value AS nvarchar(100)) END FROM sys.partition_range_values AS v WHERE v.function_id = pf.function_id AND v.boundary_id = 1),
       (SELECT CASE WHEN CAST(SQL_VARIANT_PROPERTY(v.value, ''BaseType'') AS sysname) IN (''date'', ''datetime'', ''datetime2'', ''smalldatetime'', ''datetimeoffset'') THEN CONVERT(nvarchar(100), CAST(v.value AS datetime2), 121) ELSE CAST(v.value AS nvarchar(100)) END FROM sys.partition_range_values AS v WHERE v.function_id = pf.function_id AND v.boundary_id = pf.fanout - 1),
       st.FirstData, st.LastData,
       (SELECT CASE WHEN CAST(SQL_VARIANT_PROPERTY(v.value, ''BaseType'') AS sysname) IN (''date'', ''datetime'', ''datetime2'', ''smalldatetime'', ''datetimeoffset'') THEN CONVERT(nvarchar(100), CAST(v.value AS datetime2), 121) ELSE CAST(v.value AS nvarchar(100)) END FROM sys.partition_range_values AS v WHERE v.function_id = pf.function_id AND v.boundary_id = st.FirstData - 1),
       (SELECT ps.row_count FROM sys.dm_db_partition_stats AS ps WHERE ps.object_id = i.object_id AND ps.index_id = i.index_id AND ps.partition_number = pf.fanout),
       st.MaxRows
       FROM sys.indexes AS i JOIN sys.objects AS o ON o.object_id = i.object_id
       JOIN sys.partition_schemes AS ds ON ds.data_space_id = i.data_space_id
       JOIN sys.partition_functions AS pf ON pf.function_id = ds.function_id
       OUTER APPLY (SELECT SUM(CASE WHEN ps.row_count > 0 THEN 1 ELSE 0 END) AS NonEmpty,
                           MIN(CASE WHEN ps.row_count > 0 THEN ps.partition_number END) AS FirstData,
                           MAX(CASE WHEN ps.row_count > 0 THEN ps.partition_number END) AS LastData,
                           MAX(ps.row_count) AS MaxRows
                    FROM sys.dm_db_partition_stats AS ps WHERE ps.object_id = i.object_id AND ps.index_id = i.index_id) AS st
       WHERE o.is_ms_shipped = 0 AND o.type IN (''U'',''V'') AND i.is_hypothetical = 0'),
    -- Nesne düzeyi bağımlılık (kolon düzeyi referencing_minor_id gruplanır); DB'ler arası/linked server referansları adla gelir
    (14, N'perf.Stg_MetaDependency', N'referencing_id, ReferencedServer, ReferencedDatabase, ReferencedSchema, ReferencedEntity, referenced_id, ReferencedClass, IsAmbiguous, IsCallerDependent',
     N'd.referencing_id, d.referenced_server_name, d.referenced_database_name, d.referenced_schema_name, d.referenced_entity_name,
       d.referenced_id, d.referenced_class, MAX(CAST(d.is_ambiguous AS tinyint)), MAX(CAST(d.is_caller_dependent AS tinyint))
       FROM sys.sql_expression_dependencies AS d JOIN sys.objects AS o ON o.object_id = d.referencing_id
       WHERE d.referencing_class = 1 AND o.is_ms_shipped = 0 AND d.referenced_entity_name IS NOT NULL
       GROUP BY d.referencing_id, d.referenced_server_name, d.referenced_database_name, d.referenced_schema_name, d.referenced_entity_name,
                d.referenced_id, d.referenced_class');

    -- K1-3: histogram (sys.dm_db_stats_histogram) SQL 2017+; eski sürümde metadata toplamasının geri kalanı düşmesin
    DECLARE @ver int;
    EXEC DBA.usp_GetRemoteVersion @DBLinkName, @ver OUTPUT;
    IF @ver >= 14
        INSERT @q VALUES
        (15, N'perf.Stg_MetaStatisticsHistogram', N'object_id, stats_id, step_number, RangeHighKey, RangeRows, EqualRows, DistinctRangeRows, AverageRangeRows',
         N's.object_id, s.stats_id, h.step_number,
           CASE WHEN CAST(SQL_VARIANT_PROPERTY(h.range_high_key, ''BaseType'') AS sysname) IN (''date'', ''datetime'', ''datetime2'', ''smalldatetime'', ''datetimeoffset'')
                THEN CONVERT(nvarchar(400), CAST(h.range_high_key AS datetime2), 121)
                WHEN CAST(SQL_VARIANT_PROPERTY(h.range_high_key, ''BaseType'') AS sysname) IN (''binary'', ''varbinary'')
                THEN CONVERT(nvarchar(400), CAST(h.range_high_key AS varbinary(200)), 1)
                ELSE LEFT(CONVERT(nvarchar(4000), h.range_high_key), 400) END,
           h.range_rows, h.equal_rows, h.distinct_range_rows, h.average_range_rows
           FROM sys.stats AS s JOIN sys.objects AS o ON o.object_id = s.object_id
           CROSS APPLY sys.dm_db_stats_histogram(s.object_id, s.stats_id) AS h
           WHERE o.is_ms_shipped = 0 AND o.type = ''U''');

    DECLARE @target sysname, @cols nvarchar(max), @body nvarchar(max), @remote nvarchar(max), @del nvarchar(max), @allCols nvarchar(max);
    DECLARE c CURSOR LOCAL FAST_FORWARD FOR SELECT Target, Cols, Body FROM @q ORDER BY seq;
    OPEN c; FETCH NEXT FROM c INTO @target, @cols, @body;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @del = N'DELETE ' + @target + N' WHERE ServerID = @s AND DatabaseName = @d;';
        EXEC sys.sp_executesql @del, N'@s int, @d sysname', @s = @ServerID, @d = @DatabaseName;
        SET @remote = @hdr + @use + N'SELECT ' + @sid + N', ' + @lit + N', ' + @body + N';';
        SET @allCols = N'ServerID, DatabaseName, ' + @cols;
        EXEC DBA.usp_RemoteInsert @DBLinkName, @target, @allCols, @remote, @snapDay, NULL, @tz;
        FETCH NEXT FROM c INTO @target, @cols, @body;
    END
    CLOSE c; DEALLOCATE c;
END;

Bu nesnenin analizleri

Kayıt yok

Bu nesne için analiz yok.