10万数据量的数据库查询效率比较 纯sql语句 和 view 视图

时间:2024-10-12 15:52:46

背景

工作快2个月了,日子过的真快啊。

时间真的有魔力,曾经觉得那么变态的sql语句,现在竟然觉得那么可爱(才怪)。 从刚开始的十几行的sql就觉得很长,到现在的100多行还感觉长的很正常很有道理,鬼知道我经历了什么。。。

废话不多说了,进入正题。

笔者在工作中,测试坏境下运行非常快的代码,到了正式坏境下慢了很多,原因是正式数据库数据量比较大的原因。又因为sql语句也很长了,所以考虑一下是否要用建立视图的方法来替换。今天呢就测试一下 对于同样的查询来说,使用sql语句和建立视图查询这两种方法哪一个效率高。

实验准备

我们就拿这样一个任务来测试:数据库表只有2个字段,要求读取拼接后的值。 (拼接 模拟了真实情况下大量的预处理和计算)

开始了。

建立一个新表

#############1

根据任务要求建立它的视图

#################2

插入20w条数据

        SqlConnection cn = new SqlConnection();
         = "server=.;user=sa;pwd=yourpwd;database=VS";
        ();
        SqlCommand cmd = new SqlCommand();
        for(int i=0;i<200000;i++)
        {
             = cn;
             = "insert into SqlOrView values ('"+()+"','"+()+"')";
            ();
        }
        ("insert 20w data  end...");
        ();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可以看到数据库中显示20w条

################3

接下来是真正的测试了:通过两种方式读取,并计算花费的时间:

    static void Main(string[] args)
    {
        SearchBySql();
        SearchByView();
        ();
    }

    static void SearchBySql()
    {
        SqlConnection cn = new SqlConnection();
         = "server=.;user=sa;pwd=yourpwd;database=VS";
        ();
        SqlCommand cmd = new SqlCommand();
         = cn;
         = "select (id + name) as name from SqlOrView";
        DateTime dt1 = ;
        ();
        DateTime dt2 = ;
        TimeSpan ts = (dt1);
        ( "by sql :" + ());

    }
    static void SearchByView()
    {
        SqlConnection cn = new SqlConnection();
         = "server=.;user=sa;pwd=yourpwd;database=VS";
        ();
        SqlCommand cmd = new SqlCommand();
         = cn;
         = "select * from MyView";
        DateTime dt1 = ;
        ();
        DateTime dt2 = ;
        TimeSpan ts = (dt1);
        ("by view :"+());
        ();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

第一次:

by sql :00:00:00.0670497
by view :00:00:00.0569991
  • 1
  • 2

额,貌似时间有点太短了,我们就多读几次好了,再来,这次是查100次

    static void Main(string[] args)
    {
        double sqlTime = 0;
        double viewTime = 0;
        for(int i=0;i<100;i++)
        {
            sqlTime+=SearchBySql();
            viewTime += SearchByView();
        }
        ("sqltime=" + ());
        ("viewtime=" + ());
        ();
    }

    static double SearchBySql()
    {
        SqlConnection cn = new SqlConnection();
         = "server=.;user=sa;pwd=1111;database=VS";
        ();
        SqlCommand cmd = new SqlCommand();
         = cn;
         = "select (id + name) as name from SqlOrView";
        DateTime dt1 = ;
        ();
        DateTime dt2 = ;
        TimeSpan ts = (dt1);
        return ;

    }
    static double SearchByView()
    {
        SqlConnection cn = new SqlConnection();
         = "server=.;user=sa;pwd=11111;database=VS";
        ();
        SqlCommand cmd = new SqlCommand();
         = cn;
         = "select * from MyView";
        DateTime dt1 = ;
        ();
        DateTime dt2 = ;
        TimeSpan ts = (dt1);
        return ;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

结果差不多爱。

sqltime=5945.0078
viewtime=5945.6799
  • 1
  • 2

结论

纯sql 和 视图 ,两种方式查询花费时间几乎一样的,而且从理论上讲纯sql会快一点点,因为视图查询时也是重新执行一遍视图创建时的sql语句。