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

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(使用前将#替换为@)

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

  • Apache Cassandra 中的复合索引

    我正在尝试设置一个 cassandra 列族 其中一些列上有二级索引 在读回数据时我需要进行过滤 在我最初的测试中 当我一起使用多个索引时 速度会变慢 这是我当前的配置方式 通过 cassandra cli update column fa
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • sql查询将两列与一列连接起来

    我在 MS Access 2010 中有 2 个表 如下所示 USERS u id u name LOAN l id l from ref users u id l to ref users u id l amount Users u id
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 使用 MS Access 获取行的第一个实例

    EDITED 我有这个查询 我想SELECT表中记录的第一个实例petTable SELECT id pet ID FIRST petName First Description FROM petTable GROUP BY pet ID
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 根据表sql中的行替换字符串中的字符

    我需要用一些映射的字符替换字符串中的字符列表 我有一个表 dbo CharacterMappings 有 2 列 CharacterToFilter 和 ReplacementCharacter 假设这个表中有3条记录 Filter Rep
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • SQL Server,插入 Excel“链接服务器”时出现“无效列名”错误

    我有一个简单的 Excel 电子表格文档 运行 Office 2013 我使用 Microsoft Office 15 0 Access 数据库引擎 OLE DB 提供程序 将其用作数据库 我可以使用 MS SQL Server Manag
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm

随机推荐

  • 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