版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wf824284257/article/details/77413198
背景
工作快2个月了,日子过的真快啊。
时间真的有魔力,曾经觉得那么变态的sql语句,现在竟然觉得那么可爱(才怪)。 从刚开始的十几行的sql就觉得很长,到现在的100多行还感觉长的很正常很有道理,鬼知道我经历了什么。。。
废话不多说了,进入正题。
笔者在工作中,测试坏境下运行非常快的代码,到了正式坏境下慢了很多,原因是正式数据库数据量比较大的原因。又因为sql语句也很长了,所以考虑一下是否要用建立视图的方法来替换。今天呢就测试一下 对于同样的查询来说,使用sql语句和建立视图查询这两种方法哪一个效率高。
实验准备
我们就拿这样一个任务来测试:数据库表只有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条
接下来是真正的测试了:通过两种方式读取,并计算花费的时间:
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语句。