您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页SQL数据库中误区及优化

SQL数据库中误区及优化

来源:二三娱乐

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、

未完待续。。。

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

热门图文

Copyright © 2019-2025 yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务