如果A、B、C上有索引,A、B上的索引是否多余?

2024-04-14

拥有多年的 DBA 经验,我确实相信我知道问题的答案,但我认为检查一下我的基础总没有坏处。

使用 SQL Server,假设我有一个在列上有索引的表A和列B,以及列上的第二个索引A, B, and C,删除第一个索引是否安全,因为第二个索引基本上可以满足从第一个索引中受益的查询?


这取决于情况,但答案通常是“是的,您可以将索引放在 (A,B) 上”。

反情况(您不会删除 (A,B) 上的索引)是当 (A,B) 上的索引是强制执行约束的唯一索引时;那么您不想删除 (A,B) 上的索引。 (A,B,C) 上的索引也可以是唯一的,但唯一性是多余的,因为 (A,B) 组合由于另一个索引而唯一。

但在没有这种异常情况的情况下(例如,如果 (A,B) 和 (A,B,C) 都允许重复条目),则 (A,B) 索引在逻辑上是冗余的。但是,如果列 C 是“宽”的(可能是 CHAR(100) 列),而 A 和 B 很小(例如 INTEGER),则 (A,B) 索引比 (A,B,C ) 索引,因为您可以从 (A,B) 索引的每页读取更多信息。因此,尽管 (A,B) 是多余的,但它可能值得保留。您还需要考虑表格的波动性;如果表很少改变,额外的索引就没有多大关系;如果表变化很大,额外的索引会减慢对表的修改。这是否重要很难猜测。您可能需要进行性能测量。

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

如果A、B、C上有索引,A、B上的索引是否多余? 的相关文章

  • 尝试使用 Redshift SQL 对累积不同实体进行计数

    我正在尝试获取某个时间序列中 Redshift 中不同对象的累积计数 最简单的事情就是使用COUNT DISTINCT myfield OVER ORDER BY timefield DESC ROWS UNBOUNDED PRECEDIN
  • 实体框架中的级联更新

    我有以下涉及 2 个类的场景 public class Parent Key public int Id get set Other properties here public virtual IList
  • Mysql使用tenant_id进行复合索引

    我们有一个多租户应用程序 该应用程序有一个包含 129 个字段的表 这些字段都可以在 WHERE 和 ORDER BY 子句中使用 我花了 5 天的时间试图找出最适合我们的索引策略 我获得了很多知识 但我仍然有一些问题 1 创建索引时 我应
  • 如何找到具有特定字符串但不在注释中的代码

    我试图在 1 000 个存储过程和函数中搜索特定字符串 在本例中为电子邮件地址 但当它位于注释块中时我想忽略它 这是查找对象的 SQL 语法 但有数百个结果 我不想遍历每个结果来确定电子邮件地址是在代码中使用还是仅在注释块中使用 SELEC
  • T-SQL 中的 raiserror 中的 Severity 和 State 在实际中如何使用?

    We use RAISERROR在 SQL Server 中 语法是RAISERROR Some Message 16 1 参数值有什么用16 and 1 with RAISERROR 在我的例子中 我上网查了一下 发现这些参数叫Sever
  • 将上一行值减去当前行

    我有下表 id value acc no 1 12 1 2 14 1 3 15 1 4 10 2 5 16 2 6 19 1 7 7 3 8 24 2 预期产出 id value acc no result 1 12 1 12 curren
  • 将 SQL 依赖关系与 Azure 结合使用

    在我的本地数据库中 Sql 依赖关系工作正常 但是当我迁移到 Azure 数据库时 它就不起作用了 我检查服务代理是否已启用 并且它已激活 这是错误 此版本的 SQL Server 不支持语句 RECEIVE MSG 这是我的代码 publ
  • 插入到表中并在 SQL 中拆分字符串

    我想将分割字符串插入到我的表中 如您所见 create table Organization organizationId bigint provienceId bigint CityId bigint TownId bigint Inse
  • 如何在codeigniter中从数据库返回最后一条记录?

    我正在尝试获取我拥有数据的最后日期 所以我想打印 date data 列中的最后一个日期 在模型中 public function last record query this gt db gt select LAST date data
  • 使用动态 SQL 检索表结构

    我正在迁移数据库 并尝试将表结构信息检索到单个行项目中以进行机器处理 由于技术原因 现有的迁移工具无法使用 必须采用这种方式处理 我已在多个表上成功运行以下查询 SELECT LISTAGG column name data type da
  • SQL Server 2008:在没有任何锁的情况下出现死锁

    我目前正在 SQL Server 2008 数据库上进行一些实验 更具体地说 我有一个 JDBC 应用程序 它使用数百个并发线程来执行数千个任务 每个任务都在数据库上运行以下查询 UPDATE from Table A where rowI
  • 我如何(或可以)在多个列上选择 DISTINCT?

    我需要从表中检索所有行 其中两列的组合都不同 因此 我希望同一天没有任何其他销售的所有销售都以相同的价格进行 基于日期和价格的唯一销售将更新为活动状态 所以我在想 UPDATE sales SET status ACTIVE WHERE i
  • 如何使用 CodeIgniter 计算 MySQL 中给定行之前的行数?

    简单来说 如何计算某一行之前有多少行 我使用的是增量 ID 但行是随机删除的 因此仅检查 ID 是行不通的 比如说 如果我有 30 行 并且我根据名称 或任何实际内容 选择了一行 那么在该行之前有多少行 它可以是 16 1 12 或任何值
  • C# 和 .NET 的“最佳”数据访问框架/方法是什么?

    编辑 我将其设为社区维基 因为它更适合协作格式 有多种方法可以从 NET 访问 SQL Server 和其他数据库 一切都有其优点和缺点 这永远不会是一个简单的问题 哪个是 最好的 答案永远是 这取决于 然而 我正在寻找在不同级别的系统背景
  • ORA-00972 标识符别名列名太长

    我有一个查询 例如 SELECT column as averyveryveryverylongalias more than 30 characters FROM Table name 它返回错误ORA 00972 标识符太长 有什么技巧
  • 使用 Pyodbc + UnixODBC + FreeTDS 设置连接设置

    我使用 Pyodbc UnixODBC 和 FreeTDS 进行了设置 但在其中的某个地方设置了一些选项 但我不知道在哪里 根据 SQL Server Management Studio 我的程序在打开连接时发送一些设置 set quote
  • 将 YYYYMMDD 字符串转换为 Snowflake 中的 YYYY-MM-DD 日期格式

    基于雪花中提到的示例文档 https docs snowflake com en sql reference functions to date html 为什么仅通过更改 ORDER BY 子句 日期和时间戳值就会返回不同的值 另外 我正
  • 如何使用带有 IF EXISTS 子查询的 SQL Select 语句?

    如何使用 IF EXISTS 语句 SQL Server 从子查询中选择布尔值 它应该是这样的 SELECT TABLE1 Id NewFiled IF EXISTS SELECT Id FROM TABLE2 WHERE TABLE2 I
  • 显示 Presto 中所有模式的表

    急速 SHOW SCHEMAS 返回所有模式 SHOW TABLES FROM foo 返回 foo 模式的所有表 有没有一种简单的方法可以从 Presto 中的所有模式返回表 您可以使用select table schema table
  • 如何找到与日期范围最重叠的时间段

    假设您有一个包含标识符 开始时间和结束时间的表 这些开始和结束时间可以是任意时间长度 开始时间始终早于结束时间 假设没有空值 什么样的查询会告诉我最 流行 的时间 即每行中的两个范围与大多数其他行重叠的位置 它的实际应用是它是一个记录用户登

随机推荐