更新大表中的随机样本

时间:2012-05-23 18:04:34

标签: sql-server-2008 random sql-server-2012 newid

使用SQL Server 2012,我有一个包含700万行的表。 PK列是GUID(COMB GUID)。我试图测试查询的性能,首先需要更新随机数据采样,我想更改50,000行的列值(而不是PK)。

按NEWID()选择Top 50,000 Order需要太长时间,我认为SQL Server正在扫描整个表。我似乎无法为TABLESAMPLE获取正确的语法,它返回一个空集。

让这个工作的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

并将其视为更新:

;WITH x AS
(
  SELECT TOP (50000) col 
  FROM dbo.table TABLESAMPLE (50000 ROWS)
)
UPDATE x SET col = 'something else';

但有几点注意事项:

  1. 您可能不会看到比ORDER BY NEWID()更大的性能提升。在1MM行的桌子上,这在我的机器上花了一分多钟。
  2. TOP是因为TABLESAMPLE不保证确切的行数 - 它基于粗略计算可能包含50,000行的页数。根据你的fillfactor,有多少可变长度列,多少NULL值等,你可能会得到更少或更多。当估计导致更多页面被读取时,上面的TOP将有助于将其限制为50,000,但是如果估计不足,那将无济于事。
  3. 现在有some discussion of this going on in another question