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 更快。但是,再次:这将没有任何影响,如果应用程序明确要求按照特定顺序的结果,并可能没有任何效果反正否则。
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |