关于select count(*) from table的讨论

简介: 摘自:http://www.itpub.net/381892,2.html 下面是我测试的结果: scott@ORCL> set autotrace traceonly scott@ORCL> CREATE INDEX I_DEPT_NAME ON DEPT (DNAME) ; Index created.

摘自:http://www.itpub.net/381892,2.html

下面是我测试的结果:
scott@ORCL> set autotrace traceonly
scott@ORCL> CREATE INDEX I_DEPT_NAME ON DEPT (DNAME) ;
Index created.
scott@ORCL> analyze table dept compute statistics ;
Table analyzed.
scott@ORCL> select /*+ index(i_dept_name) */ count(*) from dept ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FULL SCAN) OF 'PK_DEPT' (UNIQUE) (Cost=1 Card=5)


看见dname可以为null的时候,不会使用这个索引。

scott@ORCL> ALTER TABLE DEPT MODIFY (DNAME NOT NULL)
Table altered.
scott@ORCL> analyze table dept compute statistics ;
Table analyzed.

scott@ORCL> select /*+ index(i_dept_name) */ count(*) from dept ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FULL SCAN) OF 'I_DEPT_NAME' (NON-UNIQUE) (Cost=1 Card=5)

看见没有这回使用了索引i_dept_name,dname 不为空的时候。

现在增加一个字段foo,char(1),default ='1'

scott@ORCL> ALTER TABLE DEPT ADD foo CHAR(1) DEFAULT 1 NOT NULL ;
Table altered.
scott@ORCL> CREATE INDEX I_DEPT_foo ON DEPT (foo);
Index created.
scott@ORCL> analyze table dept compute statistics ;
Table analyzed.
scott@ORCL> select count(*) from dept ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FULL SCAN) OF 'I_DEPT_FOO' (NON-UNIQUE) (Cost=1 Card=5)

你再仔细看看,没有使用hints,索引选择了I_DEPT_FOO,而没有选择pk_dept.
删除统计,走rbo。
scott@ORCL> Analyze Table SCOTT.DEPT Delete Statistics
Table analyzed.
scott@ORCL> select count(*) from dept ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'DEPT'

没有使用索引。 现在加hints。

scott@ORCL> select /*+ index(i_dept_foo) */ count(*) from dept ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=82)

还是没有使用索引。



目录
相关文章
|
24天前
|
数据库
count(1)、count(*)、count(column)的含义、区别、执行效率
总之,`count(1)` 和 `count(*)` 通常会更常用,因为它们的执行效率较高,不涉及对具体列值的处理。而 `count(column)` 适用于统计特定列中的非空值数量。在实际使用时,可以根据情况选择适合的方式。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
15 0
|
7月前
|
数据库 OceanBase
使用 `INSERT INTO table_name SELECT * FROM table_name` 这种方式
使用 `INSERT INTO table_name SELECT * FROM table_name` 这种方式
45 1
|
SQL 索引
count(1) and count(column)那个更优?
count(1) and count(column)那个更优?
66 0
|
存储 SQL 架构师
性能大PK count(*)、count(1)和count(列)
最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,聊到了以下内容: 数据统计你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,赶紧改用 count(1),这样比较快...... 有点儿好奇,难道 count(1) 的性能真的就比 count(*) 要好吗? 印象中网上有很多的文章都有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。
性能大PK count(*)、count(1)和count(列)
|
SQL 关系型数据库 MySQL
MYSQL创建100万条数据与count(1)、count(*)、count(column)区别
MYSQL创建100万条数据与count(1)、count(*)、count(column)区别.md
|
存储 关系型数据库 MySQL
一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别
一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别
245 0
一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别
|
关系型数据库 MySQL 数据库
数据库面试题【十九、count(字段) &count(主键 id) &count(1)&count(*)的区别】
数据库面试题【十九、count(字段) &count(主键 id) &count(1)&count(*)的区别】
148 0
|
关系型数据库 MySQL 测试技术
论证select count(*)和select count(1)
论证select count(*)和select count(1)
110 0
|
程序员 数据库 索引

相关实验场景

更多