sql - 插入空目标表时进行逻辑读取

标签 sql sql-server sql-server-2008 ssms

我试图弄清楚为什么在目标表是空白表时插入目标表时要对其执行逻辑读取。我有下表。

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/

相关文章:

mysql - 使用 count(*) 和 inner join 时查询速度慢

sql - 动态 SQL 或 WITH 子句

SQL 查找查询结果的大小

c# - 如何在 asp.net c# 中使用 HashSet 比较两个数据集

sql-server-2008 - 从 sql server 导入表时 sqoop 挂起

php - 使用 PHP 访问数组元素

mysql - 将两个查询变成一个

sql-server - SQL Server 中多列非聚集索引中的列顺序重要吗?

sql-server - 数据库触发器

sql - 将特定的有界数插入SQL Server中的列