我试图弄清楚为什么当目标表是空白表时插入目标表时正在执行逻辑读取。我有下表。
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个逻辑读取。当我删除索引时,这些逻辑读取不再发生,然后当我读取 - 添加完全相同的索引时,逻辑读取也不再发生。当我将索引保留在表上时,逻辑读取会再次开始。
为什么会这样?
答案 0 :(得分:3)
通常,在未最小化记录插入时,会报告目标表的逻辑读取。
这些逻辑读取与在现有结构中查找添加新行的位置相关联。最小记录的插入使用批量加载机制,它分配全新的页面/范围(因此不需要以相同的方式读取目标结构)。
插入到b树时看到的变化可能取决于优化器是否决定将行排序为索引键顺序(插入运算符属性DMLRequestSort = true
),如果目标可以启用最少日志记录的插入表格为空,或者如果启用了trace flag 610。