今天从clustered index和nonclustered index开始看起,收获了不少新知识,在下班前总结一下,以便为来日更深层次的研究做准备。
因为本身不是DBA出身,我本人对数据库优化的概念还是比较淡薄的,毕竟作为开发人员,更重要的是把客户的需求完美地实现才是最重要的。
不过有些场景下,也不得不对数据库优化和概念有比较深入的了解。
关于clustered index和nonclustered index,现在总结下来就是前者是为了更新数据,后者是为了查询数据。
下面是一些不错的文章关于clustered index和nonclustered index的。
http://tech.it168.com/a2009/1125/814/000000814758_all.shtml
http://www.dotblogs.com.tw/ricochen/archive/2011/12/16/62448.aspx
http://www.dotblogs.com.tw/ricochen/archive/2011/12/19/62665.aspx
http://blog.youkuaiyun.com/fenglibing/article/details/4040457
http://blog.youkuaiyun.com/metababy/article/details/3920821
http://niutuku.com/tech/MsSql/238401.shtml
这其中,又涉及到了newid()和newsequentialid()的区别,具体详见下面的帖子。
http://blog.youkuaiyun.com/xushichang/article/details/4390957
具体的区别就请看下图,上半部分是就是用newid(),下班部分就是用newsequentialid()。
有了索引就会涉及到fill factor,就是填充因子,曾经有一位DBA和我说过需要调整这个参数,将其设置为sp_configure-->Fill factor = 90%,否则新增数据的时候会很慢。
详见:http://technet.microsoft.com/zh-cn/library/ms191005(it-it,SQL.90).aspx
随着数据的不断增加,就会产生碎片,之后可以用DBCC SHOWCONTIG来检查,详见下面的链接:
http://database.ctocio.com.cn/96/9326096.shtml
http://msdn.microsoft.com/ZH-CN/LIBRARY/ms175008
在上面的微软官方解释中,还附加了使用 DBCC SHOWCONTIG 和 DBCC INDEXDEFRAG 对数据库中的索引进行碎片整理的脚本,但实际使用下来,不如重建索引效果好,但重建的代价还是比较大的,因为在重建过程中,内存还需要维护旧的索引如果有人在使用的话,所以需要慎重考虑重建索引。
之后在下面的文章中又学到一个新东西,就是使用sys.dm_db_index_physical_stats来查看索引碎片,因为DBCC SHOWCONTIG不是最精确,官方上面是这么说的:Unlike DBCC SHOWCONTIG, the fragmentation calculation algorithms in both cases consider storage that spans multiple files and, therefore, are accurate.
http://www.sqlservercentral.com/Forums/Topic555375-360-1.aspx
关于怎么利用sys.dm_db_index_physical_stats查看索引大小/碎片等信息,要看下面的文章了。
http://www.2cto.com/database/201301/187151.html
再之后就是重建索引了,需要使用DBCC DBREINDEX命令,详见下文。
http://blog.163.com/szy1986311@126/blog/static/14108867320120922835779/
上面说过,重建索引是最彻底的消除碎片的方法,这也是我通过测试后得出的,但是代价也是最大的。
关于重建索引的重要性,可以参考下文。
http://news.dayoo.com/tech/201005/21/10000617_102079320.htm
由此可见,优化数据库的学问还是非常大的,短时间内是无法掌握的,还需要实际的操作和测试,这才是王道。