You*_*nes 5 database sql-server
我有一个Oracle背景,并且在Oracle中使用"索引组织表"(IOT)对每个表来说都是不合理的,我从来没有真正看过这个.在SQL Server中,我工作的每个数据库在每个表上都有一个聚簇索引,这与IOT(概念上)相同.
这是为什么?到处使用聚簇索引有什么理由吗?在我看来,他们只会对少数情况有益.
谢谢
聚簇索引与索引组织表不完全相同.使用物联网,每个字段必须参与物联网键.SQL Server上的聚簇索引不必是唯一的,也不必是主键.
群集索引在SQL Server上广泛使用,因为几乎总会有一些自然排序使常用查询更有效.甲骨文中的物联网带来了更多的包袱,因此它们并没有那么有用,尽管它们可能更有用,然后它们通常被认为是有用的.
从历史上看,实际上旧版本的SQL Server 6.5或7.0版IIRC不支持行级锁定,只能锁定表或页面级别.通常,聚簇索引将用于确保写入分散在表的物理存储周围,以最大限度地减少页锁争用.但是,几年前SQL Server 6得到了支持,因此具有此问题的应用程序将仅限于罕见的遗留系统.
如果没有聚集索引,表将被组织为堆。这意味着插入的每一行都会添加到表末尾的数据页中。此外,当行更新时,如果更新的数据比以前大,它们就会移动到表末尾的数据页。
什么时候最好没有聚集索引
如果您有一个表需要最快的插入速度,但会牺牲更新和读取速度,那么没有聚集索引可能适合您。一个例子是,如果您有一个用作队列的表,例如,大量插入稍后会被读取并移动到另一个表。
聚集索引
聚集索引根据聚集索引中的列组织表中的数据。如果您聚集在错误的事物上,例如唯一标识符,这可能会减慢速度(见下文)。
只要您的聚集索引位于最常用于搜索的值上,并且它是唯一的并且不断增加,您就可以从聚集索引中获得一些惊人的性能优势。例如,如果您有一个名为 USERS 的表,您通常在其中根据 USER_ID 查找用户数据,那么基于 USER_ID 的集群将加快所有这些查找的性能。这只是减少了获取数据所需读取的数据页的数量。
如果聚集索引中有太多键,这也会减慢速度。
聚集索引的一般规则:
不要聚集在任何 varchar 列上。
在 INT IDENTITY 列上进行聚类通常是最好的。
集中您经常搜索的内容。
基于唯一标识符的聚类
对于索引中的唯一标识符,它们的效率极低,因为没有自然的排序顺序。基于索引的 B 树结构,当使用 uniqueidentifiers 时,您最终会得到极其碎片化的索引。经过重建或重组后,它们仍然极其分散。因此,您最终会得到一个较慢的索引,由于碎片,最终在内存和磁盘上会变得非常巨大。此外,在插入 uniqueidentifier 时,您更有可能最终在索引上出现页面拆分,从而减慢插入速度。一般来说,唯一标识符对于索引来说是个坏消息。
概括
我的建议是每个表都应该有聚集索引,除非有充分的理由不这样做(即表充当队列)。
| 归档时间: |
|
| 查看次数: |
561 次 |
| 最近记录: |