关于数据库索引的问题

火星的你 2009-06-29 04:20:46
请问各位:
我在创建数据库时表中都没有数据,对于那些数据量大的表我又在上面创建了索引,
我都是指定fillfactor=30;以后还得向表中插入大量数据。
我在想我这样先创建索引后插入数据,是否合理!高手讲解一下!
...全文
27 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
火星的你 2009-06-30
  • 打赏
  • 举报
回复
谢谢
大P 2009-06-30
  • 打赏
  • 举报
回复
猜测楼主设置fillfactor=30的心态,估计写数据会比较频繁..

顺带一说 ,楼主的聚集索引 字段 不可过长, 并且必须要有序 ,如果满足不了这2点, 建议你还是弄到其他能有序的字段上去(实在没有,做成自增ID也可) ,这个字段整为非聚集 , 否则索引的维护会很痛苦 (写频繁的表 所有索引的总和不可大于5个)
大P 2009-06-30
  • 打赏
  • 举报
回复
你这个是OLTP吗?? 读多 还是写多? 你得自己平衡下这个取舍啊

我个人觉得没有必要fillfactor 为30,这样得scan(seek) 多少页面啊...

如果索引比较小,你大可不必管它的..
填充因子没有一个很好的模板 或者是一个标准来定制..得周期性观察 周期时间视你而定(视数据表的增长量)...像我这里的生产环境,目前的设备集成度不高..数据量不算大.我一般半个月会去 DBCC SHOWCONTIG 拿出结果 然后丢到临时表里分析...

保持fillfactor为0, or 75~100 间...
如果DBCC SHOWCONTIG后的结果,Scan Density高于 或者等于90% , 你大可不必改变这个填充因子

在60~90%间 ,你可以小幅度的降低fillfactor-2%

如果低于60%, 则大幅度的降低fillfactor , 一般取值为Page Density 和fillfactor 之间的值, 譬如
fillfactor =100 , Average page density =60 , 则取值为80左右.

如果Average page density 大于fillfactor , 并且 Scan density 将至100%, 那么你就可以加大你的fillfactor .
譬如: fillfactor =80 ,Scan density =98, Average page density =88, 在你索引重建下次的时候, 你可以加大8%的 fillfactor , 如果这样的情况一直保持下去 ,你就可以提高fillfactor ,但是不要超过92%...

多观察 ,少改动,力求判断准确..OVER

只有你自己才会找到适合你当前环境的方法, 多尝试, 祝你顺利~

参考:
http://www.sqlservercentral.com/articles/Performance+Tuning/amethodologyfordeterminingfillfactors/1195/

满衣兄 2009-06-30
  • 打赏
  • 举报
回复
学习
火星的你 2009-06-30
  • 打赏
  • 举报
回复
我现在又几张表:表中数据一分钟会插入一条,考虑到查询历史记录时的速率问题,这时索引的填充因子应该如何设置?
wangyonghan460 2009-06-30
  • 打赏
  • 举报
回复
顶大批量数据插入完成后,检查完毕,建索引
ai_li7758521 2009-06-30
  • 打赏
  • 举报
回复
索引的填充因子是多少?

和索引重建最相关的是填充因子。当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量。填充因子设置为100意味着每个索引页100%填满,50%意味着每个索引页50%填满。

如果你创建一个填充因子为100的聚集索引(在一个非单调递增的列上),那意味着每当一个记录被插入(或修改)时,页拆分都会发生,因为在现存的页上没有这些数据的空间。很多的页拆分会降低SQLServer的性能。

举个例子:假定你刚刚用缺省的填充因子新创建了一个索引。当SQLServer创建它时,它把索引放在相邻的物理页面上,因为数据能够顺序的读所以这样会有最优的I/O访问。但当表随着INSERT、UPDATE、DELETE增加和改变时,发生了页拆分。当页拆分发生时,SQLServer必须在磁盘的某处分配一个新的页,这些新的页和最初的物理页不是连续的。因此,访问使用的是随机的I/O,而不是有顺序的I/O,这样访问索引页会变得更慢。

那么理想的填充因子是多少呢?它依赖于应用程序对SQLServer表的读和写的比率。首要的原则,按照下面的指导:

低更改的表(读写比率为100:1):100%的填充因子

高更改的表(写超过读):50-70%的填充因子

读写各一半的:80-90%的填充因子

在为应用程序找到最优的填充因子前也不得不进行试验。不要假定一个低的填充因子总比高的好。低的填充因子会减少页拆分,它也增加了SQLServer查询期间读的页数量,从而减少性能。太低的填充因子不仅增加I/O开销,也影响缓存。当数据页从磁盘移到缓存中时,整个页(包括空的空间)都移到缓存中。所以填充因子越低,不得不移到SQLServer缓存中的页面就越多,意味着同时为其他重要数据页驻留的空间就少,从而降低性能。

如果你没有指定填充因子,缺省的填充因子时0,意味着100%的填充因子(索引的叶页100%的填满,但索引的中间页有预留的空间)。

作为监控的一部分,你要决定新建索引或重建索引时的填充因子是多少。事实上,除了只读数据库,所有的情况,缺省值0都是不适合的。相反,你想要一个填充因子保留合适的自由空间,按照上面的讨论来做。
--小F-- 2009-06-29
  • 打赏
  • 举报
回复
有时候在合适的场合使用一些可选项,可以提高索引的创建速度。如为了大批量导入数据,我们往往会先取消索引其以提高插入的速度。然后等数据导入完毕后再重新创建索引。在这个过程中如果能够采用一些可选项,则可以缩短索引创建的时间。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧