SQL性能优化的几个技巧

来源:互联网 发布:mac浏览器flash插件 编辑:程序博客网 时间:2024/06/05 11:41

关于数据库的性能优化,网上有太多的文章了,我也是最近做项目,遇到相关的问题,所以学习了很多相关方面的知识。本文也是我完成项目后总结出来的一些经验。

我最近做的项目是本地联通的一个查询项目,数据量并不是很大,但是也不小,十几万条信息,最主要的是要进行频繁的查询操作。以下是我积累下来的小技巧。
Part One分页
数据量到一定程度,必然需要使用真分页,也就是数据库分页。这里面有row_number() 方法和TOP加NOT IN方法。
网上测试说,在小数据量下(一般应该认为是10万以下,TOP+NOT IN分页方式效率要比ROW_NUMBER()高;在大数据量下(百万级)ROW_NUMBER()分页方式效率要更高一些。
根据我实际项目测试,ROW_NUMBER()和TOP+NOT IN完成的耗时几乎没有太大差别。
当然,也有在存储过程使用row_number()函数进行分页。
Part Two 索引
一、聚集索引
说到数据库性能优化,怎么能不说索引。
做索引优化,第一个要考虑的就是聚集索引,因为一个数据表的物理结构就是有聚集索引决定的。一般mssql会把自增主键默认作为聚集索引,但是本次项目,由于某一个字段被查询的概率最大,所以我将聚集索引放在了这个字段上,并且把相关排序也都设为这个字段。这样做好处是查询效率和检索效率的提升,但是对数据新增/修改/删除的有一些影响。
二、复合索引
之后是做复合索引,项目很多时候也会出现某几个条件同时进行检索的情况,所以我为这几个条件建立了复合索引,并设置为默认的索引。并且索引字段的排序也是从辨识程度更高的字段在前,依次排列。

select xxxx from (select ROW_NUMBER() over(order by Info_Industry asc) as 'rowNumber', * from InfoList WITH(INDEX=idx_InfoList) WHERE Info_Industry LIKE '%中%' AND Info_Phone LIKE '%%' AND Info_OrganizName LIKE '%%' AND  Info_Address LIKE '%%') as temp where rowNumber between 1 and 100

添加组合索引时,做相等运算字段应该放在最前面或者说将选择性高的字段,放在最前面。也就是将最有效的过滤条件,设置为复合索引的第一位
索引是以平衡树(B树)的方式存在的,复合索引的列的顺序决定了B树的信息的存储的顺序
排序的差别就在于:一开始的过滤条件,决定了查询多少page初步确定满足条件的数据,再进一步的进行过滤
如果最开始就相对精确地确定了满足查询条件的数据范围,后面可以通过相对较小的代价来最终确认出满足条件的数据
如果最开始相对模糊地却确定了满足查询条件的数据范围,那么这个过程的代价就相对比较大,虽然后面通过每一个条件的过,结果是一样的
当然这种索引的建立跟数据分布有关,但是,这里没有下结论说,复合索引一定要按照什么什么顺序来是最好的
Part Three 小技巧
在统计表的行数时候,经常用到 select count(*),然而对于行数很多的大表,这样的查询速度将会很慢。因为这样的查询对表的每一行都会进行每个列的扫描。
比较快的办法是 select count(0), 这样每一行就只是扫描行头信息。
以上2种都是进行的全表扫描。
更快的是 select count(唯一索引列), 这样的查询会走索引。(前提是你有索引啊!)。

先写这些,以后有机会,再深入研究。

0 0
原创粉丝点击