一列索引vs 2列索引

时间:2017-08-30 15:01:48

标签: sql sql-server tsql

我想执行下一个删除查询:

delete from MyTable where userId = 5

下面索引的内容在此查询中会有更好的效果,还是它们都会执行相同的操作?

这里提到的所有字段都是BigInt

  1. CREATE INDEX MyTable_UserId_UserBalance_index ON Main.dbo.MyTable (UserId, UserBalance);
  2. CREATE INDEX MyTable_UserId_index ON Main.dbo.MyTable (UserId);

4 个答案:

答案 0 :(得分:2)

对于该特定查询,它们应该执行大致相同的操作。由于您正在查找复合索引中的第一个项目,因此查找记录应该与单个列上有另一个索引相同。

答案 1 :(得分:1)

我对这里的许多答案感到惊讶 - 为了删除,使用其中任何一个都不会 任何 的好处索引超过另一个。如果记录存在于任一索引中,则您需要找到并删除它。

索引的目的是读取而不是删除数据。如果你正在尝试读取数据,你会问一个像这样的问题,因为一个索引有可能比另一个索引更快地返回数据。对于删除,您需要从所有索引中删除,包括NC索引。

似乎需要对索引世界进行一些启示。

  

来自知名DBA的一些优秀(免费)文档 - Brent Ozar:https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free-open-source/

答案 2 :(得分:0)

CREATE INDEX MyTable_UserId_index ON Main.dbo.MyTable (UserId);

答案 3 :(得分:0)

除非针对下面的索引反转订单,否则两个索引都将以相同的方式工作。

自:

CREATE INDEX MyTable_UserId_UserBalance_index ON Main.dbo.MyTable (UserId, UserBalance);

要:

CREATE INDEX MyTable_UserId_UserBalance_index ON Main.dbo.MyTable (UserBalance, UserId);

在第二种情况下,服务器可能看不到此索引有用,因为UserId处于第二级。

另外,为什么要创建两个具有相同列的索引?如果您知道将使用UserId和UserBalance频繁查询您的表,那么最好创建一个包含两列的索引。

再次,确保最有效利用哪一列。