2012-05-23 47 views
1

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

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

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

+2

SELECT * FROM MyTable TABLESAMPLE(50000 ROWS)不起作用? –

+0

@DavidBrabant状态,作为一个更新和张贴它作为一个答案。或者我会的。 :-) –

回答

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

现在有some discussion of this going on in another question