4. 跟蹤標記 (Trace Flag) 610 對索引組織表(IOT)最小化日誌

来源:http://www.cnblogs.com/seusoftware/archive/2017/11/30/7929573.html
-Advertisement-
Play Games

跟蹤標記:610 功能: 用批量導入操作(Bulk Import Operations)載入數據時,對於索引組織表(即有聚集索引的表) 最小化日誌; 上圖為simple/bulk-logged恢復模式下,最小化日誌的幾種操作,其中包含了批量導入操作,而批量導入操作的最小化日誌有一些前提條件,概括如下 ...


跟蹤標記: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)

https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql

 

The Data Loading Performance Guide

https://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 同源策略 同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。 同源策略,它是由Netscape提出的一個著名的安全策略。現在 ...
  • 1 USE [Test] 2 GO 3 SET ANSI_NULLS ON 4 GO 5 SET QUOTED_IDENTIFIER ON 6 GO 7 --@column 表示欄位或者常量,@paddingChar 表示 補位字元, @len 補位數量, @returnStr 8 create f... ...
  • OLAP也稱決策支持系統(Decision Support System,DSS),是數據倉庫系統的主要應用形式,使分析人員、管理人員或執行人員能夠從多種角度對從原始數據中轉化出來的、能夠真正為用戶所理解的、並真實反映企業維特性的信息進行快速、一致、交互地存取,從而獲得對數據的更深入瞭解的一類軟體技... ...
  • 北京賽車的玩法豐富多樣,但其實都是很簡單,只要用心理解。根本不成問題多看走勢圖,不是看一兩次。而是每天抽空閑的時間去留意。方便藉助參考。懂得看走勢會操作的讓人才能在彩界如水的魚。如果你不行,並不代表我不行。給你自己一個機會。只要你敢跟我,我絕對會讓你今天所做出的決定而感到欣慰,我沒有華麗的語言一切靠 ...
  • 原公司用的資料庫是Oracle和MySQL居多,寫的SQL語句也比較少,有些生疏了。現在的公司使用的DB2資料庫,完全沒接觸過,導致一些函數的使用要在網上搜索案例,現在總結一點DB2的函數使用方法。 正確需求:查詢出指定日期的工作日,頁面傳一個天數,並返回一個新的日期。 下麵是時間表欄位: 剛開始項 ...
  • 表名:products 欄位:product_id、product_name、product_price、vend_id(供應商) 12.1聚集函數: 我們常常需要彙總數據,而不是把數據檢索出來,MySQL提供了專門的函數。 檢索例子: 確定表中行數 獲得表中行組的和 找出表列 MySQL提供了5個 ...
  • 一、kafka安裝(集群模式) 1、安裝前準備 機器:10.199.240.232,10.199.206.20 kafka版本:2.12-0.10.1.1 下載地址; https://mirrors.tuna.tsinghua.edu.cn/apache/ 相關目錄: /apps/svr/kafka ...
  • 經過一段時間的學習,對於Hadoop有了一些瞭解,於是決定用MapReduce實現PageRank演算法,以下簡稱PR 先簡單介紹一下PR演算法(摘自百度百科:https://baike.baidu.com/item/google%20pagerank/2465380?fr=aladdin&fromid ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...