我试图弄清楚为什么在目标表是空白表时插入目标表时要对其执行逻辑读取。我有下表。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Employee](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EmployeeID] [int] NOT NULL,
[EmployeeName] [varchar](50) NOT NULL
) ON [FG_Test]
GO
SET ANSI_PADDING OFF
GO
这是一个空白表,ID 为主键,该 ID 上有聚集索引。当我使用以下插入语句时
TRUNCATE TABLE [dbo].[Employee];
INSERT INTO [dbo].[Employee] WITH (TABLOCK) (EmployeeID, EmployeeName)
(
SELECT EmployeeID,
EmployeeName
FROM Process.Employee
);
根据设置“Statistics IO ON”,我在 dbo.Employee 表上获得了 1596236 次逻辑读取。当我删除索引时,这些逻辑读取不再发生,然后当我读取添加完全相同的索引时,逻辑读取也不再发生。当我将索引保留在表上时,逻辑读取会及时重新开始。
为什么会这样?
最佳答案
通常,当插入未最小记录时,会报告目标表的逻辑读取。
这些逻辑读取与在现有结构中查找位置以添加新行相关。最少日志记录的插入使用批量加载机制,该机制分配全新的页面/范围(因此不需要以相同的方式读取目标结构)。
插入到 B 树时看到的变化可能取决于优化器是否决定按索引键顺序对行进行排序(插入运算符属性 DMLRequestSort = true
),这可以最小程度地启用 -如果目标表为空,或者 trace flag 610,则记录插入已启用。
关于sql - 插入空目标表时进行逻辑读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24061253/