更新统计信息时抽样如何工作?

Nik*_*Nik 13 sql-server statistics

我有几个大桌子。我想通过每周维护计划确保他们的统计数据是最新的。

但是,这样做需要花费太多时间。

如果我指定

WITH SAMPLE 50 PERCENT
Run Code Online (Sandbox Code Playgroud)

SQL Server 然后采样:

  1. 前 50% 的页面
  2. 每隔一页
  3. 或其他一些策略?

BOL对此并不明确。

Mar*_*ith 18

因为WITH SAMPLE 50 PERCENT它就像对表中的每个数据页 SQL Server 抛硬币一样。如果它着陆,那么它会读取页面上的所有行。如果它落在尾部,那么它不会读取任何内容。

跟踪UPDATE STATISTICS T WITH SAMPLE 50 PERCENTProfiler 中的调用显示发出以下查询

SELECT StatMan([SC0], [SB0000])
FROM   (SELECT TOP 100 PERCENT [SC0],
                               step_direction([SC0]) OVER (ORDER BY NULL) AS [SB0000]
        FROM   (SELECT [C] AS [SC0]
                FROM   [dbo].[T] TABLESAMPLE SYSTEM (5.000000e+001 PERCENT) 
                WITH (READUNCOMMITTED)) AS _MS_UPDSTATS_TBL_HELPER
        ORDER  BY [SC0],
                  [SB0000]) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 1) 
Run Code Online (Sandbox Code Playgroud)

有计划

在此处输入图片说明

TABLESAMPLE SYSTEM (5.000000e+001 PERCENT)负责采样并记录在此处

TABLESAMPLE SYSTEM返回大约百分比的行并为表中的每个物理 8 KB 页生成一个随机值。根据页面的随机值和查询中指定的百分比,页面要么包含在样本中,要么被排除在外。包含的每个页面都返回示例结果集中的所有行。

该文件还指出

尽管计划显示执行了表扫描,但实际上只需要从数据文件中读取包含在结果集中的那些页面。

STATMAN调用是对此处简要描述的内部聚合函数的调用