我最近注意到我们有很多表存储在堆中(没有聚集索引)。您是否会有选择地,全面地或根本不创建聚簇索引?还有其他任何智慧或建议吗?
有一些“代码”表有25行左右。但是,有几个行超过一百万行。
修改 “大表”中,所有这些都已经有索引,而不是群集索引。一些是日志表,他们只是插入,几乎没有阅读。有一些非常重要,大部分只是被应用程序插入并随后读取了很多次。
修改 所有桌子上都有PK,我很少兴趣,它们主要只插入一次,但多次读取显示屏幕。
在其中一些表中,它们一次插入一个块或相关行中,并且在没有更新的情况下多次读取,或者组被完全删除,然后再次作为块重新插入。它们通常在某个块中读取以显示或进行计算。
在这些表的另一个“类型”中,行重复插入相关行的组中,并且始终插入不同的组。在屏幕显示上,需要返回完整的组。例如,随着时间的推移插入这些行组(其中一组可以是5-50行):
1:00pm A1, B1, C1,
1:30pm A2, B2, C2,
2:00pm A3, B3, C3, D1
2:30pm A4, C4, D2
3:00pm C5, D3, E1
3:30pm D4, E2
屏幕需要显示完整的A:A1 + A2 + A3 + A4
修改 根据提及碎片的@gbn回答,我使用了这个query from marc_s并找到了以下碎片信息,其中包含数百万+行的堆表,并且被多次读取并被屏幕使用:
TableName index_type alloc_unit_type index_depth index_level avg_fragmentation_in_percent fragment_count avg_fragment_size_in_pages page_count avg_page_space_used_in_percent record_count ghost_record_count Version_ghost_record_count min_record_size_in_bytes max_record_size_in_bytes avg_record_size_in_bytes forwarded_record_count
--------- ---------- --------------- ----------- ----------- ---------------------------- -------------- -------------------------- ---------- ------------------------------ ------------ ------------------ -------------------------- ------------------------ ------------------------ ------------------------ ----------------------
TABLE_A HEAP IN_ROW_DATA 1 0 95.8294717330862 2069 8.18511358144031 16935 98.2659995058068 1125786 3 0 80 164 117.671 0
TABLE_A HEAP IN_ROW_DATA 1 0 95.8294717330862 2069 8.18511358144031 16935 98.2659995058068 1125786 3 0 80 164 117.671 0
TABLE_A HEAP IN_ROW_DATA 1 0 95.8314034275127 2070 8.18212560386473 16937 98.2559303187546 1125793 11 0 80 164 117.672 0
TABLE_B HEAP IN_ROW_DATA 1 0 99.2541594951233 1734 6.44982698961938 11184 94.5866567828021 1222729 0 0 68 82 68.037 0
TABLE_B HEAP IN_ROW_DATA 1 0 99.2541594951233 1734 6.44982698961938 11184 94.5866567828021 1222729 0 0 68 82 68.037 0
TABLE_B HEAP IN_ROW_DATA 1 0 99.197247706422 1735 6.44726224783862 11186 94.5725228564369 1222745 23 0 68 82 68.038 0
TABLE_C HEAP IN_ROW_DATA 1 0 71.5785224061365 1777 10.9527293190771 19463 97.4122807017544 2237831 0 0 9 84 66.588 2485
TABLE_C HEAP IN_ROW_DATA 1 0 71.5785224061365 1777 10.9527293190771 19463 97.4122807017544 2237831 0 0 9 84 66.588 2485
TABLE_C HEAP IN_ROW_DATA 1 0 71.589991928975 1778 10.9476940382452 19465 97.4023844823326 2237832 0 0 9 84 66.588 2485
TABLE_D HEAP IN_ROW_DATA 1 0 40.0769404842725 1773 19.7535250987028 35023 98.0193106004448 2778169 0 0 98 112 98.041 0
TABLE_D HEAP IN_ROW_DATA 1 0 40.0904977375566 1774 19.7480270574972 35033 98.0175315048184 2778821 0 0 98 112 98.044 0
TABLE_D HEAP IN_ROW_DATA 1 0 40.1040488577245 1775 19.7385915492958 35036 98.0142451198419 2778948 0 0 98 112 98.045 0
TABLE_E HEAP IN_ROW_DATA 1 0 97.1619365609349 2911 8.11473720371007 23622 99.390066716086 3333693 0 0 55 69 55.017 0
TABLE_E HEAP IN_ROW_DATA 1 0 97.1628838451268 2912 8.11332417582418 23626 99.3852359772671 3334016 0 0 55 69 55.018 0
TABLE_E HEAP IN_ROW_DATA 1 0 97.1638304971638 2913 8.11122554067971 23628 99.3799357548802 3334100 0 0 55 69 55.018 0
TABLE_F HEAP IN_ROW_DATA 1 0 21.9911471599199 8903 36.3093339323823 323262 94.6116753150482 4734053 44 0 521 535 521.046 0
TABLE_F HEAP IN_ROW_DATA 1 0 21.9911471599199 8903 36.3093339323823 323262 94.6116876698789 4734053 50 0 521 535 521.046 0
TABLE_F HEAP IN_ROW_DATA 1 0 21.9930761622156 8904 36.3057053009883 323266 94.6112428959723 4734079 78 0 521 535 521.047 0
TABLE_G HEAP IN_ROW_DATA 1 0 66.1932151660993 5649 11.9943352805806 67756 96.7873733629849 6632610 0 0 78 92 78.047 0
TABLE_G HEAP IN_ROW_DATA 1 0 66.1932151660993 5649 11.9943352805806 67756 96.7873733629849 6632610 0 0 78 92 78.047 0
TABLE_G HEAP IN_ROW_DATA 1 0 66.1971830985916 5650 11.9925663716814 67758 96.7855572028663 6632648 11 0 78 92 78.048 0
TABLE_H HEAP IN_ROW_DATA 1 0 11.5377268385864 5585 67.4340196956132 376619 92.3860637509266 6897347 0 0 9 427 406.418 3
TABLE_H HEAP IN_ROW_DATA 1 0 11.5449915110357 5576 67.5530846484935 376676 92.3849023968372 6898289 0 0 9 427 406.419 3
TABLE_H HEAP IN_ROW_DATA 1 0 11.5487458087518 5578 67.5313732520617 376690 92.3848035581913 6898534 0 0 9 427 406.42 3
TABLE_I HEAP IN_ROW_DATA 1 0 96.7330677290837 9715 8.23201235203294 79974 96.3321225599209 3152049 0 0 76 534 195.879 0
TABLE_I HEAP IN_ROW_DATA 1 0 96.7333930883378 9716 8.23157678056814 79978 96.3298122065728 3152142 0 0 76 534 195.879 0
TABLE_I HEAP IN_ROW_DATA 1 0 96.7337183827923 9717 8.23114129875476 79982 96.3323696565357 3152420 0 0 76 534 195.876 0
TABLE_J HEAP LOB_DATA 1 0 0 NULL NULL 87553 95.5205090190264 7790594 0 0 84 98 84.91 NULL
TABLE_J HEAP IN_ROW_DATA 1 0 31.2985438510012 23539 25.4966651089681 600166 96.4532863849765 7807684 0 0 435 1213 598.261 0
TABLE_J HEAP IN_ROW_DATA 1 0 31.2994591137993 23540 25.4959218351742 600174 96.4530145787003 7807780 0 0 435 1213 598.26 0
TABLE_J HEAP IN_ROW_DATA 1 0 31.3022047558782 23543 25.4936074417024 600196 96.4526068692859 7808096 0 0 435 1213 598.255 0
我不确定为什么每个表都有多行,但几乎所有这些表的avg_fragmentation_in_percent
值看起来都相当高。阅读时,这种碎片会成为一个性能问题吗?会建议聚集索引对它们进行碎片整理吗?
答案 0 :(得分:5)
听起来数据库是由知道自己在做什么的人创建的。日志表和小代码表正是堆有意义的地方。
如果数据库没有当前问题,我会保持原样!
答案 1 :(得分:3)
始终添加聚簇索引。如果没有聚簇索引,则无法快速压缩或整理表。没有它,你就不能。
简单,但我敢打赌,一些性能问题可以追溯到组织严密的数据。
答案 2 :(得分:2)
对于大表,聚集索引总是一个好主意。即使是仅插入表。 当然,你的聚类键应该是一个不断增加的价值。
答案 3 :(得分:0)
我会考虑在大表上放置聚簇索引。 聚集索引定义了记录存储方式的物理顺序。这样做的结果是,表中的行可以更有效地存储,并减少碎片。 我确信表中至少会有一列可以成为放置聚簇索引的候选列。 (如果没有,你可以创建一个新列,其中包含创建记录的日期和时间,并在该列上放置聚集索引。我认为这仍然比没有CI更好。)< / p>
编辑:如果大表确实是不经常读取的日志表,那么它们可以保留为堆。
答案 4 :(得分:0)
这取决于表的使用方式。通常我想在具有数百万条记录的表上使用聚簇索引,但您还需要考虑如何使用该表。添加索引会减慢插入速度,因为它必须为每个新记录查找正确的页面(并可能插入新页面),而不是仅仅追加它。如果这些标题主要是数据的“转储”并且很少被检查(例如,紧急日志记录),那么将它们单独留下可能会更好。
与往常一样,您应该个人资料,找出最适合您的应用或系统的内容。
答案 5 :(得分:-1)
大型表上的聚簇索引的一个问题是存储索引所需的缓冲区内存(RAM)等于表的大小。没有单独的索引。非聚簇索引仅存储索引的数据,然后存储表的主键或refid。因此,正常索引更可能适合RAM。如果您使用聚集索引进行搜索并且表格很大,那么您可能很容易放慢速度。如果您的聚集索引是日期的一部分,并且您的搜索都是最近日期的搜索,那么聚集索引可能不会影响搜索性能,因为您永远不会访问所有索引。
我不同意海报声称聚集索引会减少数据碎片。它增加了数据碎片。在普通表上,只有删除会导致碎片。在向集群表中添加行或更改聚簇索引的a字段时,SQL必须对表进行物理重新排序。这意味着破坏和添加数据页面会增加碎片。这就是为什么每个人都建议小心选择一个字段进行聚类a)如果有的话,经常不会改变,并且b)总是递增。
我发现,当您的查询需要经常返回多个“相关”行时,聚簇索引在大型表上很有用。您可以使用群集,以便连续存储相关的行,并且SQL更容易检索。我不一定会聚集一个大表,以便我有一个新的搜索索引。
群集确实具有的一个优势,就像覆盖索引一样,索引包含查询尝试返回的数据。从索引到表格没有额外的步骤来获取数据。
最后,您必须取出分析器,然后运行一些测试。
我是否正确或缺少某些内容?