首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于一个小表,sys.dm_db_stats_properties似乎行为不当--如何以不同的方式获取表的记录数?

对于一个小表,sys.dm_db_stats_properties似乎行为不当--如何以不同的方式获取表的记录数?
EN

Database Administration用户
提问于 2019-04-23 13:58:13
回答 1查看 519关注 0票数 1

我的数据库里有一张桌子:

代码语言:javascript
运行
复制
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条记录。

即使在运行以下命令之后:

代码语言:javascript
运行
复制
update statistics dbo.repl_Gender_Type with fullscan

在运行以下查询时,没有得到任何结果:

代码语言:javascript
运行
复制
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。

我认为,上述任何一项都不是正确的。

我喜欢使用下面的脚本,它来自于这个问题:

服务提供商_更新统计与更新统计

代码语言:javascript
运行
复制
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;
EN

回答 1

Database Administration用户

发布于 2019-04-23 17:54:38

这只是一个部分的答案,因为我找不出为什么糖尿病组_数据库_统计数据_属性没有为那个特定的表保存任何东西。

不过,我真正想要的是对发布服务器数据库上的复制表有一个良好的视图,并且按照注释和其他一些脚本的要求,我得到了一个足够好的视图,可以使用下面的脚本进行分析:

代码语言:javascript
运行
复制
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

这给了我:

编辑:

当查看上面脚本中的输出表时,我得到:

代码语言:javascript
运行
复制
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),我不得不使用用这个小把戏

票数 -1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/235480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档