建了索引之后count查询速度怎么还是>1秒?

subendong 2013-02-25 01:25:13
主表[Resource]300W条数据,JOIN表[Company]10W条数据。
SELECT COUNT(*) FROM Resource AS a JOIN Company AS b ON a.CompanyID=b.Id

CompanyID和Id 都是36长度的varchar类型的数据,可以理解为GUID。
我对CompanyID和Id都建了索引,为什么统计还要3秒?
...全文
256 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
subendong 2013-02-25
  • 打赏
  • 举报
回复
好,知道。多谢!
發糞塗牆 2013-02-25
  • 打赏
  • 举报
回复
引用 8 楼 subendong 的回复:
引用 3 楼 szm341 的回复: 你之前的a.CompanyID=b.Id这两个字段索引建立了有多久了? 刚新建的表,数据重新导入。
刚导入的数据需要更新统计信息,不然不准确。
szm341 2013-02-25
  • 打赏
  • 举报
回复
就像版主说的,如果是定长字段类型用char类型 我觉得你可能是由于修改了字段类型,该字段上的索引重建了 索引重建会重新排列数据,一定程度上会提高效率
subendong 2013-02-25
  • 打赏
  • 举报
回复
引用 3 楼 szm341 的回复:
你之前的a.CompanyID=b.Id这两个字段索引建立了有多久了?
刚新建的表,数据重新导入。
發糞塗牆 2013-02-25
  • 打赏
  • 举报
回复
改了之后最好重建一下索引并更新统计信息
subendong 2013-02-25
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
int几乎就比varchar的处理速度快,而且可变类型的字符串由于长短可能不一,导致索引页存放的数据就少,进而导致索引的层次多了很多,你扫描或者查找索引数据的时候范围也就大了很多,表现到查询的时候就慢了。一般除非必要,都不建议使用字符型特别是可变的类型作为索引键。
我只修改了Resource表的CompanyID字段,结果快了1秒,现在只需要2秒的查询时间了。Company表因为有依赖关系,暂时修改不了了。
subendong 2013-02-25
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
int几乎就比varchar的处理速度快,而且可变类型的字符串由于长短可能不一,导致索引页存放的数据就少,进而导致索引的层次多了很多,你扫描或者查找索引数据的时候范围也就大了很多,表现到查询的时候就慢了。一般除非必要,都不建议使用字符型特别是可变的类型作为索引键。
好,我就先改成char类型的,试试。
發糞塗牆 2013-02-25
  • 打赏
  • 举报
回复
int几乎就比varchar的处理速度快,而且可变类型的字符串由于长短可能不一,导致索引页存放的数据就少,进而导致索引的层次多了很多,你扫描或者查找索引数据的时候范围也就大了很多,表现到查询的时候就慢了。一般除非必要,都不建议使用字符型特别是可变的类型作为索引键。
szm341 2013-02-25
  • 打赏
  • 举报
回复
你之前的a.CompanyID=b.Id这两个字段索引建立了有多久了?
subendong 2013-02-25
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
1、你建索引不一定合理。 2、如果固定为36位,那直接用char(36)更好,而且最好把字段填满。 3、改成count(1),不一定有帮助,但是最起码不用判断*号带来的一些开销。
你好,我在这两个表里面分别加了CompanyIDOld和IdOld,他们原先都是int类型的数据(新来的领导后来让改成varchar(36)的),结果发现速度<1秒了。难道是因为int和varchar的原因?
發糞塗牆 2013-02-25
  • 打赏
  • 举报
回复
1、你建索引不一定合理。 2、如果固定为36位,那直接用char(36)更好,而且最好把字段填满。 3、改成count(1),不一定有帮助,但是最起码不用判断*号带来的一些开销。

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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