奇怪问题!求解释

gw6328 2011-01-22 10:02:06
大家好。我有一个问题没有想通啊,求高手们解释

我有一个表 tb(siteid int ,adid int ,ip char(15))
索引是 nonclustered index on tb(siteid,adid,ip)

现在有一个这个操作
1.select siteid,adid,count(ip) from tb group by siteid,adid-- 计算一个网站放的那个广告的ip数量

2.select siteid,adid,count(siteid) from tb group by siteid,adid

3.select siteid,adid,count(1) from tb group by siteid,adid

以上三个语句生成的执行计划一样的。但是打开statistics io on time on 看到的时间是不一样的

多次测试发现 占用时间关系 3<1<2
计划一样为什么会出现这种情况呢?
...全文
174 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2011-01-23
  • 打赏
  • 举报
回复
这测试了元数次发现本来是毫秒级的,差别一点,应该就是没有差别
如果单独count(1),count(*) from tb 一个表的话,好像count(1)是要快一此的。
不想了通过这里应该不能优化多少 - -!
AcHerat 2011-01-22
  • 打赏
  • 举报
回复
count(1)是按group by ... 分组后来统计分组行的数目!所以快点。
count(ip)是在分组后按某个字段来索引,比count(1)慢点
count(siteId)这个有个问题是还要判断adid是否相同,在相同siteId下还要根据adid来分组统计,所以最慢。
gw6328 2011-01-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dawugui 的回复:]
3<1<2,正常,对的.

count(ip) IP是字符串型,所以较数值型慢,但比检索全部字段快.
count(siteid) siteid是数值型,所以快.
count(1) 检索全部字段
[/Quote]
dawugui兄,3<1<2和你说的不一样啊。你的意思是count(Ip)快于count(siteId)快于count(1)
但是我测试结果是count(1)快于count(ip)快于count(siteId)
gw6328 2011-01-22
  • 打赏
  • 举报
回复
百分比。内部我没有仔细看
gw6328 2011-01-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 maco_wang 的回复:]
三个语句生成的执行计划一样的?所有结果都一样?
[/Quote]
计划所有的结果都一样
dawugui 2011-01-22
  • 打赏
  • 举报
回复
3<1<2,正常,对的.

count(ip) IP是字符串型,所以较数值型慢,但比检索全部字段快.
count(siteid) siteid是数值型,所以快.
count(1) 检索全部字段
快溜 2011-01-22
  • 打赏
  • 举报
回复
学习,帮顶,#5楼的实验,貌似count(1)跟count(*)一样,至于为什么检索字符字段比数字字段快,还真不理解。
叶子 2011-01-22
  • 打赏
  • 举报
回复

DECLARE @table TABLE(id INT ,col VARCHAR(10))
INSERT INTO @table
SELECT 1,'a' UNION ALL
SELECT 2,NULL UNION ALL
SELECT 3,'b' UNION ALL
SELECT NULL,NULL

SELECT COUNT(*) FROM @table
/*4*/
SELECT COUNT(1) FROM @table
/*4*/
SELECT COUNT(id) FROM @table
/*3*/
SELECT COUNT(col) FROM @table
/*2*/
AcHerat 2011-01-22
  • 打赏
  • 举报
回复
我觉得count()里是不是也和索引有点关系什么的。
叶子 2011-01-22
  • 打赏
  • 举报
回复
三个语句生成的执行计划一样的?所有结果都一样?
DEATH64 2011-01-22
  • 打赏
  • 举报
回复
count()计算时,统计字段的个数,count(1)是最快的,因为位数少。
IP和SITEID,因为IP字段比SITEID短,所以快一点。一般统计都用COUNT(1)。
我理解好像COUNT(*)也应该比count(SITEID)快。
lxyzxq2008 2011-01-22
  • 打赏
  • 举报
回复
count(1)理论上是最快的,这个只是根据boolean值来返回,速度应该最快,其他和楼上说的差不多

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧