Nik*_*Nik 13 sql-server statistics
我有几个大桌子。我想通过每周维护计划确保他们的统计数据是最新的。
但是,这样做需要花费太多时间。
如果我指定
WITH SAMPLE 50 PERCENT
Run Code Online (Sandbox Code Playgroud)
SQL Server 然后采样:
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调用是对此处简要描述的内部聚合函数的调用