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

我还有另一个以顺序读取此表的应用程序。但是,这样一来,我最终将HTTP请求发送到同一站点集合更长的时间。

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

现在,问题是:如何将所有行放在桌子上,洗牌并将其存储回桌子?

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

有帮助吗?

解决方案

如果调用应用程序在其查询中明确设置特定订单(如果您正在运行MSSQL,则可以通过在应用程序执行此操作的情况下运行Profiler会话来检查此问题,其他DMBS将具有类似的日志记录选项),那么您无能为力。这样做,如果不是,您无法完全保证任何特定的订单。

如果没有给出条款的明确订单,则数据将以正式“未定义”的顺序出现,这将是服务器找到最交响的订单。对于单个表查询,这很可能是主键的顺序。在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()

否则可能会更快

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'

在上面的newID()中是MSSQL的函数,返回UUID并默认使用随机而不是顺序ID-在其他DMBS中,您应该找到可以使用的类似函数。请注意您选择的功能:例如,在MSSQL下,RAND()函数每个查询一次,而不是每行一次,所以 SELECT * FROM somewhere ORDER BY RAND() 不会具有应有的效果(您可以通过运行类似 SELECT RAND(), * FROM some_table).

如果您使用的是MSSQL(您的问题没有说明您要定位的DBM),并且在表上还没有群集索引,并且要么具有足够的随机列(例如,UUID列),或者可以添加一个而不会添加一个列调用应用程序,您可以在群集索引上创建一个群集索引,该索引比SELECT / DELETE / SELECT在上面的选择要快。但是再次:这将有 完全没有效果 如果该应用按特定顺序明确要求结果,并且 无论如何可能没有任何效果 否则。

其他提示

您没有指定哪个数据库,但是在Oracle中可以通过:

CREATE TABLE RAND_TABLE AS (SELECT * FROM ORIG_TABLE ORDER BY DBMS_RANDOM.RANDOM());

您将需要在温度表空间中足够的空间来应对分类。然后,如果您希望可以重命名表 ORIG_TABLERAND_TABLE 交换它们。我认为不可能将桌子“就地”洗牌。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top