为什么非聚集索引扫描比聚集索引扫描更快?

2024-01-01

据我所知,堆表是没有聚集索引的表,没有物理顺序。 我有一个包含 120k 行的堆表“扫描”,我正在使用此选择:

SELECT id FROM scan

如果我为“id”列创建非聚集索引,我得到223 物理读取。 如果我删除非聚集索引并更改表以使“id”成为我的主键(以及我的聚集索引),我得到515 物理读取.

如果聚集索引表是这样的图:

为什么聚集索引扫描像表扫描一样工作? (或者在检索所有行的情况下更糟)。为什么它不使用块较少且已经具有我需要的ID的“聚集索引表”?


SQL Server 索引是 B 树。非聚集索引仅包含索引列,b 树的叶节点是指向适当数据页的指针。聚集索引则不同:它的叶节点是数据页本身,聚集索引的 B 树成为表本身的后备存储;该表的堆不再存在。

您的非聚集索引包含一个可能是整数的列。首先,它是一个小而紧凑的索引。您的查询select id from scan has a 覆盖指数:只需检查索引即可满足查询,这就是正在发生的情况。但是,如果您的查询包含不在索引中的列,假设优化器选择使用非聚集索引,则需要进行额外的查找来从聚集索引或堆中获取所需的数据页。

要了解发生了什么,您需要检查优化器选择的执行计划:

  • See 显示图形执行计划 http://technet.microsoft.com/en-us/library/ms178071(v=sql.105).aspx
  • 参见红门SQL Server 执行计划 http://download.red-gate.com/ebooks/SQL/eBOOK_SQLServerExecutionPlans_2Ed_G_Fritchey.pdf,格兰特·弗里奇
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么非聚集索引扫描比聚集索引扫描更快? 的相关文章

  • 如何在 MariaDB 10 中启用大索引?

    在 Debian Jessie 中 我安装了 MariaDB 服务器 10 0 30 并尝试增加最大密钥长度 AFAIU 这取决于配置参数innodb large prefix正在启用 根据docs https mariadb com kb
  • 返回行位置 - Postgres

    我返回一个带有位置的表 select from select row number over as position from organization result where data1 Hello 返回这个 这是正确的 data1 H
  • 仅当变量不为空时 SQL 添加过滤器

    您好 我有疑问如下 SELECT route id ROUTE ID FROM route master NOLOCK WHERE route ou 2 AND route query l s query AND lang id 1 这里
  • 在同一个表上组合两个 SQL SELECT 语句

    我想结合这两个 SQL 查询 SELECT FROM Contracts WHERE productType RINsell AND clearTime IS NULL AND holdTime IS NOT NULL ORDER BY g
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • 将列的值添加到 LIKE 语句中?

    我有 3 个标签表 标签类别和使用过的标签 我想要获取所有标签的列表以及已使用标签的计数 所使用标签的格式是每个具有标签的文档 ID 的逗号分隔值 我一直在尝试类似的方法 但无法将tags tag 字段的值插入到LIKE 语句中 SELEC
  • SSRS。如何在table1_Details_Group右侧创建新的行组?

    我正在使用 Microsoft Visual Studio 2013 创建报告 PROBLEM 如果我添加新的Row Group前面会自动添加table1 Details Group 问题 如何更改组的顺序或在右侧添加新组table1 De
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • SQL Server 查询结果集的大小

    SQL Server 中是否有确定结果集中 Mgmt Studio 查询中返回的数据大小 以 MEGS 为单位 您可以打开客户端统计信息 查询菜单 包括客户端统计信息 它给出执行查询时从服务器返回的字节数
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • SQL Server Express 到 .mdf 文件的连接

    两部分问题 我使用 VS 2015 Update 3 创建了一个 ASP NET MVC 5 应用程序 我在本地计算机上完成了该项目 突然 我无法再通过 SQL Server 对象资源管理器连接到 mdf数据库文件并出现以下错误 无法打开数
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A
  • 案例陈述以确定我是否应该结合

    我目前想做某种条件联合 给出以下示例 SELECT age name FROM users UNION SELECT 25 AS age Betty AS name 假设我只想在 用户 计数 gt 2 时合并第二个语句 否则不合并两者 总之
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • 通过将行旋转为动态数量的列来在 MySQL 中创建摘要视图

    我在 MySQL 中有一个表 其中包含以下字段 id company name year state 同一客户和年份有多行 以下是数据示例 id company name year state 1 companyA 2008 1 2 com

随机推荐

  • iPhone Dev:UIWebView baseUrl 到文档文件夹中的资源而不是应用程序包

    问候 任何人都可以帮助我找到解决以下问题的方法 将 html 加载到UIWeb视图 using 加载HTML字符串并包括 使用baseURL 资源 例如 CSS 用户文件夹中的图像文件文件目录 和不是来自 MainBundle的应用程序 我
  • 如何在Golang中间件中读取请求体两次?

    在中间件中 我想读取请求正文来执行一些检查 然后 请求被传递到下一个中 间件 其中主体将被再次读取 这就是我所做的 bodyBytes ioutil ReadAll req Body req Body ioutil NopCloser by
  • Facebook 点赞计数在 301 重定向后重置

    我的网站上有一篇文章发布在错误的类别中 我想更改类别 并且由于类别名称是 url 的一部分 因此我向更新后的 url 添加了 301 重定向 那篇文章也有几个赞 但在 301 之后 它被重置为 0 个赞 因为对于 Facebook 来说 这
  • Nuxt3 Vite服务器端口

    我需要为 Nuxt3 配置服务器端口 我尝试这样做 nuxt config ts import defineNuxtConfig from nuxt3 export default defineNuxtConfig vite server
  • 使用 PowerShell 从文本文件中提取列

    我必须从本文中解释的文本文件中提取列 使用 Perl 单行从文本文件中提取列 类似于 Unix cut https stackoverflow com questions 2499746 extracting columns from te
  • Magento,将产品名称传递给联系表单

    Magento 初学者您好 我对术语和名称的了解很差 但我会尽力尽可能清楚地解释这一点 我目前正在配置 Magento 联系表单 以便能够从用户那里收集一些数据产品查看页面 更有趣的是 表单还必须发送一些有关管理员将其放置在页面上的产品的数
  • 何时在 iPhone 中释放 NSString

    我有以下方法 NSMutableArray getPaises NSMutableArray paises paises NSMutableArray alloc init while get new row NSString aPais
  • 扫描 BLE 外设并连接到它

    一般来说 对于 BLE 和移动应用程序编码还相当陌生 我尝试了几个演示并遇到了这个https github com RickRedSix BLE4 0 iOS Swift Demo https github com RickRedSix B
  • MongoDb Pipeline Aggregation排序子子文档

    当尝试使用 MongooseJs 在 Mongodb 中按嵌套数组进行排序时 我遇到了一个小问题 a 一个产品包含任务 每个任务又包含子任务 b 任务有一个顺序 每个子任务也有顺序 task order 和 task subtask ord
  • 使用 Javascript 将用户发送至浏览器主页

    是否可以使用 Javascript 获取浏览器的主页 我想在页面上放置一个链接 该链接可以转到浏览器中设置的主页 编辑 简化答案 识别浏览器并 调用window home 适用于所有浏览器 调用window location href 关于
  • Left_join:错误:无法分配大小为“小”Mb 的向量

    我正在处理相当大的数据框 其中一个极端的数据框包含大约 300 000 行和 1 500 个变量 因此 在处理这些数据帧时 我有时会收到错误 Error cannot allocate vector of size x x Gb 大多数情况
  • Jquery 解析 XML

    我想使用 JQuery 读取以下 XML Jquery 应读取 XML 并以 HTML 形式显示以下内容 以下所有内容均应链接 News Articles Destinations Epics Tuesday Night Boulderin
  • Spring、事务、Hibernate 过滤器

    我在 Spring 中使用声明式事务 我有一个带有 事务性 注释的服务层 该服务层调用 DAO 我需要在所有 dao 方法中启用 hibernate 过滤器 我不想每次都显式调用 session enablefilter 那么有没有一种方法
  • long <-> str 二进制转换

    是否有任何库可以将很长的数字转换为字符串 只需复制数据 这些单行代码太慢了 def xlong s return sum ord c lt lt e 8 for e c in enumerate s def xstr x return ch
  • 我可以使用哪些 Solr 分词器和过滤器来进行强大的常规站点搜索?

    我想确保搜索 比如说 I B M 可以通过搜索找到ibm 我还想确保Dismemberment Plan可以通过搜索找到dismember 使用 Solr 我可以在分析和查询时使用什么标记器和过滤器来允许两种结果 对于 IBM gt ibm
  • R、ggplot - 共享相同 y 轴但具有不同 x 轴刻度的图表

    Context 我有一些数据集 变量 我想绘制它们 但我想以紧凑的方式做到这一点 为此 我希望它们共享相同的 y 轴但不同的 x 轴 并且由于分布不同 我希望其中一个 x 轴进行对数缩放 另一个进行线性缩放 Example 假设我有一个长尾
  • 在展会上与 React Native 立即通话

    我正在尝试在没有中间件对话框的情况下立即发起电话呼叫 我用过Linking openUrl 但它不起作用 react native immediate phone call 可以做到这一点 但它需要链接 这是不可能的expo 我能做些什么
  • 在 Visual Studio 2019 中更改 C# 版本

    我正在使用 Visual Studio 2019 我正在尝试更改我的 C 版本 我这样做的原因是我使用的构建服务器使用旧版本的 VS MSBuild 来构建和部署代码 这是我无法控制的 因此我需要使用 C 5 在 Visual Studio
  • 在 Pandas 中使用窗口进行动态离群值检测

    我想实现离群值检测 它将使用一个窗口来检查下一个元素是否是离群值 假设我们在 pd Series 上使用长度为 3 的窗口 如下所示 0 1 2 3 4 我会计算 0 1 2 上的中位数和疯狂值 或平均值和标准差 并检查 3 是否为异常值
  • 为什么非聚集索引扫描比聚集索引扫描更快?

    据我所知 堆表是没有聚集索引的表 没有物理顺序 我有一个包含 120k 行的堆表 扫描 我正在使用此选择 SELECT id FROM scan 如果我为 id 列创建非聚集索引 我得到223 物理读取 如果我删除非聚集索引并更改表以使 i