日期:2014-05-16  浏览次数:20510 次

数据库优化整理

非原创-------------------



速度,影响它的因数太多了,且数据量越大越明显。
1、存储
? ? ? 将硬盘分成NTFS格式,NTFS比FAT32快,并看你的数据文件大小,1G以上你可以采用多数据库文件,这样可以将存取负载分散到多个物理硬盘或磁盘阵列上。

2、tempdb
? ? ? tempdb也应该被单独的物理硬盘或磁盘阵列上,建议放在RAID ? 0上,这样它的性能最高,不要对它设置最大值让它自动增长

3、日志文件
? ? ? 日志文件也应该和数据文件分开在不同的理硬盘或磁盘阵列上,这样也可以提高硬盘I/O性能。

4、分区视图
? ? ? 就是将你的数据水平分割在集群服务器上,它适合大规模OLTP,SQL群集上,如果你数据库不是访问特别大不建议使用。

5、簇索引
? ? ? 你的表一定有个簇索引,在使用簇索引查询的时候,区块查询是最快的,如用between,应为他是物理连续的,你应该尽量减少对它的updaet,应为这可以使它物理不连续。

6、非簇索引
? ? ? 非簇索引与物理顺序无关,设计它时必须有高度的可选择性,可以提高查询速度,但对表update的时候这些非簇索引会影响速度,且占用空间大,如果你愿意用空间和修改时间换取速度可以考虑。

7、索引视图
? ? ? 如果在视图上建立索引,那视图的结果集就会被存储起来,对与特定的查询性能可以提高很多,但同样对update语句时它也会严重减低性能,一般用在数据相对稳定的数据仓库中。

8、维护索引
? ? ? 你在将索引建好后,定期维护是很重要的,用dbcc ? showcontig来观察页密度、扫描密度等等,及时用dbcc ? indexdefrag来整理表或视图的索引,在必要的时候用dbcc ? dbreindex来重建索引可以受到良好的效果。

不论你是用几个表1、2、3点都可以提高一定的性能,5、6、8点你是必须做的,至于4、7点看你的需求。










如何优化数据库的性能
? ? ?
1、 硬件调整性能
最有可能影响性能的是磁盘和网络吞吐量,解决办法
扩大虚拟内存,并保证有足够可以扩充的空间;把数据库服务器上的不必要服务关闭掉
把数据库服务器和主域服务器分开
把SQL数据库服务器的吞吐量调为最大
在具有一个以上处理器的机器上运行SQL
2、 调整数据库
若对该表的查询频率比较高,则建立索引;建立索引时,想尽对该表的所有查询搜索操作, 按照where选择条件建立索引,尽量为整型键建立为有且只有一个簇集索引,数据在物理上按顺序在数据页上,缩短查找范围,为在查询经常使用的全部列建立 非簇集索引,能最大地覆盖查询;但是索引不可太多,执行UPDATE ? DELETE ? INSERT语句需要用于维护这些索引的开销量急剧增加;避免在索引中有太多的索引键;避免使用大型数据类型的列为索引;保证每个索引键值有少数行。
3、 使用存储过程
应用程序的实现过程中,能够采用存储过程实现的对数据库的操作尽量通过存储过程来实现,因为存储过程是存放在数据库服务器上的一次性被设计、编码、测试, 并被再次使用,需要执行该任务的应用可以简单地执行存储过程,并且只返回结果集或者数值,这样不仅可以使程序模块化,同时提高响应速度,减少网络流量,并 且通过输入参数接受输入,使得在应用中完成逻辑的一致性实现。
4、 应用程序结构和算法
? ? ? ? 建立查询条件索引仅仅是提高速度的前提条件,响应速度的提高还依赖于对索引的使用。因为人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否 正确,特别是对数据量不是特别大的数据库操作时,是否建立索引和使用索引的好坏对程序的响应速度并不大,因此程序员在书写程序时就忽略了不同的实现方法之 间可能存在的性能差异,这种性能差异在数据量特别大时或者大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明 显。在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有 了明显地提高!







在书写应用程序的SQL的 ? where子句时,注意以下几种情况: ?
1、避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: ?
SELECT ? name ? FROM ? employee ? WHERE ? salary ? > ? 60000 ?
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。 ?
2、避免对搜索参数使用其它数学操作符,如要将 ?
SELECT ? name ? FROM ? employee ? WHERE ? SUBSTRING(id, ? 1, ? 1) ? = ? 'B ' ?
SELECT ? name ? FROM ? emplyee ? WHERE ? salary ? * ? 12 ? > ? 30000 ?
写成为: ?
SELECT ? name ? FROM ? employee ? WHERE ? id ? like ? 'B% ' ?
SELECT ? name ? FROM ? emplyee ? WHERE ? salary ? > ? 3000 ?
3、、避免使用!=或<>等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如: ?
SELECT ? id ? FROM ? employeeWHERE ? id ? != ? 'B% ' ?
优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。 ?
4、在应用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够 分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询