我的数据库里有一张桌子:
IF OBJECT_ID('[dbo].[repl_Gender_Type]') IS NOT NULL
DROP TABLE [dbo].[repl_Gender_Type]
GO
CREATE TABLE [dbo].[repl_Gender_Type] (
[Gender_TypeID] CHAR(1) NOT NULL,
[Gender_Desc] VARCHAR(20) NOT NULL,
[Create_Date] DATETIME NOT NULL,
[Create_Userid] VARCHAR(20) NOT NULL,
CONSTRAINT [PK__Gender__46DD686B] PRIMARY KEY NONCLUSTERED ([Gender_TypeID] asc))
上面只有3条记录。
即使在运行以下命令之后:
update statistics dbo.repl_Gender_Type with fullscan
在运行以下查询时,没有得到任何结果:
select SP.*
from dbo.sysarticles A
OUTER APPLY [sys].[dm_db_stats_properties](a.objid,1) sp
where a.objid = OBJECT_ID('dbo.repl_Gender_Type')
那么糖尿病组_数据库_统计数据_属性不跟踪小型表吗?在表中查找记录的数量是什么工作?
sys.dm_db_stats_properties在下列任何条件下返回一个空行集: object_id或stats_id为NULL。未找到或不对应于表或索引视图的指定对象。指定的统计信息ID不对应于指定对象ID的现有统计信息。当前用户没有查看统计信息对象的权限。此行为允许在交叉应用于视图(如sys.dm_db_stats_properties和sys.stats )中的行时安全使用sys.objects。
我认为,上述任何一项都不是正确的。
我喜欢使用下面的脚本,它来自于这个问题:
SELECT [sch].[name] + '.' + [so].[name] AS [TableName] ,
[ss].[name] AS [Statistic],
[sp].[last_updated] AS [StatsLastUpdated] ,
[sp].[rows] AS [RowsInTable] ,
[sp].[rows_sampled] AS [RowsSampled] ,
[sp].[modification_counter] AS [RowModifications]
FROM [sys].[stats] [ss]
JOIN [sys].[objects] [so] ON [ss].[object_id] = [so].[object_id]
JOIN [sys].[schemas] [sch] ON [so].[schema_id] = [sch].[schema_id]
OUTER APPLY [sys].[dm_db_stats_properties]([so].[object_id],
[ss].[stats_id]) sp
WHERE [so].[type] = 'U'
AND [sp].[modification_counter] > 0--change accordingly
ORDER BY [sp].[last_updated] DESC;
发布于 2019-04-23 17:54:38
这只是一个部分的答案,因为我找不出为什么糖尿病组_数据库_统计数据_属性没有为那个特定的表保存任何东西。
不过,我真正想要的是对发布服务器数据库上的复制表有一个良好的视图,并且按照注释和其他一些脚本的要求,我得到了一个足够好的视图,可以使用下面的脚本进行分析:
use MY_PUBLICATION_DB
GO
DECLARE @SHOW_ONLY_SUBSCRIBED_PUBLICATION BIT = 0
SELECT
Publication=P.name
,p.immediate_sync
,p.allow_anonymous
,p.replicate_ddl
,PublicationDB = db_name()
,the_TableName = OBJECT_SCHEMA_NAME(a.objid) + '.' + a.name
,total_number_of_rows = REPLACE(CONVERT(VARCHAR(50),CAST(SUM (ddps.row_count) OVER (PARTITION BY ddps.OBJECT_ID) AS MONEY),1), '.00','')
,[Statistics_Updated] = STATS_DATE(a.objid,1)
,dius.last_user_update
,DestinationServer = s.srvname
,DestinationDB = s.dest_db
,the_DestinationTable = a.dest_owner + '.' + a.dest_table
,user_seeks = REPLACE(CONVERT(VARCHAR(50),CAST(dius.user_seeks AS MONEY),1), '.00','')
,user_scans = REPLACE(CONVERT(VARCHAR(50),CAST(dius.user_scans AS MONEY),1), '.00','')
,user_lookups = REPLACE(CONVERT(VARCHAR(50),CAST(dius.user_lookups AS MONEY),1), '.00','')
,user_updates = REPLACE(CONVERT(VARCHAR(50),CAST(dius.user_updates AS MONEY),1), '.00','')
,dius.last_user_seek
,dius.last_user_scan
,dius.last_user_lookup
FROM dbo.syspublications P
INNER JOIN dbo.sysarticles A
ON P.pubid = A.pubid
LEFT OUTER JOIN dbo.syssubscriptions s
ON a.artid = s.artid
LEFT OUTER JOIN sys.dm_db_partition_stats ddps
ON a.objid = ddps.OBJECT_ID
AND ddps.index_id < 2
LEFT OUTER JOIN sys.dm_db_index_usage_stats dius
ON 1=1
AND (dius.index_id=1 OR dius.index_id=0)
AND dius.object_id = a.objid
AND dius.database_id = DB_ID()
WHERE 1=1
AND 1=CASE WHEN @SHOW_ONLY_SUBSCRIBED_PUBLICATION = 1 THEN
CASE WHEN s.srvid > 0 THEN 1
ELSE 0
END
ELSE
CASE WHEN EXISTS(SELECT 'RADHE' FROM dbo.syssubscriptions s WHERE s.artid = a.artid AND s.srvid > 0) THEN
CASE WHEN (s.srvid < 0) THEN 0
ELSE 1
END
ELSE 1
END
END
ORDER BY ddps.row_count DESC
这给了我:
当查看上面脚本中的输出表时,我得到:
IF OBJECT_ID('[dbo].[publications_20190423_]') IS NOT NULL
DROP TABLE [dbo].[publications_20190423_]
GO
CREATE TABLE [dbo].[publications_20190423_] (
[Publication] SYSNAME NOT NULL,
[immediate_sync] BIT NOT NULL,
[allow_anonymous] BIT NOT NULL,
[replicate_ddl] INT NULL,
[PublicationDB] NVARCHAR(128) NULL,
[the_TableName] NVARCHAR(257) NULL,
[total_number_of_rows] VARCHAR(8000) NULL,
[Statistics_Updated] DATETIME NULL,
[last_user_update] DATETIME NULL,
[DestinationServer] SYSNAME NULL,
[DestinationDB] SYSNAME NULL,
[the_DestinationTable] NVARCHAR(257) NULL,
[user_seeks] VARCHAR(8000) NULL,
[user_scans] VARCHAR(8000) NULL,
[user_lookups] VARCHAR(8000) NULL,
[user_updates] VARCHAR(8000) NULL,
[last_user_seek] DATETIME NULL,
[last_user_scan] DATETIME NULL,
[last_user_lookup] DATETIME NULL)
为了将varchar(8000)
降低到varchar(50)
,我不得不使用用这个小把戏。
https://dba.stackexchange.com/questions/235480
复制相似问题