分享

SQL优化的几个方面

 天行健861010 2012-11-06
sql数据库优化非常重要,如果sql数据库优化的不好,不仅会增加客户端和服务器端程序的编程和维护的难度,而且还会影响系统实际运行的性能。
那我们可以从哪些方面来进行sql数据库优化呢?
一:就是合理的数据库的设计。
当前我们使用最多的就是关系型数据库,关系数据库设计是对数据进行组织化和结构化的过程,核心问题是关系模型的设计。对于数据库规模较小的情况,我们可以比较轻松的处理数据库中的表结构。然而,随着项目规模的不断增长,相应的数据库也变得更加复杂,关系模型表结构更为庞杂,这时我们往往会发现我们写出来的SQL语句的是很笨拙并且效率低下的。更糟糕的是,由于表结构定义的不合理,会导致在更新数据时造成数据的不完整。因此数据库的规范化流程尤为重要,它可以以指导我们更好的设计数据库的表结构,减少冗余的数据,借此可以提高数据库的存储效率,数据完整性和可扩展性。
那怎么才算是规范化的设计流程:规范化设计的过程就是按不同的范式,将一个二维表不断地分解成多个二维表并建立表之间的关联,最终达到一个表只描述一个实体或者实体间的一种联系的目标。目前遵循的主要范式包括1 NF、 2 NF、3 NF、BCNF、4NF和 5NF等几种;在工程中3NF、BCNF应用得最广泛,推荐采用 3 NF作为标准。规范化设计的优点包括可有效地消除数据冗余,理顺数据的从属关系,保持数据库的完整性,增强数据库的稳定性、伸缩性、适应性。通常认为规范化设计存在的主要问题是增加了查询时的连接库表运算,导致计算机时间、空间、系统及运行效率的损失。在大多数情况下,这一问题可通过良好的索引设计等方法得到解决。数据库设计中关键的步骤就是要确保数据正确地分布到数据库的表中。
比如说,一个客户的地址信息不应该被存储在不同的表中,因为这里的客户地址是雇员的一个属性。如果存在过多的冗余数据,这就意味着要占用了更多的物理空间,同时也对数据的维护和一致性检查带来了问题,当这个客户的地址发生变化时,冗余数据会导致对多个表的更新动作,如果有一个表不幸被忽略了,那么就可能导致数据的不一致性。
二:查询的优化
如何让你写的SQL语句跑的更快呢?影响我们代码速度的都有哪些可能性呢?不恰当的索引设计、不充份的连接条件和不可优化的where子句都有可能造成速度的下降。
首先来看看索引的建立。微软的sql server提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引),聚集索引简单理解就是数据的实际的存放位置:如我们的汉语字典正文本身就是一个聚集索引,当我们知道要查的字拼音首字母为A时,迅速缩小查询范围,翻到前几页就可以很快找到了,避免全表扫描,当然这种索引对于一个表只能有一个,因为只能按照一种方法进行排序存放,所以一定得选择最合适的聚集索引规则。非聚集索引,简单来说就是目录,比如字典中的偏旁部首目录,当我们要查找数据的时候我们先通过目录缩写范围,再进行查询目标的确认。下表我们可以作为参考建立适合的索引


索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。所以合适的索引才能使数据库得到性能的提高。
再者就是连接条件:其实在多表链接操作被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、数据记录数多的表;
可以打开执行计划,看具体的执行情况,哪些环节的资源的占用大,是否可以优化查询或者优化结构。另外:动态管理视图(DMV)和动态管理函数(DMF)返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能。
如:查找哪些批处理/请求生成的I/O最多、查询以查看 CPU、计划程序内存和缓冲池信息、CPU 平均占用率最高 SQL 语句等。涉及的视图及函数如下:sys.dm_exec_sql_text、dm_exec_query_stats、dm_os_sys_info、dm_exec_cached_plans、dm_exec_query_plan、等
三:就是where条件
我们建立了索引就不是就可以使查询的速度达到最快,而是在查询的时候要使用到索引,才会优化我们的查询速度。比例根据部门列建立了索引,但是我们在使用部门的查询条件的时候用’%XXX%’,此种条件是使用不到索引的,如下like便可以‘XXX%’;UNION在进行表链接后会筛选掉重复的记录,而往往重复的基本上不存在,可以采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回结果。等等
其实sql数据库优化的地方还有很多,此处只是大致说明sql数据库优化的方向。我们如何去找我们的速度的瓶颈,从哪些方面去优化我们的数据库

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多