1

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

通过 NEWID() 选择前 50,000 个订单需要的时间太长,我认为 SQL Server 正在扫描整个表。我似乎无法为 TABLESAMPLE 找到正确的语法,它返回一个空集。

让它发挥作用的最佳方法是什么?

4

1 回答 1

3

并将其视为更新:

;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 行的页面数。根据您的填充因子、可变长度列的数量、NULL 值的数量等,您最终可能会得到更少或更多。当估计导致读取更多页面时,上面的 TOP 将有助于将其限制为 50,000,但是如果估计低于,那将无济于事。

现在在另一个问题中对此进行了一些讨论

于 2012-05-23T18:58:54.063 回答