4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
跟踪标记:610
功能:
- 用批量导入操作(Bulk Import Operations)加载数据时,对于索引组织表(即有聚集索引的表) 最小化日志;

上图为simple/bulk-logged恢复模式下,最小化日志的几种操作,其中包含了批量导入操作,而批量导入操作的最小化日志有一些前提条件,概括如下:
1. 目标表未用于复制;
2. 目标表上指定了TABLOCK;
3. 目标表上的索引情况,这条规则最复杂,见下表:

从表格可以看出:
(1) 堆表的数据页一直可以最小化日志;
(2) 聚集索引和非聚集索引,一直是完全记录日志的,除了在空表的情况下(即索引也是空的),第一个批次(batch)导入的数据可以最小化日志,从第二个批次(batch)起就不再是最小化日志,原因就是第一个批次(batch)结束后,就不再是空表了,跟踪标记610也正是因为这个而出现;
用途:
- 提升索引组织表(即有聚集索引的表)批量导入操作的性能;
备注:
(1) 从SQL Server 2008 开始,引入了跟踪标记610;
(2) 从SQL Server 2016开始,跟踪标记610所具备的功能,已经被数据库引擎所默认,不需要再额外手动开启跟踪标记 (同样的,也就没有开关去关闭) ;
测试:观察[Log Record Length]这列的变化和区别
-- Set Recover model to SIMPLE/BULK_LOGGED
ALTER DATABASE testing SET RECOVERY SIMPLE; /**************************START of CREATE TEST TABLES******************************/
USE testing
GO IF OBJECT_ID('SrcHeap') IS NOT NULL
DROP TABLE SrcHeap; IF OBJECT_ID('TarHeap') IS NOT NULL
DROP TABLE TarHeap; IF OBJECT_ID('TarTable') IS NOT NULL
DROP TABLE TarTable; CREATE TABLE SrcHeap (col1 INT ,col2 CHAR(4000),col3 CHAR(1000) ) ; CREATE TABLE TarHeap( col1 INT ,col2 CHAR(4000),col3 CHAR(1000) ) ; CREATE TABLE TarTable (col1 INT ,col2 CHAR(4000),col3 CHAR(1000) );
create clustered index IX_01 on TarTable(col1); --Insert row into source table
WITH Nums (col)
AS
(
SELECT 1 col
UNION ALL
SELECT col + 1 FROM Nums
WHERE col+1 <= 10000
)
INSERT INTO SrcHeap(col1,col2,col3)
SELECT col,replicate('A',4000),replicate('B',1000) FROM Nums
OPTION (MAXRECURSION 10000)
/**************************END of CREATE TEST TABLES******************************/ /**************************START of HEAP testing******************************/
--Insert rows to Target Table with (TABLOCK) Minimally logged
INSERT INTO TarHeap WITH(TABLOCK)
SELECT * FROM SrcHeap -- Check Log Entries
SELECT TOP 10 operation [MINIMALLY LOGGED OPERATION],context, [log record fixed length], [log record length], AllocUnitId, AllocUnitName
FROM fn_dblog(null, null)
WHERE allocunitname='dbo.TarHeap'
ORDER BY [Log Record Length] DESC;
--Note That [Log Record length] is small --Insert rows to Target Table without (TABLOCK) fully logged
INSERT INTO TarHeap
SELECT * FROM SrcHeap WITH(NOLOCK); -- Check Log Entries
SELECT TOP 10 operation [FULLY LOGGED OPERATION],context, [log record fixed length], [log record length], AllocUnitId, AllocUnitName
FROM fn_dblog(null, null)
WHERE allocunitname='dbo.TarHeap'
ORDER BY [Log Record Length] DESC;
--Note That [Log Record length] is big
/**************************END of HEAP testing******************************/ /**************************START of INDEXED TABLES testing WITHOUT 610******************************/
--Insert rows to Target Table with clustered index and trace flag 610 off
--Fully logged from second batch --First Batch
INSERT INTO TarTable WITH(TABLOCK)
SELECT * FROM SrcHeap WITH(NOLOCK); CHECKPOINT;
--first batch with or without 610
select *
FROM fn_dblog(null, null)
WHERE allocunitname LIKE '%TarTable%' --4582 rows
and operation = 'LOP_INSERT_ROWS'--0 rows --Second Batch
INSERT INTO TarTable WITH(TABLOCK)
SELECT col1+10000,col2,col3 FROM SrcHeap WITH(NOLOCK); CHECKPOINT
--from second batch without 610, tested twice
SELECT *
FROM fn_dblog(null, null)
WHERE allocunitname LIKE '%TarTable%' --114308 rows, 114293 rows
and operation = 'LOP_INSERT_ROWS'--20090 rows, 20088 rows
and (context = 'LCX_CLUSTERED' --10000 rows (actual rows)
or
context = 'LCX_INDEX_INTERIOR' --44 rows (description)
)
ORDER BY [Log Record Length] DESC
/**************************END of INDEXED TABLES testing WITHOUT 610******************************/ CHECKPOINT;
GO
DBCC TRACEON(610);
TRUNCATE TABLE TarTable;
GO /**************************START of INDEXED TABLES testing WITH 610******************************/
--Insert rows to Target Table with clustered index and trace flag 610 on
--Minimally logged for all batches
--with 610 enables + with TABLOCK, the first bath logged less than second batch
--with 610 enables + without TABLOCK, the first batch processes as same as begining with second batch
INSERT INTO TarTable --WITH(TABLOCK)
SELECT * FROM SrcHeap WITH(NOLOCK); INSERT INTO TarTable --WITH(TABLOCK)
SELECT col1+10000,col2,col3 FROM SrcHeap WITH(NOLOCK); CHECKPOINT
--from second batch with 610
SELECT *
FROM fn_dblog(null, null)
WHERE allocunitname LIKE '%TarTable%' --54995 rows
and operation = 'LOP_INSERT_ROWS'--10090 rows
and (context = 'LCX_CLUSTERED' --0 rows (autual rows)
or
context = 'LCX_INDEX_INTERIOR' --44 rows (description)
)
ORDER BY [Log Record Length] DESC
/**************************END of INDEXED TABLES testing WITH 610******************************/ DBCC TRACEOFF(610)
DBCC TRACESTATUS(-1)
小结:
(1) 条件允许情况下,批量导入操作还是跑在堆表上性能最佳;
(2) 跟踪标记610被开启后,对于聚集索引,只有新分配的数据页才会最小化日志,数据插入已有数据页,仍然是fully logged,所以建表时还得考虑聚集索引键的选择;
(3) 跟踪标记610被开启后,对于非聚集索引,并不一定可以最小化日志,这取决于查询优化器对执行计划的选择;
(4) 跟踪标记610被开启后,对于堆表,仍然要指定TABLOCK;对于索引组织表,可不指定TABLOCK,也仍然可以最小化日志,每个批次(batch)最小化日志方式一致;
参考:
Operations That Can Be Minimally Logged
https://technet.microsoft.com/en-us/library/ms191244(v=sql.105).aspx
Prerequisites for Minimal Logging in Bulk Import
https://technet.microsoft.com/en-us/library/ms190422(v=sql.105).aspx
DBCC TRACEON - Trace Flags (Transact-SQL)
The Data Loading Performance Guide
https://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx
4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志的更多相关文章
- 0. 跟踪标记 (Trace Flag) 简介
一. 什么是跟踪标记 SQL Server 跟踪标记(Trace Flag),像是一个开关,可用来自定义SQL Server的某种行为或特性,在性能诊断,系统调试等方面较为常用.比如:开启1204或1 ...
- 1. 跟踪标记 (Trace Flag) 1117, 1118 文件增长及空间分配方式
跟踪标记:1117 功能: 默认,同一个文件组下的多个文件,如果某个文件没有可用空间,且设置了自动增长,则该文件自动增长,其他文件大小保持不变: 开启后,同一文件组下的多个文件,如果某个文件没有可用空 ...
- 5. 跟踪标记 (Trace Flag) 834, 845 对内存页行为的影响
跟踪标记:834 功能: 在64位的windows环境下,为SQL Server开启这个跟踪标记,那么SQL Server 会使用大页(Large pages)为内存缓冲区(buffer pool)分 ...
- 3. 跟踪标记 (Trace Flag) 1204, 1222 抓取死锁信息
跟踪标记:1204/1222 功能及用途: 捕获SQL Server死锁信息,并自动存放到错误日志(ERRORLOG)中. 举例: USE tempdb GO CREATE TABLE t1(id i ...
- 2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果
跟踪标记:3604 功能: 输出DBCC命令返回结果到查询窗口(通常是SSMS窗口),类似print命令的显示效果: 用途: 常用于获取DBCC IND, DBCC PAGE命令的输出结果,因为这2个 ...
- (5.2.2)配置服务器参数——dbcc跟踪标记(trace)
关键字:跟踪标记,跟踪 [1]常规dbcc命令 dbcc help('?') --查看dbcc 所有命令,常规下只有32个常用的dbcc TRACEON(2588) --指定了2588标记的话,你就可 ...
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)
参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...
- MySQL InnoDB 索引组织表 & 主键作用
InnoDB 索引组织表 一.索引组织表定义 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT). 在Inno ...
- Oracle数据库 查看表是否是 索引组织表的方法
1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...
随机推荐
- 基于FFMPEG的跨平台播放器实现(二)
基于FFMPEG的跨平台播放器实现(二) 上一节讲到了在Android平台下采用FFmpeg+surface组合打造播放器的方法,这一节讲一下Windows平台FFmpeg + D3D.Linux平台 ...
- javascript面向对象的写法及jQuery面向对象的写法
文章由来:jQuery源码学习时的总结 在JS中,一般的面向对象的写法如下: function Cao(){}//定义一个构造函数 Cao.prototype.init = function(){}/ ...
- ELK简介
什么是ELK ELK是ElasticSearch,LogStash以及Kibana三个产品的首字母缩写.是可以和商业产品 Splunk 相媲美开源项目. 2013 年,Logstash 被 Elast ...
- zabbix杂文二
ps1:主要是一些遇到的问题,不一定对所有人都有用... PS2:安装前就一定要去看下官方文档 PS3:安装zabbix的时候会参照这上面的 http://blog.chinaunix.net/uid ...
- CentOS本地yum源配置
现有一台处在局域网的linux服务器,无法ping通外网,本文是关于本地yum源的配置 环境 : CentOS 6.5 一 .挂载CentOS镜像文件 (1) 创建挂载文件夹,若此文件夹已存在可忽略 ...
- 备忘:有MTU值设置不当导致的部分网站无法访问问题
如题,有时候突然weibo.com,webQQ等网站网络连接超时,怎么找也没得原因,今天管理电信的光猫,发现设置的MTU的1400,突然想起之前电脑和路由器上设置的MTU是1500,感觉可能是这个问题 ...
- LINUX 笔记-VIM常用命令整理
1.进入insert模式 o:当前行后 O:当前行前 r:替换当前字符 R:替换当前字符直到ESC 2.删除命令 #dw:删除#个word d^:删除至行尾 d$:删除至行首 3. u:撤消 ctrl ...
- Windows下MongoDB常用命令
以下命令中的启动与暂停服务命令需要使用管理员身份运行cmd.exe,其他命令需要先cd到Mongodb安装目录的bin目录. 1.启动服务:net start [Mongodb服务名].示例: net ...
- LeetCode 163. Missing Ranges (缺失的区间)$
Given a sorted integer array where the range of elements are in the inclusive range [lower, upper], ...
- maven中jetty插件配置
maven中jetty插件的配置,可用于项目在内置jetty服务器中的部署. <plugin> <groupId>org.mortbay.jetty</groupId&g ...