我目前正在对遗留系统进行一些数据导入,并发现该系统不使用单个聚簇索引.一个快速的谷歌搜索向我介绍了HEAP表的概念,现在我很好奇在HEAP表应该优先于集群表的哪些使用场景?
据我所知,HEAP表仅对审计表有用和/或插入的发生频率远高于选择.它会节省磁盘空间和磁盘I / O,因为没有要维护的聚簇索引,并且由于非常罕见的读取,额外的碎片不会成为问题.
解决方法
唯一有效的用途是
>导入/导出/ ETL过程中使用的登台表.
>使用SELECT * INTO对表进行临时,临时和短期备份.
临时表通常非常扁平并且在使用之前/之后被截断.
请注意,与数据大小相比,聚簇索引通常很小:数据是索引结构的最低级别.
堆表也有问题.至少这些:
>无法进行碎片整理以减少磁盘空间.这很重要,因为使用的数据页将分散在整个MDF中,例如,因为数据没有来自聚簇索引的“顺序”
>非聚集索引现在指向行,而不是聚集索引条目.这会影响性能:Need for reaching data through clustered index with a non-clustered index
另见
> http://www.sqlbadpractices.com/heap-tables/(不良做法)
> http://msdn.microsoft.com/en-us/library/hh213609.aspx(MS的推荐)
> http://sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(2930)-fixing-heap-fragmentation.aspx(Paul Randal的DBA神话)