1、关于count(*)与count(列)的传言
一般传言说公司不允许在项目中用到count(*),只能用count(列),或者说count(*)比count(列)慢,这样的说法都是错误的。
正常情况下,count(*)与count(列)是一样快的,但是通过创建索引的方式做比较,count(列)会更快一些。但是如果把这一列设为归空,count(*)与count(列)是一样快的。
结论:
count(*)是针对全表的,count(列)是针对某个列,例如,这张表的A列有600条记录,而有一 条是空值,count(A列)时应该是599.而count(*)是600。所以两个性能无法做对比。
count(常量) = count(*) ,例如:count(8) = count(*)
还有列的偏移量决定性能,列越靠后,访问的开销越大。由于count(*)的算法与列偏移量无关,所以count(*)最快,count(最后列)最慢。
2、SQL语句编写顺序,表的连接顺序和表的条件顺序
对于表的连接顺序,将哪张表作为基础表来连接说有快慢之分,还有where条件先写哪张表的条件记录多,那条语句响应地快?
结论:
原来表连接顺序的说法早就过时了,那是基于规则的时代,现在我们是基于代价的。
where条件也是一样的,没有先后之分。
3、IN与EXISTS之争
有人说在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历).使用NOT EXISTS子句可以有效的利用索引。
结论:
一般来说,anti的反连接算法比filter更高效,但是在将列标明非空时,才可以让not in 用anti算法。
实际上,IN与EXISTS 的性能是一样的。
4、全局临时表
退出该表记录就会自动清空
5、将一些需要的特定条件数据提取出来存在临时表中,再与其关联其他表时,临时表在前
6、count 和 sum 区别:
count:用来统计行数的
sum:用来求和的
例如:
小明 小红
语文 50 80
数学 60 70
英语 70 90
1:如果算小明学了多少门课,那就是select count(*) from mm; 算一下小明这列 共有多少行,结果是3行
2:如果算小明所有分数加在一起是多少,那就是 select sum(小明) from mm; 算小明这列加起来是多少,也就是50+60+70
7、存储过程中通过表与表之间的关联,只需获取一个字段或少几个字段时,可以通过声明多个变量来赋值,这样不需要多次存临时表,多次关联
例:declare @sumVisitTime varchar(10)
select @sumVisitTime = (case when RestTime/60=0 then '' else cast (RestTime/60 as varchar)+'h' end)+(case when RestTime%60=0 then '' else cast(RestTime%60 as varchar)+'m' end) from TABLE)
这样,@sumVisitTime这个值就可以直接拿来用了。
8、数据库与程序的独立性
最近项目经常有些改动,在提取数据,写存储过程时,一定要注意如果在原需求未新增字段的情况下,最好不要改动原存储过程的字段个数,字段顺序,以及字段名称。这样在存储过程数据改动之后,程序无需改动,这样才能做到项目中的最小改动,不会影响到接口数据的正常运行。
9、
未完待续。。。