SQLServer性能优化评审(一个很好的总结,不要错过它)1页3

SQLServer性能优化评审(一个很好的总结,不要错过它)1页3
首先,分析阶段
一般来说,在系统分析阶段往往关注了太多的领域,系统的功能、可用性、可靠性和安全性的需求往往吸引了我们大部分的注意力,但我们也必须注意到性能的非功能性需求是非常重要的,必须根据系统的特点来确定这一要求,响应时间要求、硬件配置等。最好是有各种需求的量化指标。
另一方面,在分析阶段,我们应该区分系统的类型根据不同的需求领域,并区别于大企业,这是OLTP(联机事务处理系统)和OLAP(联机分析处理系统)。
二、设计阶段
设计阶段可以看作是系统性能的关键阶段。在这个阶段,几乎所有的性能调优都要经过一个过程——数据库设计。
数据库设计完成后,可以进行初步的指标设计。良好的索引设计可以指导编码阶段编写高效的代码,为整个系统的性能打下良好的基础。
以下是性能需求设计阶段的要求:
1,
数据库逻辑设计的规范化
数据库逻辑设计的标准化就是我们通常所说的范式,我们可以简单地理解范式:
第一个规范:没有重复组或多值列,这是数据库设计的最低要求。
第二个规范:每个非键字段必须依赖主密钥,不能依赖组合主键的某些组件。消除部分依赖性,在大多数情况下,数据库设计应达到第二范式。
第三规范:一个非关键字段不能依赖于另一个非关键字段。消除传输依赖性,达到第三范式应该是系统中大多数表的需求,除非使用一些特殊表。
这里不再引入更高的范式需求。就个人而言,如果我们都达到了第二种范式,大多数都达到了第三范式。系统将生成更少的列和更多的表,从而减少数据冗余和提高性能。
2,
合理的冗余
按照标准化设计来设计一个系统几乎是不可能的。除非系统很小,在标准化设计之后就有必要计划冗余。
冗余可以是冗余的数据库、冗余的表或冗余的字段,不同粒度的冗余可以起到不同的作用
为了提高编程的方便性,可以增加冗余,提高性能,从性能的角度来看,冗余数据库可以分散数据库压力。冗余表可以分散大数据表的并发压力,或者加快特殊查询速度。冗余字段可以有效地减少数据库表的连接提高效率
三,
主密钥的设计
主键是必需的。SQLServer的主键也是惟一的索引。在实际应用中,我们通常选择最小的键组合作为主键,因此主键通常适合于表的聚集索引,聚集索引对查询的影响较大,如下面的索引所描述。
主键在多键表中的选择也更为重要。一般来说,键越小,键越小,而较小的键可以使主键的B结构变小。
主键的选择也要注意主键组合的字段顺序。对于组合主键,不同字段顺序主键的性能差异可能很大。一般来说,应该选择低重复率和单一或组合查询的字段。
4,
外键设计
外键被用作数据库对象,许多人认为它们遇到了麻烦。实际上,外键在大多数情况下是最有用的,原因是:
外键是最有效的一致性维护方法。数据库的一致性要求可用于外键、检查约束、规则约束、触发器和客户端程序。一般认为,数据越接近,数据库的效率就越高。
谨慎使用级联删除、级联更新,级联删除、级联更新SQL Server 2000在今年的新功能,并一直保持在2005,这应该是可用的。我这里说的是谨慎的,因为级联级联删除更新一些突破传统的外键的定义,功能太强大了点,需要确保他们有一个很好的把握它的功能范围,或使用前,级联级联删除更新可能会使您的数据被修改或丢失的精彩。在性能方面,级联删除、级联更新是比其他方法更有效。
5,
场地设计
字段是数据库最基本的单元,它的设计对性能有很大的影响:
a、数据类型和数字类型一样,数字类型比较要快于字符类型。
B,
数据的大小尽可能小,这里的最小值是为了满足可预见的未来需求。
C,
尽量不允许null,但除非有必要,否则要替换为null +默认值。
d,文本和图像使用较少,二进制字段读写较慢,阅读方法不多,在大多数情况下最好使用。
E,
应谨慎使用自增字段,不利于数据迁移。
6,
数据库物理存储与环境设计
在设计阶段,我们可以设计数据库的物理存储、操作系统环境和网络环境,使我们的系统能够适应未来更大、更大的数据量。
我们需要注意文件组的作用,文件组的应用能有效地将I/O操作分散到不同的物理硬盘上,提高并发性。
7,
系统的设计
整个系统的设计,特别是系统结构的设计,对性能有很大的影响。对于一般的OLTP系统,C/S结构、三层C/S结构可选择。不同系统结构性能的关键也不同。
在系统设计阶段,一些业务逻辑应该总结在数据库编程和数据库编程的实现,包括数据库存储过程、触发器和功能。使用数据库编程来实现业务逻辑的好处是可以减少网络流量和更充分的利用预编译和缓存功能的数据库。
8,
设计指标
在设计阶段,可以根据功能和性能的要求进行初步的指标设计。我们需要根据预测的数据量和查询来设计索引,这可能与将来的实际使用不同。
应改变指标的选择。
一个,
根据数据量决定哪些表需要增加索引,少量的数据只能是主键。
B,
根据使用频率,需要索引哪些字段,选择经常用作连接条件、筛选条件、聚合查询和排序字段作为索引候选的字段。
C,
经常出现在一起的字段组合成一个复合索引。组合索引的字段顺序与主键相同。还必须将最常用的字段放在前面,并将低重复字段放在前面。
D,
不要为表添加太多索引,因为索引会影响插入和更新的速度。
三、编码阶段
编码阶段是本文的重点,因为在设计的情况下,整个系统的质量几乎取决于编码的质量。
第一阶段的编码是所有程序员所需性能的意识,在数据库的功能和性能的实现考虑,可以设置操作的工具,我们应该使用这个工具,实际的操作是批量设置操作,是减少大量的客户数据的周期运行,而不是使用SQL语句或存储过程,这是很难理解的观念和意识,需要在编程实现过程。
下面是你在编程阶段需要注意的一个列表:
1,
只返回所需的数据
返回到客户端的数据至少有数据库数据提取、数据传输网络、客户端接收数据和数据处理等环节,如果不需要返回数据,就会增加无效的服务器、网络和客户端,其危害显而易见,避免此类事件需要注意:
在水平方向上,不要写SELECT语句,而是选择需要的字段。
B,
在纵向上,以合理的方式写出WHERE子句,不要在没有位置的情况下编写SQL语句。
C,
选择后注意WHERE子句,因为选择将数据插入临时表中。这个过程锁定一些系统表。如果WHERE子句返回太多数据或太慢,它将导致系统表长时间锁定并插入其他进程
d,对于聚合查询,可以用带子句进一步限定返回的行。
2,
尽量少工作
这与前一个相同,就是最小化无效的工作,但是重点放在客户端程序上。
一个,
许多程序员很少注意控制同一语句的多执行,特别是一些基本数据的多次执行。
B,
减少多个数据转换可能需要数据转换成为设计问题,但减少的次数是程序员所能做的。
C,
消除不必要的子查询和连接查询表,一般解释执行计划的外部连接,和额外的连接表带来的额外开销。
D,
相同条件下同一表上的多个更新的组合,例如
将所有员工的名= 'haiwer'where emp_id =vpa30890f
更新员工设定模型= 'yang'where emp_id =vpa30890f
这两个语句应合并为以下语句
将所有员工的名= 'haiwer,模型=杨'
在emp_id = 'vpa30890f
E,
更新操作不会分解成+插入删除操作的形式,尽管函数是相同的,但性能差异非常大。
F,
不要写一些毫无意义的查询,例如
从1 = 2的雇员中选择*
三,
注意事务和锁
事务是数据库应用的重要工具。它有四个特性:原子性,一致性,隔离和持久性。在许多操作中,我们需要使用事务来确保数据的正确性。在使用事务时,我们需要尽可能避免死锁,尽量减少阻塞:
A,交易过程应该尽可能小,拆卸的交易应该分开。
B,
事务处理不应该是交互式的,因为当交互等待时,事务没有完成,许多资源可能被锁定。
C,
事务处理需要以相同的顺序访问。
d,提高事务中每个语句的效率,通过索引和其他方法提高每个语句的效率,可以有效地减少整个事务的执行时间。
E,
不要指定锁和指标的类型,SQL Server允许我们指定自己的锁类型和索引表,但总的来说,SQL的锁类型和索引服务器的优化是当前选择的数据和查询的条件是最优的,我们指定在当前情况下可能更多,但数据和在未来的数据分布的量会改变。
F,
查询时可以使用较低的隔离级别,特别是在报表查询可用时,可以选择最低隔离级别(未提交的读取)。
4,
注意临时表和表变量的使用
在复杂系统中,临时表和表变量难以避免。应注意临时表和表变量的使用。
如果语句非常复杂,连接太多,可以考虑临时表和表变量一步一步地完成。
B,
如果需要多次使用大型表的数据的相同部分,可以考虑临时用临时表和表变量存储这部分数据。
C,
如果需要从多个表中集成数据以形成结果,可以考虑使用临时表和表变量逐步增加这些表的数据。
在D中,在其他情况下,应控制临时表和表变量的使用。
E,
在临时表和表变量上,很多人说表变量在内存中,速度应该是首选的表单变量,但在实际使用中,主要考虑需要在临时表中放在数据量大的情况下数据,临时表速度反而更快。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部