查询速度慢的原因很多, 常见如下几种:
可以通过如下方法来优化查询 :
把数据, 日志, 索引放到不同的 I/O 设备上, 增加读取速度, 以前可以将 Tempdb 应放在 RAID0 上, SQL2000 不在支持。数据量(尺寸)越大, 提高 I/O 越重要。
纵向, 横向分割表, 减少表的尺寸 (sp_spaceuse)
升级硬件
根据查询条件, 建立索引, 优化索引, 优化访问方式, 限制结果集的数据量。注意填充因子要适当(最好是使用默认值 0). 索引应该尽量小, 使用字节数小的列建索引好(参照索引的创建), 不要对有限的几个值的字段建单一索引如性别字段
提高网速;
扩大服务器的内存, Windows 2000 和 SQL server 2000 能支持 4-8G 的内存。配置虚拟内存: 虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时, 可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能, 并打算运行 Microsoft 搜索服务以便执行全文索引和查询, 可考虑: 将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半).
增加服务器 CPU 个数; 但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是 MsSQL 自动评估选择的。单个任务分解成多个任务, 就可以在处理器上运行。例如耽搁查询的排序, 连接, 扫描和 GROUP BY 字句同时执行, SQL SERVER 根据系统的负载情况决定最优的并行等级, 复杂的需要消耗大量的 CPU 的查询最适合并行处理。但是更新操作 Update,Insert, Delete 还不能并行处理。
如果是使用 like 进行查询的话, 简单的使用 index 是不行的, 但是全文索引, 耗空间。like ‘a%’ 使用索引 like ‘%a’ 不使用索引用 like ‘%a%’ 查询时, 查询耗时和字段值总长度成正比, 所以不能用 CHAR 类型, 而是 VARCHAR. 对于字段的值很长的建全文索引。
DB Server 和 APPLication Server 分离; OLTP 和 OLAP 分离
分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器, 但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器, 以支持大型的多层 Web 站点的处理需要。有关更多信息, 参见设计联合数据库服务器。(参照 SQL 帮助文件’分区视图’)
重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG, 收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志。对于大的数据库不要设置数据库自动增长, 它会降低服务器的性能。在 T-sql 的写法上有很大的讲究, 下面列出常见的要点: 首先, DBMS 处理查询计划的过程是这样的:
Commit 和 rollback 的区别 Rollback: 回滚所有的事物。Commit: 提交当前的事物。没有必要在动态 SQL 里写事物, 如果要写请写在外面如: begin tran exec(@s) commit trans 或者将动态 SQL 写成函数或者存储过程。
在查询 Select 语句中用 Where 字句限制返回的行数, 避免表扫描, 如果返回不必要的数据, 浪费了服务器的 I/O 资源,