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