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

背景

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

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

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

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

实验准备

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

开始了。

建立一个新表

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

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

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

插入20w条数据

        SqlConnection cn = new SqlConnection();
        cn.ConnectionString = "server=.;user=sa;pwd=yourpwd;database=VS";
        cn.Open();
        SqlCommand cmd = new SqlCommand();
        for(int i=0;i<200000;i++)
        {
            cmd.Connection = cn;
            cmd.CommandText = "insert into SqlOrView values ('"+i.ToString()+"','"+i.ToString()+"')";
            cmd.ExecuteNonQuery();
        }
        Console.WriteLine("insert 20w data  end...");
        Console.Read();

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

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

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

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

    static void SearchBySql()
    {
        SqlConnection cn = new SqlConnection();
        cn.ConnectionString = "server=.;user=sa;pwd=yourpwd;database=VS";
        cn.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandText = "select (id + name) as name from SqlOrView";
        DateTime dt1 = DateTime.Now;
        cmd.ExecuteNonQuery();
        DateTime dt2 = DateTime.Now;
        TimeSpan ts = dt2.Subtract(dt1);
        Console.WriteLine( "by sql :" + ts.ToString());

    }
    static void SearchByView()
    {
        SqlConnection cn = new SqlConnection();
        cn.ConnectionString = "server=.;user=sa;pwd=yourpwd;database=VS";
        cn.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandText = "select * from MyView";
        DateTime dt1 = DateTime.Now;
        cmd.ExecuteNonQuery();
        DateTime dt2 = DateTime.Now;
        TimeSpan ts = dt2.Subtract(dt1);
        Console.WriteLine("by view :"+ts.ToString());
        Console.Read();
    }

第一次:

by sql :00:00:00.0670497
by view :00:00:00.0569991

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

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

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

    }
    static double SearchByView()
    {
        SqlConnection cn = new SqlConnection();
        cn.ConnectionString = "server=.;user=sa;pwd=11111;database=VS";
        cn.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandText = "select * from MyView";
        DateTime dt1 = DateTime.Now;
        cmd.ExecuteNonQuery();
        DateTime dt2 = DateTime.Now;
        TimeSpan ts = dt2.Subtract(dt1);
        return ts.TotalMilliseconds;
    }

结果差不多爱。

sqltime=5945.0078
viewtime=5945.6799

结论

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页