我了解到在SQL Server中添加表索引的一个权衡是为了提高选择查询的性能而增加插入/更新/删除查询的成本。我可以从概念上理解插入操作的过程,因为SQL Server必须将新行的条目写入每个索引,但对于更新和删除操作,我还不太清楚数据库引擎需要做什么。
以DELETE操作为例,假设我有以下模式(请原谅伪SQL):
现在,如果我发布这个语句
我了解引擎更新表格(或者如果您愿意,聚集索引)的必要步骤。索引被设置为使查找要删除的行范围变得容易并执行删除操作。
然而,在这个点上,它还需要更新IX_1,我提供的查询没有明显高效的方法让数据库引擎查找要更新的行。此时它是否被强制执行完整的索引扫描?引擎首先从聚集索引中读取行并生成更智能的内部删除索引吗?
如果我更好地理解底层正在发生的事情,这可能有助于我理解这个问题,但我想我的真正问题是:我的数据库在删除操作上花费了大量时间,我正在尝试找出我可以做些什么。
当我显示删除的执行计划时,它只显示对Foo表的“聚集索引删除”条目,详细信息部分列出了需要更新的其他索引,但我没有得到这些其他索引相对成本的指示。
在这种情况下,它们都是相等的吗?有没有一种方法可以估计删除一个或多个这些索引的影响,而不必实际尝试?
以DELETE操作为例,假设我有以下模式(请原谅伪SQL):
TABLE Foo
col1 int
,col2 int
,col3 int
,col4 int
PRIMARY KEY (col1,col2)
INDEX IX_1
col3
INCLUDE
col4
现在,如果我发布这个语句
DELETE FROM Foo WHERE col1=12 AND col2 > 34
我了解引擎更新表格(或者如果您愿意,聚集索引)的必要步骤。索引被设置为使查找要删除的行范围变得容易并执行删除操作。
然而,在这个点上,它还需要更新IX_1,我提供的查询没有明显高效的方法让数据库引擎查找要更新的行。此时它是否被强制执行完整的索引扫描?引擎首先从聚集索引中读取行并生成更智能的内部删除索引吗?
如果我更好地理解底层正在发生的事情,这可能有助于我理解这个问题,但我想我的真正问题是:我的数据库在删除操作上花费了大量时间,我正在尝试找出我可以做些什么。
当我显示删除的执行计划时,它只显示对Foo表的“聚集索引删除”条目,详细信息部分列出了需要更新的其他索引,但我没有得到这些其他索引相对成本的指示。
在这种情况下,它们都是相等的吗?有没有一种方法可以估计删除一个或多个这些索引的影响,而不必实际尝试?