在当今信息时代,数据库优化也是非常重要的课题,虹信软件在此和大家分享一下数据库优化的经验。
一、IO优化
除硬盘硬件性能提升外,数据库也有两种方法来提升磁盘IO访问能力,他们实质都是创建多个数据文件:
一是在物理存储方面,创建数据文件的时候,可以创建多个数据文件;
二是在优化大表数据时,我们创建表分区,也需要创建多个数据文件组,
当然不同数据库我们实现的方法都不相同。
二、设计优化
我们在设计的时候一般都遵循3NF范式设计,通过我自己的一些经验来看,数据库设计我也需要根据合适的需求进行合理的设计,不能死搬硬套。
那么怎样才是合理的设计呢?
一是我们在做基础业务表设计的时候,最好是用范式设计;
二是在报表统计和数据挖掘的时候,我们的设计就刚好相反,用的反范式设计,使用更多的冗余数据。
三、索引优化
我们使用最多的都是B树索引,在SQLserver中,具体分成了聚集索引和非聚集索引,它们的区别在于:基础表的数据行不按非聚集键的顺序排序和存储;非聚集索引的叶层是由索引页而不是由数据页组成。一张表只能创建一个聚集索引。我们知道,索引在存储的时候,与表一样也是要占用存储空间的,这也是索引提高我们查询性能的原因。索引内部存储就是采用B+树原理。其实索引也是双刃剑,实质是以空间换时间,所以我们在使用的时候还需要根据具体业务具体分析,在这里就不多描述了。
我们怎么样才能创建有效的索引呢,虹信软件认为应从以下方面入手:
一般来说,以下这几种情况需要创建索引:
(1)在一张表中,外键需要创建索引;
(2)能确定的查询,where条件中的列,需要创建索引,可以根据实际情况看,是否创建复合索引,因为创建复合索引,效率更高;
(3)order by和group by 的列需要创建索引,其中在order by的列,最好是聚集索引,这样效率最高;
(4)在inner join、left join和right join关联的列,也需要创建索引。
另外,我们在创建索引时也需要注意几点:
(1)因为索引是单独的存储空间,所以那种频繁的insert、update、delete操作表,索引越少越好,用户在做这些操作的时候,数据库需要成本去维护我们的索引,让索引与表数据保持同步,在一个周期后,我们的索引空间就会产生很多的碎片,数据库查询性能就会下降,在这种情况下,就需要重建索引和组织索引;
(2)通过索引列的值筛选后,还需要在原表进行过半数据扫描时,这种情况下,不适合创建索引,是因为这样还没有全表扫描速度快,我们可以通过执行计划查看我们创建的索引是否有效;
(3)我们的SQL语句,Where子句时,“=” 左边一定是字段,不要用函数,否则我们创建的索引就用不上。 如:where Name=’张三’ 这种只要在Name列创建索引,就可以,where substring(Name)=’张三’这种你要在Name列创建了索引也没用;
(4)列值为Null的时候,我们索引对它是无效的;
(5)我们在写SQL语句需要注意:in和exists合理运用,where关系运算符越少越好,>= 、<=这种尽量用一种来表示。
在SQLserver中,我们可以通过下面的SQL语句来判断哪些需要创建索引:
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
,indexhad=d.index_handle
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
四、分区表优化
我们在处理大表数据的时候,需要把大表多过较小的表,查询就可以更快的运行,基本原理就是,因为要扫描的数据变的更小。通过将表物理放置在多个磁盘驱动器上来拆分表的情况下获取分区。如果将某个表放置在一个物理驱动器上,将相关表放置在另一个驱动器上,则可以提高查询性能,因为当运行涉及表间连接的查询时,多个磁盘头同时读取数据。可以使用SQL Server文件组来指定放置表的磁盘。
我们怎样才能创建高效的分区表呢?当我们创建了分区表,程序中,查询条件需要做出相应地的改变,这样才能让我们分区表发挥出高效(查询条件尽量控制查询数据结果在1个或2个分区中)。
当我们有很多批量的新增、修改和删除数据操作时,也不适合使用分区表,这是因为我们在创建分区表时,物理存储数据文件也是分开的,数据库就会增加更多的成本去维护数据一致性。
五、网络优化
在网络方面,除了网络硬件本身的优化外,我们数据库本身也需要进行一定优化,对数据库访问次数的优化,下面是虹信软件的一些经验体会:
(1)不要长时间连接数据库:我们开发人员很多容易犯的错误,数据库连接不关闭,不释放;
(2)减少连接次数:在一个连接中能一次性处理的业务,尽量一次性处理完成。如果进行多次连接,就会增加网络消耗;
(3)在一个事务中,一定不要在中间断掉连接,事务中业务不能与事务外进行关联处理,否则会造成死锁。
如有侵权请联系删除!
核心关注:拓步ERP系统平台是覆盖了众多的业务领域、行业应用,蕴涵了丰富的ERP管理思想,集成了ERP软件业务管理理念,功能涉及供应链、成本、制造、CRM、HR等众多业务领域的管理,全面涵盖了企业关注ERP管理系统的核心领域,是众多中小企业信息化建设首选的ERP管理软件信赖品牌。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/
本文标题:Web应用性能优化之浅见(二)
本文网址:http://www.toberp.com/html/consultation/10820519002.html