AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 612
Accepted
ravikanth
ravikanth
Asked: 2011-01-15 00:05:47 +0800 CST2011-01-15 00:05:47 +0800 CST 2011-01-15 00:05:47 +0800 CST

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

  • 772

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

我有另一个按顺序读取此表的应用程序。但是,这样我最终会向同一个网站集发送 HTTP 请求更长的时间。

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

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

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

sql-server sql-server-2008-r2
  • 2 2 个回答
  • 178 Views

2 个回答

  • Voted
  1. Best Answer
    David Spillett
    2011-01-15T02:34:07+08:002011-01-15T02:34:07+08:00

    如果调用应用程序在其查询中明确设置特定顺序(如果您运行的是 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()
    

    或者这可能会更快

    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(您的问题没有说明您的目标是哪个 DBMS)并且表上还没有聚簇索引,并且具有足够随机的列(例如 UUID 列)或者可以添加一个而不会打乱调用应用程序,您可以在其上创建一个聚集索引,这比上面的 SELECT INTO / DELETE / SELECT INTO 更快。但同样:如果应用程序以特定顺序明确要求结果,这将根本没有效果,否则可能不会有任何效果。

    • 10
  2. Gaius
    2011-01-15T02:06:46+08:002011-01-15T02:06:46+08:00

    您不指定哪个数据库,但在 Oracle 中您可以通过以下方式执行此操作:

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

    您需要在 TEMP 表空间中有足够的空间来处理排序。然后,如果您愿意,可以重命名表格ORIG_TABLE并将RAND_TABLE它们交换过来。我认为不可能“就地”洗牌。

    • 4

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve