SQL Server - Varbinary 列 - 统计更新速度极慢

Chr*_*man 6 statistics sql-server-2008-r2 varbinary

我的数据库中有一个表,我们用作文件存储,文件本身存储在一个varbinary列中,直到最近这一切似乎都运行良好,我们注意到该表的一个实例基本上“卡住”了插入语句.

检查sys.dm_os_waiting_tasks显示插入语句触发了统计更新,并且此统计更新花费了长时间。(17 分钟)。

这是我们发现运行的语句:

SELECT StatMan([SC0], [LC0]) FROM 
   (SELECT TOP 100 PERCENT CONVERT([varbinary](200), 
        SUBSTRING ([Data], 1, 100)++substring([Data], 
        case when LEN([Data])<=200 then 101 else 
        LEN([Data])-99 end, 100)) AS [SC0], 
        datalength([Data]) AS [LC0] 
    FROM [FileSystem].[FileData] WITH 
    (READUNCOMMITTED) ORDER BY [SC0] ) AS _MS_UPDSTATS_TBL
Run Code Online (Sandbox Code Playgroud)

该表中大约有 2000 行,如下所示:

CREATE TABLE [FileSystem].[FileData]
(
[Id] [uniqueidentifier] NOT NULL CONSTRAINT [DF__FileData__Id__09DE7BCC] DEFAULT     (newsequentialid()),
[Data] [varbinary] (max) NULL,
[FileHash] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[FileSize] [bigint] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [FileSystem].[FileData] ADD CONSTRAINT [PK_FileData] PRIMARY KEY     CLUSTERED  ([Id]) WITH (STATISTICS_NORECOMPUTE=ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

我们知道这个表很奇怪,我们小心地只用聚集索引查找来处理它。

目前,我们只是禁用了该表的自动统计数据生成,但我想知道这是否真的是最佳实践。如果没有最新的统计数据,性能最终会成为一个问题(请记住,该表仅由其聚集索引处理)?

更新:
好的,我很确定我们已经找出了导致生成统计信息的原因:

GO CREATE PROCEDURE [FileSystem].[FileData_AppendNewData_Easy] 
    (@fileDataId  uniqueidentifier ) 
WITH EXECUTE AS CALLER AS 
BEGIN 
   declare @testValue varbinary(max); 

   set @testValue = 0xabcedf012439; 

   Update FileSystem.FileData 
   set Data.Write(@testValue, null, null) 
   where Id = @fileDataId ;
END
Run Code Online (Sandbox Code Playgroud)

这是导致问题的程序的简化版本,它似乎Data.Write导致数据列上的某种隐式谓词?好吧,这解决了这个谜团,虽然我仍然不确定禁用此表的统计信息可能会产生什么影响,有人可以对此发表评论吗?

Dav*_*kle 1

在这种情况下,禁用该表的自动更新统计信息应该没问题,因为您只需通过其唯一的聚集索引来寻址每个记录。由于索引的选择性是完美的,并且它永远不会改变,因此优化器永远不需要根据不断变化的统计信息来查看其他查询计划。