AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 45485
Accepted
a1ex07
a1ex07
Asked: 2013-07-01 13:12:42 +0800 CST2013-07-01 13:12:42 +0800 CST 2013-07-01 13:12:42 +0800 CST

集群表与非集群表

  • 772

碰巧我不得不同时使用 SQL Server 和 Oracle 很长一段时间(幸好不是同时使用)。

仍然让我感到困惑的是将表格存储为平衡树的方法。在类似 Oracle 的 RDMS 中,堆是默认的,在 SQL Server(和许多其他)中,相反(集群,IOT)是正确的。每种方法的专家都声称他们的方法是唯一“正确”的方法,并通过一堆测试/演示来支持选择的观点。但是,在我看来,他们证明的唯一一点是“非默认”方法的实施很差,并且不应该在大多数情况下使用......

我很确定这两种方法都足够好(只是因为它们仍然存在于市场上并且表现出可比的性能)并且在下面有一些数学,但我没有找到任何好的参考。

我意识到这个话题可能过于宽泛而无法回答,并且非常欢迎良好的链接,但我真的很想知道为什么两种看似有争议的方法已经证明它们都是有效的。

clustered-index
  • 2 2 个回答
  • 3065 Views

2 个回答

  • Voted
  1. Best Answer
    Kin Shah
    2013-07-02T09:12:56+08:002013-07-02T09:12:56+08:00

    当我开始作为 SQL Server DBA 的职业生涯时,我处于相同的位置,但在我的大学里主要学习 ORACLE (10g) .. 以及 OCA 的东西......

    我同意@KennethFisher 的观点,即两个 RDBMS 都不同,比较它们就像 - 比较 Apples 和 Oranges。

    要回答您关于 - 将表格存储为平衡树的问题......

    • Oracle 和 SQL Server 都支持B-Tree索引,它使数据保持排序并允许在对数时间内进行搜索、顺序访问、插入和删除。
    • B-Tree 针对读取和写入大块数据的系统进行了很好的优化。请注意,SQL Server 将这种结构用于非聚集索引,Oracle 使用它作为默认值在内部存储表的存储位置。
    • Oracle 有ROWID(行 ID)和 UROWID(通用行 ID)的概念,其中键值和对记录存储位置的唯一引用包含,这表示存储记录在磁盘上的物理位置。

    例如ROWID 和 UROWID 数据类型的参考概述

    SELECT ROWID, last_name FROM employees WHERE department_id = 20; 
    
    ROWID              LAST_NAME 
    ------------------ ---------- 
    AAAAaoAATAAABrXAAA BORTINS 
    AAAAaoAATAAABrXAAE RUGGLES 
    AAAAaoAATAAABrXAAG CHEN 
    AAAAaoAATAAABrXAAN BLUMBERG 
    

    扩展的 rowid 具有四部分格式,OOOOOOOFFFBBBBBBRRR:

    OOOOOO:标识数据库段的数据对象编号(示例中为 AAAAao)。同一段中的模式对象(例如表集群)具有相同的数据对象编号。

    FFF:包含行的数据文件的表空间相对数据文件编号(示例中的文件 AAT)。

    BBBBBB:包含行的数据块(示例中的块 AAABrX)。块号是相对于它们的数据文件的,而不是表空间。因此,具有相同块号的两行可以驻留在同一表空间的两个不同数据文件中。

    RRR:块中的行。

    • 因此,RDBMS - ORACLE 和 SQL Server 中的概念完全不同。此外,在 Oracle 中创建的 PK 只不过是带有 ROWID 的平衡非聚集索引,用于快速访问,因此没有聚集索引或非聚集索引的概念。

    现在,当涉及到B+Tree索引时,这变得更加有趣和不同:

    • B+Tree 结构类似于 B-Tree 结构,但表记录(实际数据)存储在主键索引的叶节点中,允许快速访问表的 PK 上的精确匹配或范围扫描搜索。

    • Oracle 使用所谓的 IOT(索引组织表),而 SQL Server 使用所谓的聚集索引。

    让我们看看聚集索引和索引组织表 (IOT) ...:

    来自Oracle 文档,

    索引组织表是存储在 B 树索引结构的变体中的表。在堆组织的表中,行插入到它们适合的位置。在索引组织的表中,行存储在表的主键上定义的索引中。B 树中的每个索引条目还存储非键列值。因此,索引就是数据,数据就是索引。应用程序使用 SQL 语句像处理堆组织表一样操作索引组织表。

    在此处输入图像描述

    从SQL Server 文档,

    在 SQL Server 中,索引被组织为 B 树。索引 B 树中的每一页称为索引节点。B树的顶端节点称为根节点。索引中最底层的节点称为叶节点。根节点和叶节点之间的任何索引级别统称为中间级别。在聚集索引中,叶节点包含基础表的数据页。根和中间级节点包含保存索引行的索引页。每个索引行包含一个键值和一个指向 B 树中的中间级别页面或索引叶级别中的数据行的指针。索引的每一级中的页面都链接在一个双向链表中。

    在此处输入图像描述

    • IOT 的统计数据包括行的物理分散,而 SQL Server 不包括统计数据中行的物理位置,因此 SQL Server 中的聚集索引优于 HEAP - 数据按聚集键排序,并为数据获得良好的估计被搜索。

    最后一些很好的参考:

    • Oracle 和 SQL Server 中的统计信息 - Jonathan Lewis 和 Grant Friitchey
    • Oracle 堆表或 SQL Server 聚集索引?——乔纳森·刘易斯和格兰特·弗里奇
    • 索引组织表 - 基础- 优秀系列!
    • 修复堆碎片
    • 内部和删除

    当我遇到值得一提的时候,我会添加更多的点......

    • 5
  2. Kenneth Fisher
    2013-07-01T13:40:01+08:002013-07-01T13:40:01+08:00

    其实有一个相当简单的答案。Oracle 和类似的 RDBMS 被优化为使用堆,而 MS SQL Server 和类似的被优化为使用聚集索引。如果您查看每个系统的内部结构,您会发现它们的设计是为处理所选方法而构建的。因此,在这种特殊情况下,两组“专家”都是正确的。在具有聚簇索引的 SQL Server 表中运行得更好,在 Oracle 中堆工作得更好(通常在这两种情况下)。我不确定这两种方法总体上是好是坏,这只是 RDBMS 设计人员的偏好。根据我对 MS SQL Server 内部的了解(我还没有研究过 Oracle 的内部),我不确定您是否可以编写一个双向运行良好的 RDBMS。

    • 3

相关问题

  • 使用 update 语句更新包含的列时,非聚集索引会发生什么情况?

  • 聚集索引总是比非聚集索引好?

  • 堆上的非聚集索引与聚集索引的性能

  • 使用 SSD 时,数据库设计中聚集索引的概念是否有意义?

  • 什么是聚集索引?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve