随机化表格内容并将它们存储回表格

rav*_*nth 4 sql-server t-sql sql-server-2008-r2

我有一张至少有一百万条记录的表。这些行是由一个自定义应用程序创建的,该应用程序读取多个 SharePoint 网站集并将项目 URL 存储在表中。现在,由于我们以串行方式读取网站集,前几千行属于第一个网站集,接下来的几千行属于第二个网站集,依此类推。

我有另一个应用程序以顺序方式读取此表。但是,通过这种方式,我最终将 HTTP 请求发送到同一个网站集的时间更长。

我知道我可以从我的第二个应用程序中的表格中获得随机结果。但是,这不是一种选择。我无法改变第二个应用程序的工作方式。

现在,问题是:如何获取表中的所有行,将它们打乱并将其存储回表中?

更新:SQL Server 2008 R2 是我的数据库服务器

Dav*_*ett 10

如果调用应用程序在其查询中明确设置特定顺序(如果您正在运行 MSSQL,您可以通过在应用程序执行其操作时运行探查器会话来检查这一点,其他 DMBS 将具有类似的日志记录选项),那么您将无能为力做,如果不是,你不能完全保证任何特定的顺序。

如果没有给出明确的 ORDER BY 子句,那么数据将以正式“未定义”的顺序出现——这将是服务器找到最合适的顺序。对于单表查询,这很可能是主键的顺序。在 MSSQL 中,如果您有聚集索引,则结果很可能会按单个表查询的顺序出现。对于多表查询,它甚至不那么明确,因为它取决于查询规划器选择采用哪种方式来获取结果(如果没有明确的索引提示,可能会随着表中数据的平衡而变化,正如服务器保留、更改的索引统计信息)。

如果表没有聚集索引或主键,那么数据很可能以类似于数据插入顺序的任意顺序出现。在这种情况下,您可以尝试:

SELECT * INTO temp_table FROM table_to_be_reordered
DELETE table_to_be_reordered
INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()
Run Code Online (Sandbox Code Playgroud)

或者这可能会更快

INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()
DROP TABLE table_to_be_reordered
EXEC sp_rename 'temp_table', 'table_to_be_reordered'
Run Code Online (Sandbox Code Playgroud)

在上面的 NEWID() 是 MSSQL 返回 UUID 的函数,它默认使用随机而不是顺序 ID - 在其他 DMBS 中,您应该找到可以使用的类似函数。小心选择函数:例如,在 MSSQL 下,RAND() 函数对每个查询评估一次,而不是每行评估一次,因此SELECT * FROM somewhere ORDER BY RAND()不会产生预期的效果(您可以通过运行类似的东西来了解原因SELECT RAND(), * FROM some_table)。

如果您使用的是 MSSQL(您的问题没有说明您的目标是哪个 DBMS)并且表上还没有聚集索引,并且有足够随机的列(例如 UUID 列),或者可以添加一个而不会让您感到不安调用应用程序,您可以创建一个聚集索引,它会比上面的 SELECT INTO / DELETE / SELECT INTO 更快。但是,再次:这将没有任何影响,如果应用程序明确要求按照特定顺序的结果,并可能没有任何效果反正否则。