网站首页 > 技术文章 正文
晚上一个在企业做IT的朋友打电话来说,他们使用的一个软件这几天突然查询很慢,让我帮忙分析一下并看一下有没有什么解决方案,具体情况是这样:数据库用的是sqlserver2008,查询的数据表也不是很多,只有几十万条,以前都很快的,这几天查询一下出结果要一分多钟。
我让他查看一下查询慢时是否被锁定了,他说没有,我再问他是否做过索引,他说做过索引,我猜测应该是是时间长了存储碎片引起的索引性能下降,于是我让他把索引删除,然后重新创建一下再看一下效果。他按照我说的操作后,果然查询速度很快了,于是我给他解释了一下原因:
- 在 B 树(行存储)索引中,当索引包含的页中,索引中的逻辑排序(基于索引中的键值)与索引页的物理排序不匹配时,就存在碎片。
- 备注
- SQL Server 文档在提到索引时一般使用 B 树这个术语。 在行存储索引中,SQL Server 实现了 B+ 树。有关详细信息可以查看 SQL Server 索引体系结构和设计指南。
- 每当对基础数据执行插入、更新或删除操作时,数据库引擎都会自动修改索引。 例如,在表中添加行可能会导致拆分行存储索引中的现有页,以腾出空间来插入新行。 随着时间的推移,这些修改可能会导致索引中的数据分散在数据库中(含有碎片)。
- 对于使用完全或范围索引扫描读取多个页面的查询,碎片多的索引会降低查询性能,因为读取查询所需的数据可能需要额外的 I/O。 查询可能需要大量的小型 I/O 请求来读取相同数量的数据,而不是使用少量的大型 I/O 请求。
- 存储子系统的顺序 I/O 性能优于随机 I/O 性能时,索引碎片可能会降低性能,因为读取碎片索引需要更多的随机 I/O。
我这个朋友不是计算机专业毕业,以前在网吧做网管,后来到企业做IT,数据库的查询语句用得蛮熟,但是对数据库原理不熟悉,我建议他工作之余要结合自己用的数据库去学习一下数据库原理,这样对自己会又大的提升,只有对底层原理熟悉了遇见问题、分析问题和解决问题才会有清晰的思路和得心应手,并且建议他结合工作可以去学习通信原理(研究tcp/ip协议)、数据库原理、学习数据结构、学习操作系统原理,坚持下来对他以后工作会有很大的帮组。
猜你喜欢
- 2025-06-05 当 SQL Server(mssql-jdbc) 遇上 BigDecimal → 精度丢失,真坑!
- 2025-06-05 mssqlserver中数据库变为可疑
- 2025-06-05 在 Ubuntu 的 24.04 或 22.04 上安装 Microsoft SQL Server (MSSQL)
- 最近发表
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- think in java (14)
- javascript权威指南 (19)
- nfs (25)
- componentart (17)
- yii框架 (14)
- springbatch (28)
- oracle数据库备份 (25)
- iptables (21)
- 自动化单元测试 (18)
- python编写软件 (14)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- dfn (14)
- http error 503 (21)
- pop3服务器 (18)
- 图表组件 (17)
- android退出应用 (21)