在理解聚集索引时我错过了什么?

2024-04-11

如果没有任何索引,则通过 IAM((索引分配映射)访问表行。
我可以使用 IAM 以编程方式直接访问行吗?

缺少索引是否意味着读取特定行的唯一方法是全表扫描读取所有表?
为什么 IAM 不能参与更具体的直接访问?

“如果表是堆(换句话说,它没有聚集索引),则书签是行标识符 (RID),它是 File#:Page#:Slot# 形式的实际行定位符”[1a]

插槽没有进一步的定义。好吧,其他消息来源告诉我们 Slot# 实际上是行号。正确的?或者需要与 IAM 进一步并置以确定特定行?

现在,引入聚集索引意味着无法直接访问数据,只能通过最终的聚集索引查找或顺序遍历聚集叶节点。

我是否正确理解引入聚集索引仅对选择连续相邻(范围)行并且仅通过聚集索引键有益?
对表进行集群还有哪些好处?

我是否正确理解聚集索引的引入会恶化非聚集索引参与非精确匹配查询的性能优势?没有直接访问、顺序访问无法并行、非聚集索引由聚集索引键增加等等,对吗?

好吧,我发现对表进行聚类对于非常具体且易于理解的上下文是有意义的,而在对表进行聚类时总是默认创建主键。为什么?

我在理解聚集索引时错过了什么?

[1]
Microsoft® SQL Server™ 2005 内部:存储引擎
作者:Kalen Delaney -(扎实的优质学习)
................................................
出版商: 微软出版社
发布日期:2006 年 10 月 11 日
打印 ISBN-10:0-7356-2105-5
打印 ISBN-13:978-0-7356-2105-3
页数:464

[1a] p.250 第 7 章索引组织部分。索引内部结构和管理

这是有用的在线复制粘贴
http://sqlserverindexeorgnization.blogspot.com/ http://sqlserverindexeorgnization.blogspot.com/
尽管没有任何来源

相关问题:

  • 无法直接访问聚集表中的数据行 - 为什么? https://stackoverflow.com/questions/4049179/no-direct-access-to-data-row-in-clustered-table-why
  • 为什么/何时/如何选择全聚集索引扫描而不是全表扫描? https://stackoverflow.com/questions/3970430/why-when-how-is-whole-clustered-index-scan-chosen-rather-than-full-table-scan
  • SQL Server 2005 中没有聚集索引的原因 https://stackoverflow.com/questions/4034076/reasons-not-to-have-a-clustered-index-in-sql-server-2005

Update:@性能DBA,

  • “请忘记您引用的 doco,然后重新开始”

凭什么重新开始我?
任何参考,任何建议。技术如何重新开始?

  • **“聚集索引总是更好”

你能回答我的问题吗为什么/何时/如何选择全聚集索引扫描而不是全表扫描? https://stackoverflow.com/questions/3970430/why-when-how-is-whole-clustered-index-scan-chosen-rather-than-full-table-scan疑问是全聚簇索引扫描是什么意思。不是比全表扫描读取的多吗?

  • “如果有 IAM,那么就有索引”

那么,如果根本没有索引就没有 IAM 吗?
有CI就有IAM吗?

我应该如何验证/研究它?
如果所有文档都写相反的内容:
- 非索引表上有 IAM
- 如果有聚集索引,则没有 IAM。


这是很多问题。是的,IAM 用于查找堆上的页面。不同之处在于,如果没有索引,就无法知道对于任何给定的数据片段要检索哪些页面。 SQL/关系数据模型的一个重要特征是查询仅通过数据值访问数据,而不是直接使用指针或其他结构。

槽号仅标识页面内的行。行数据在页内没有逻辑排序,即使在聚集索引中也是如此。每个数据页都包含一个行偏移表,该表指向页内行的位置。

由于需要额外的书签查找,聚集索引可能会减慢非聚集索引的数据访问速度。这可以通过使用 INCLUDE 子句将列添加到 NC 索引来缓解。有时,表上没有聚集索引可能会更有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在理解聚集索引时我错过了什么? 的相关文章

  • Spring Batch 死锁 - 无法增加身份;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException

    我们正在将 Spring Batch 应用程序从 Oracle DB 迁移到 Azure SQL Server 我在尝试执行时收到以下错误两个不同的工作同时更新不同的表 但使用相同的公共 BATCH 表 引起原因 org springfra
  • 使用条件 SQL 统计每月汇总记录

    我有一张桌子 我们就叫他们桌子吧SUMMARYDATA NIP NAME DEPARTMENT STATUSIN STATUSOUT TOTALLOSTTIME A1 ARIA BB 2020 01 21 08 06 23 2020 01
  • django AuditTrail 与还原

    我正在开发一个新的网络应用程序 我需要将数据库中的任何更改存储到审核表中 此类审计表的目的是 稍后在真正的物理审计中 我们可以确定在某种情况下发生了什么 谁编辑了什么以及数据库当时的状态是什么 复杂的计算 所以大多数审计表将被写入而不是读取
  • Pandas hub_table 更快的替代品

    我正在使用熊猫pivot table在大型数据集 1000 万行 6 列 上运行 由于执行时间至关重要 因此我尝试加快流程 目前 处理整个数据集大约需要 8 秒 这太慢了 我希望找到替代方案来提高速度 性能 我当前的 Pandas 数据透视
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • 有没有办法设置 SQL Server 作业计划每 30 秒运行一次?

    当我尝试创建计划时 我可以选择的最短时间是 1 分钟 有没有办法将其减少到秒 这篇文章在这里SQL Server 作业调度 http www sqlservercentral com articles Administration sqls
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 插入具有多个值的外键

    我想知道 是否有可能创建一个表 其中我有一个接受外键但同一行可能有多个值的表 例如 Employee id name skillid Skill Skillid skillname 这里 Employee 的一个例子可以是 Employee
  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • 使用 g++ 5.3.1 编译的程序运行速度比使用 g++ 4.8.4 编译的相同程序慢 3 倍,相同的命令

    最近 我开始使用 Ubuntu 16 04 和 g 5 3 1 并检查我的程序是否运行慢3倍 在此之前我使用过 Ubuntu 14 04 g 4 8 4 我用相同的命令构建它 CFLAGS std c 11 Wall O3 我的程序包含循环
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • 从对象定义生成数据库表

    我知道有几种 自动 方法可以创建数据访问层来操作现有数据库 LINQ to SQL Hibernate 等 但我有点厌倦了 我相信应该有更好的做事方式 比如 在 Visio 中创建 更改表 使用 Visio 的 更新数据库 创建 更改数据库
  • 如何拥有引用另一个表的检查约束?

    我在 SQL Server 2008 数据库中有以下表 tblItem 其中有一个ItemID field 好项目 它还有一个 ItemID 字段 并且有一个指向 tblItem 的外键 tblBadItem 它也有一个 ItemID 字段
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ

随机推荐