sql优化——count查询

场景:

曾经听别人说过查询数据量COUNT(*)比COUNT(字段),查询结果要慢,理由是COUNT(字段)运用了索引,才会查询快。这个是谬论。

	**create index idx_object_id on t(object_id); 添加一个索引,真的是用COUNT(列)比COUNT(*)要快啊,因为COUNT(*)不能用到索引,而COUNT(列)可以,真相真是如此吗?
	alter table T modify object_id  not  null; 字段不为空,然后两者查询的效率一样快,那么这两个能比较吗?是不能比较的,count(*)和count(字段)比较,就相当于颜真卿的楷书和王羲之的行书比较,行书和楷书是没有可比较性的,count(*)和count(字段)是不能做比较的。性能比较首先要考虑写法等价,这两个语句根本就不等价!!!**

在这里插入图片描述

在这里插入图片描述

注:count(1),括号里面写数字和写count(*)效果是一样的,没什么区别;

结论:原来优化器里的算法是这么玩的,列的偏移量决定性能,列越靠后,访问的开销越大。由于count()的算法与列偏移量无关,所以count() 最快,count( 最后列) 最慢。

启发:我们在建表的时候,将经常访问的列放在前面,不经常访问的列放在后面。大数据查询时,性能就提高了很多呢。

二:oracle 表查询;
以前的oracle表查询是基于规则的,连表查询小表在后,打标在前,这样查询性能能大大提高;
select count() from tab_big,tab_small ;
select count(
) from tab_small,tab_big ;

—奇怪,以上实验发现性能是一样的,咋回事呢,看来真是谣言啊,这真是恶意传谣吗?

—NONONO,其实任何谣言,都是有一定的影子的。大家看看俺下面的语句,比较一下性能。
select /+rule/ count() from tab_big,tab_small ;
select /
+rule*/ count(*) from tab_small,tab_big ;

–看明白了,显然上一条性能好于下一条,谣言也不是真的无中生有!

结论:原来表连接顺序的说法早就过时了,那是基于规则的时代,现在我们是基于代价的。同样的,表条件书写顺序查询的时代也已经终结,已经过时了。

猜你喜欢

转载自blog.csdn.net/weixin_43375485/article/details/88109326
今日推荐