问题标签 [covering-index]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1065 浏览

sql-server-2008 - 我可以在 SQL Server 2008 中创建“覆盖、空间”索引吗?

我目前有一个站点,其中包含一个包含 Lat/Long 浮点列的表,以及这 2 列以及我需要检索的另一列的索引。

我一直在查询这个表以获取从某个点开始落在一个半径内的行(我实际上是为了速度而得到一个正方形),但我只需要已经索引的字段,所以这个索引实际上是覆盖,而执行计划只有两个步骤:

现在,我正在尝试利用 SQL 2008 的空间特性。我已经创建了 Geography 列,填充了它,创建了空间索引,工作正常。

一切正常,除了执行计划有一百万个步骤,74% 的时间花在聚集索引搜索上,它将在空间索引中找到的行连接到实际表中,以获取其余的数据...
(空间索引搜索占执行计划成本的 1%)

因此,显然,它正在适当地使用空间索引,并且通过 Lat/Long 上的“常规”索引比以前更快地找到我需要的记录,但是加入主表是在杀死我,空间查询需要 7 倍只要是我的旧的。

有没有办法向空间索引添加更多列,以便它可以覆盖并且可以一步完成,就像以前一样?
我还能做些什么来改善这种情况吗?


更新:我发现“常规”索引可以使用 INCLUDE 关键字“包含”其他列(我不知道,我曾经只是将列包含在索引本身中)
根据此处的文档,该子句不是空间索引的一个选项......有什么想法吗?

谢谢!
丹尼尔

0 投票
5 回答
143 浏览

sql - 覆盖指数是否可以安全地替代较小的覆盖指数?

例如:

IX_A 可以安全地删除,因为它是多余的:将使用 IX_AB 代替它。我想知道这是否概括:

如果我有:

等等,

较小的索引仍然可以安全地删除吗?也就是说,IX_ABC 是否使 IX_AB 变得多余,而 IX_ABCD 是否使 IX_AB 和 IX_ABC 都变得多余?

0 投票
2 回答
133 浏览

database - 有哪些方法可以识别覆盖索引中不必要的列?

有哪些方法可以识别覆盖索引中的多余列:从不搜索的列,因此可以提取到包含中,甚至完全删除而不影响索引的适用性?

0 投票
2 回答
197 浏览

sql-server-2008 - 覆盖索引是否会重复数据?

假设我们有这个索引

这是否意味着我们将在索引页面和实际数据页面中都有 c2 ?真正的问题是 - 更新 c2 是否意味着 SQL Server 必须更新 IX_test 和实际数据行(聚集索引)?

0 投票
2 回答
167 浏览

sql-server - 当额外的列由聚集索引唯一确定时覆盖索引

假设我需要从 luTab 更新 myTab 如下

luTab 由 2 列组成(idLookup(unique)、LookupValue)

哪个更可取:idLookup 上的唯一聚集索引,还是 idLookup 和 Lookupvalue 上的唯一聚集索引?在这种情况下,覆盖指数会有所作为吗?

(我最感兴趣的是 SQL 服务器)


结语:

我在下面的 Krips 测试中跟进了 myTab 中的 2700 万行,luTab 中的 150 万行。关键部分似乎是索引的唯一性。如果索引指定为唯一,则更新使用哈希表。如果未将其指定为唯一,则更新首先通过 idLookup(流聚合)聚合 luTab,然后使用嵌套循环。这要慢得多。当我使用扩展索引时,SQL 现在不再假定 LookupValue 是唯一的,因此它强制使用慢得多的流聚合嵌套循环路由

0 投票
3 回答
3595 浏览

sql - 为什么在 SQL 索引中使用 INCLUDE

我最近在我维护的数据库中遇到了一个索引,其格式如下:

在这种特殊情况下,我遇到的性能问题(对 Id 和 SubId 的缓慢 SELECT 过滤)可以通过简单地将 SubId 列移动到适当的索引中而不是作为包含列来解决。

然而,这让我想到,我根本不理解包含列背后的原因,一般来说,它们可能只是索引本身的一部分。即使我并不特别关心索引本身中的项目,在索引中包含列而不是简单地包含在内有任何不利之处。

经过一些研究,我知道对于可以进入索引列的内容有许多限制(索引的最大宽度,以及某些无法索引的列类型,如“图像”)。在这些情况下,我可以看到您将被迫在索引页数据中包含该列。

我唯一能想到的是,如果 SubId 有更新,如果包含列,则不需要重新定位行(尽管需要更改索引中的值)。还有什么我想念的吗?

我正在考虑浏览数据库中的其他索引,并在可能的情况下适当地移动索引中包含的列。这会是一个错误吗?

我主要对 MS SQL Server 感兴趣,但也欢迎提供有关其他数据库引擎的信息。

0 投票
2 回答
319 浏览

mysql - 复合索引在 MySQL 中有方向吗?

何时需要以下内容:

0 投票
1 回答
888 浏览

mysql - 查询在适用时不使用覆盖索引

我已经下载了员工数据库并执行了一些查询以进行基准测试。
然后我注意到一个查询没有使用覆盖索引,尽管我之前创建了一个相应的索引。只有当我向FORCE INDEX查询添加子句时,它才使用覆盖索引
我上传了两个文件,一个是执行的 SQL 查询,另一个是结果
你能说出为什么查询只在FORCE INDEX添加子句时才使用覆盖索引吗?EXPLAIN 表明在这两种情况下,dept_no_from_date_idx无论如何都在使用索引。

为了让自己适应 SO 的标准,我这里也写下这两个文件的内容:

SQL 查询:

结果:


编辑:
我注意到最后两个查询之间存在相当大的执行速度差异,结果放在您面前:

但是,如果我改变执行顺序(使最后一个查询首先执行,第一个查询最后执行),那么执行速度是一样的:

不可能是从缓存中获取第二个查询,因为 SQL_NO_CACHE 写入两个查询中。那么为什么在第一个示例中,第一个查询花费了 0.31 秒,第二个查询花费了 0.06 秒,但在第二个示例中,两个查询都花费了 0.08 秒?

Edit2:
我认为执行速度差异源于操作系统缓存和其他因素。当重复执行上述 2 个查询时,执行时间差异可以忽略不计。我重复执行上述 2 个查询 3 次,得到以下结果:

0 投票
1 回答
1398 浏览

database - 覆盖索引与聚集索引(数据库索引)

我正在研究一个数据库系统和它的索引,但是我很难看到覆盖索引和聚集索引之间的明显区别。

我已经用谷歌搜索了我的方式,但没有得到明确的答案:

  1. 两种索引有什么区别
  2. 什么时候使用覆盖索引,什么时候使用聚集索引。

我希望有人可以用几乎像孩子一样的回答向我解释:-)

真诚的梅斯蒂卡

顺便说一句,我使用的是 IBM DB2 9.7 版

0 投票
1 回答
52 浏览

db2 - 关于在数据库中获得插入和更新的索引的问题

我有一个问题,关于每个月对表的索引增益与索引查询增益之间的细线问题。

情况是,我有两个表,Table1Table2。每个表每个月都会缓慢但有规律地增长(Table1大约有 100 行新行, Table2有几行)。

我的具体问题是是否有索引或删除它。我做了一些测量,表 2 上的覆盖索引改进了我的 SELECT 查询和一些相当多的但同样,我必须考虑利弊,但很难做出决定。

对于Table1,可能不需要索引,因为那里的 SELECT 查询并不常见。

对于什么是好的解决方案,我将不胜感激任何建议、提示或只是好的建议。顺便说一句,我使用 IBM DB2 9.7 版作为我的数据库系统

真挚地

梅斯蒂卡