zoukankan      html  css  js  c++  java
  • 随机读取记录

    这几天突然想到一个问题关于随机读取记录的问题。这个问题也是我看到一些网站有在线随机答。他的随机是怎么实现的呢?于是在网站找一资料。选COPY过来以后有时间看看研究一下

    方法一:
        直接通过Sql语句实现,如:

    select top n *
    from tableA
    order by newid()

        这是最简单的方法,通过调用SqlServer的newid()函数(产生GUID—全局唯一标志符)来产生随机记录。
        采用这种方法时,需要将表中所有记录与newid()生成的值进行比较从而进行排序。因此,如果表中的记录较多,操作会非常缓慢。

    方法二:
        假设表中有一个自增长主键,增量为1。这时我们可以这样处理,取出主键的边界值(最大值和最小值),然后通过一个算法得到介于(包括)两个边界之间的随机值,最后按照这个值取出对应记录。下面是C#的例子:

    //生成随机数
    Random rand = new Random();
    int num = rand.Next(MinVal,MaxVal + 1); //MinVal为主键的最小值,MaxVal为主键的最大值

    //读取记录的Sql字符串
    string SqlStr = "select * from tableA where PK = " + num;

        这种方法较前一种方法的操作速度有了较大提高(特别是在大数据量的情况下)。但只有当主键值是连续的,中间没有断开的情况,并且增量为1时才能用这种方法。那么,如何才能解决这个问题呢?请继续往下看。

    方法三:
        对方法二进行了改进。主要思路是,将表中所有的主键值读进一个数组,从数组中随机读出一个值,按照这个值取出对应记录。下面是C#的例子:

    //将主键值读进ArrayList
    ArrayList DataIndex = new ArrayList();
    while (sdr.Read()) //sdr为存放所有主键值的SqlDataReader
    {
        DataIndex.Add(sdr[
    0]); //存入ArrayList
    }


    //从ArrayList中随机读取数据项
    Random rand = new Random();
    int num = Convert.ToInt32(DataIndex[rand.Next(DataIndex.Length)]);

    //读取记录的Sql字符串
    string SqlStr = "select * from tableA where PK = " + num;

        这样不管主键是否为自增长字段,也不管数值是否连续,都能够应付自如了。经过笔者的测试,在数据量为50万的情况下代码运行速度几乎没有受到什么影响,可见ArrayList的操作性能是可以信赖的。
  • 相关阅读:
    宿主机无法访问CentOS7上Jenkins服务的解决办法
    415. Add Strings
    367. Valid Perfect Square
    326. Power of Three
    258. Add Digits
    231. Power of Two
    204. Count Primes
    202. Happy Number
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/skyblue/p/1304585.html
Copyright © 2011-2022 走看看