大量数据的话NEWID总是速度太慢太慢...但偏偏客户又要随机的,不要order by id。。。
哎,不知道咋办了,NEWID查500W数据100条记录得一分钟到几分钟...
谢谢大家帮忙想想办法.
------解决方案--------------------
加个where条件限制一下
------解决方案--------------------
先取一定数据量的记录比如说以前条 安装你的索引列排序
然后在在这1000里面随机取100条
------解决方案--------------------
如:
- SQL code
select top 100 * from ( select * from dbo.tbname tablesample (1000 rows))a
------解决方案--------------------
- SQL code
--环境:SQLServer2005 兼容级别:90USE AdventureWorks ;GOSELECT TOP 500 * FROM Sales.Customer TABLESAMPLE SYSTEM (10 PERCENT);--附加联机帮助TABLESAMPLE SYSTEM 返回的行数为总行数的一个近似百分比值。它为表中物理大小为 8 KB 的每一页生成一个随机值。根据某一页的随机值和查询中指定的百分比决定是否将该页包含在样本中。样本中包含的每一页都返回样本结果集中的所有行。例如,如果指定 TABLESAMPLE SYSTEM 10 PERCENT,SQL Server 将返回占指定表数据页约 10% 的所有行。如果行平均分布到表中的页上,而且表中有足够的页数,则返回的行数应接近请求的样本大小。但是,由于为每一页生成的随机值独立于为任何其他页生成的值,因此有可能返回比请求的百分比更大或更小的百分比页数。可以使用 TOP(n) 运算符将行数限制在给定最大值以内。如果指定了行数,而不是基于表中总行数的百分比,行数将会转换为行的百分比以及应返回的页的百分比。然后对计算出的百分比执行 TABLESAMPLE。如果表只包含一页,将返回该页上的所有行或不返回任何一行。即使页上存在 100 行,TABLESAMPLE SYSTEM 也只返回 100% 或 0% 的行。因此,对于包含少量页的表(不包括 text、ntext 或 image 数据),不建议使用 SYSTEM。若要使 TABLESAMPLE SYSTEM 更接近较小的表的指定样本大小,请考虑可使表的行分散到多页中的选项。对于带有聚集索引的表,可以使用 FILLFACTOR 并重新组织聚集索引,以减少页上的行数。在其他表上,可以通过在表定义中添加空的 char(4000) 或 char(2000) 列来增加行大小,使每一页仅能容纳一行或两行。 REPEATABLE 指明应再次返回选定样本。当指定了相同的 repeat_seed 值时,只要没有对表进行更改,SQL Server 就会返回相同的行子集。当指定了不同的 repeat_seed 值时,SQL Server 可能返回表中不同的行样本。对表的下列操作将视为对表的更改:插入、更新、删除、重新生成索引、对索引进行碎片整理、还原数据库以及附加数据库。对给定表使用 TABLESAMPLE SYSTEM 将把执行计划限制为使用该表上的表扫描(堆或聚集索引的扫描,如果存在堆或聚集索引)。尽管计划显示已执行表扫描,但实际上只需要从数据文件中读取结果集中包含的那些页。 使用 TABLESAMPLE SYSTEM 子句时应谨慎,还应了解使用样本的某些影响。例如,两个表的联接可能为两个表中的每一行返回一个匹配项;但是,如果为其中一个表指定 TABLESAMPLE SYSTEM,则从未抽样的表返回的某些行可能在抽样表中没有匹配行,当数据实际有效时,这可能会使您误认为基础表中存在数据一致性问题。同样,如果为联接的两个表都指定 TABLESAMPLE SYSTEM,暴露出来的问题可能会更严重。
------解决方案--------------------
500万条数据编号
用rand()函数取随机数
------解决方案--------------------
好像有点启发,楼主知道 row_num()函数吧,把500w行生成从1到500W递增的序号表,然后在随机生成500个自然数,然后匹配带递增序号表就能随机抽500个了。
------解决方案--------------------
这个确实难。。。。。
------解决方案--------------------