我想执行下一个删除查询:
delete from MyTable where userId = 5
下面索引的内容在此查询中会有更好的效果,还是它们都会执行相同的操作?
这里提到的所有字段都是BigInt
CREATE INDEX MyTable_UserId_UserBalance_index ON Main.dbo.MyTable (UserId, UserBalance);
CREATE INDEX MyTable_UserId_index ON Main.dbo.MyTable (UserId);
答案 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频繁查询您的表,那么最好创建一个包含两列的索引。
再次,确保最有效利用哪一列。