兰色精灵 发表于 2015-1-16 14:07:10

关于sql中count写法的切磋

这里我们讨论用binlog来实现闪回的方案。我们在查询表中数据的数目时,有人喜好用count(*),有人用count(1),另有些伴侣会用count(主键),但这几种用法那种会更优一些呢?上面在csdn下面看到的一篇文章,摘抄以下:

关于COUNT的写法,大抵有以下几种:
COUNT(*)
COUNT(1)
COUNT(主键)
COUNT(列名)

我仍是写个小例子:
USETEMPDB
GO
IFOBJECT_ID(TB)ISNOTNULLDROPTABLETB
GO
CREATETABLETB(COL1INT,COL2INT,COL3INT,COL4INT)
GO
CREATECLUSTEREDINDEXINX_TB_COL1_COL2ONTB(COL1,COL2)
GO
CREATEINDEXINX_TB_COL3ONTB(COL3)
GO
INSERTINTOTB
SELECTT1.number,T2.number,CASEWHENT1.number%3=0THENNULLELSET1.numberEND,T1.NUMBER+T2.number
FROMMASTER..spt_valuesT1
INNERJOINMASTER..spt_valuesT2ONT1.number=T2.number-1
GO
SELECTCOUNT(*)
FROMTB

SELECTCOUNT(1)
FROMTB

SELECTCOUNT(COL1)
FROMTB

SELECTCOUNT(COL2)
FROMTB

SELECTCOUNT(COL3)
FROMTB

SELECTCOUNT(COL4)
FROMTB

SELECTCOUNT(DISTINCTCOL3)
FROMTB

SELECTCOUNT(1),
COUNT(COL3),
COUNT(DISTINCTCOL3),
COUNT(COL4),
COUNT(DISTINCTCOL4)
FROMTB

本人逐一运转SELECT看实行企图,你会发明前五个的实行企图看起来是一样的,都是走INX_TB_COL3,这是由于体系判别COL3的索引巨细小于COL1+COL2的会萃索引,并且COL3中包括了前五个语句所必要的一切列。

但看到第一步的INDEX_SCAN中,会发明COUNT(*)和COUNT(1)是没有输入工具的,即假输入,只输入前往行数,不输入详细的列。而COUNT(COL1),COUNT(COL2),COUNT(COL3)都有一个OutPutLIST,分离是这三列。这是由于体系要算这三列中有几非NULL的值,而COUNT(*)和COUNT(1)都是有一行算一行,不论是不是NULL。

COUNT(COL4)走的是INX_TB_COL1_COL2,也就是会萃索引扫描了,由于COL3中只包括键列COL1、COL2和值列COL3,以是COUNT(COL4)没法走COL3,只能走会萃索引扫描,也就是全表扫描。

前面的COUNT(DISTINCTCOL3)是为了让你们对照企图的,所谓DISTINCT,就是在输入了COL3再GROUPBY一下再盘算行数。

最初一句是演示COUNT用法,无别的意义。


结论:
COUNT(1)和COUNT(*)是一样的,你能够在内里写任何常量,如COUNT(CSDNDSB),不会输入一列常量,不会往体系内外找一切列名。

COUNT(1)和COUNT(列名)意义分歧,不克不及放在一同对照。独一可对照的情形是列名是单主键表的主键列,即会萃非空单键值索引,这类情形下除非想要强迫走会萃索引扫描,不然COUNT(1)优于COUNT(列名),由于前者同意企图选择最估索引,并且没有列输入。限制,如果WHERE子句的查询条件里有不等号(WHEREcoloum!=),MySQL将无法使用索引。类似地,如果WHERE子句的查询条件里使用了函数(WHEREDAY(column)=),MySQL也将无法使用索引。

若天明 发表于 2015-1-18 11:58:14

如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。

再现理想 发表于 2015-1-26 13:13:34

其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!

只想知道 发表于 2015-2-4 20:05:33

至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。

柔情似水 发表于 2015-2-10 06:23:46

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

小女巫 发表于 2015-3-1 01:48:20

连做梦都在想页面结构是怎么样的,绝非虚言

蒙在股里 发表于 2015-3-17 07:10:06

现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.

若相依 发表于 2015-3-24 02:10:02

语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
页: [1]
查看完整版本: 关于sql中count写法的切磋