大量数据的话NEWID总是速度太慢太慢...但偏偏客户又要随机的,不要order by id
哎,不知道咋办了,NEWID查500W数据100条记录得一分钟到几分钟...
谢谢大家帮忙想想办法.

解决方案 »

  1.   

    同意,生产500个ID范围内的不重复值再JOIN原表
      

  2.   

    视图,索引都建了,对NEWID不管用
    那就是从ID1到ID500,然后再随机查100条?
      

  3.   


    UP不过不是根治的办法 
    万一过段时间数据飙过亿
    客户还要随机
    终究还得继续 优化优化有时候客户的一些需求很是超技术现实的
    这样的需求可以做,但是是否达到客户预计的效果那就难说
    不是人品或技术不行 而是一些需求和技术的衔接不是那么完美滴
    要协调和沟通
    得理解客户在500W里随机的真实意图是什么
    要数据的公平?抽样?均衡?
    有没有变通的可能?
    若客户坚持必须这样做,
    那就让客户明白这么干,要么花钱,要么花时间
    免得自己费尽心思但是客户又极其不满
      

  4.   

    select top 100 id 姓名,性别,手机,城市,地址,备注  from v_Applet where isnull(状态,'')<>'2' order by id update v_Applet set 状态=2 where id in(select top 100 id  from v_Applet where isnull(状态,'')<>'2' order by id)
      

  5.   

    使用TABLESAMPLE试试吧:
    http://msdn.microsoft.com/zh-cn/library/ms189108%28SQL.90%29.aspx
      

  6.   

    如:
    select top 100 * from (
    select * from dbo.tbname tablesample (1000 rows)
    )a
      

  7.   


    --环境:SQLServer2005 兼容级别:90
    USE AdventureWorks ;
    GO
    SELECT 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,暴露出来的问题可能会更严重。希望能帮助你。
      

  8.   

    LS的能否加我QQ详细了解一下...
      

  9.   

    500万条数据编号
    用rand()函数取随机数
      

  10.   

    如果客户是为了抽样调查,想要得到纯粹的随机数据,即使慢最好也要使用newid(函数)或者其他系统提供的随机函数如rand。两者性能差不多,如果换成其他的方法对抽样都不是完全随机的。而且随机100行,和随机1000行时间都差不了多少,实在慢那就买硬件吧,我们数据库经常是在上亿数据行里面筛选100W,也差不多10分钟左右
      

  11.   

    好像有点启发,楼主知道 row_num()函数吧,把500w行生成从1到500W递增的序号表,然后在随机生成500个自然数,然后匹配带递增序号表就能随机抽500个了。
      

  12.   

    newid后怎么知道是那条记录????