导数中的最小化日志记录:背景和理论_MySQL
什么是最小化日志(Minimal Logging)?
当数据库的恢复模式为SIMPLE或者BULK_LOGGED时,对于最小化日志类型的操作,事务日志不记录单独每个数据行的日志,而是记录对应页和区结构的修改日志。
这样显著减少了操作产生的事务日志数量。例如,向某个数据页上插入200行数据,在最小化日志记录的情况下,只会记录一条此数据页变化的日志,而不是200条Insert日志。
最小化日志类型的操作
SELECT INTO
Bulk导数操作,包括 BULK INSERT和BCP
INSERT INTO . . . SELECT,包括两种情况:
a) SELECT中使用OPENROWSET(BULK. . .)
b)目标表不具有非聚集索引,向其插入超过8页的数据量,并且使用了TABLOCK时。如果目标表为空,可以有聚集索引,如果不为空,则不可以。
部分更新大值类型的列
UPDATE中使用.WRITE插入数据或追加数据时
对LOB字段使用WRITETEXT和UPDATETEXT插入或者追加新数据,不包括更新。
索引操作,包括在表/视图上CREATE INDEX,ALTER INDEX REBUILD,DBCC DBREINDEX,DROP INDEX(新堆的重新生成将按最小方式记录)
数据导入中的最小化日志记录
本文关注的是数据导入的最小化日志记录,指BULK INSERT导数操作。很多理论在其它类型的操作上是通用的。
1. 普通的INSERT
SQL Server中使用锁和日志记录来保证数据库事务的ACID属性。在插入一行数据的整个事务期间,为了避免并发事务访问,这一行会被锁定;
同样这一行还会被写入日志记录。插入一行数据的大概的步骤如下:
通过行锁锁定行。
写入日志记录。日志记录包含被插入行的完整数据。
数据行被写入数据页。
多行插入时,每一行都会重复以上步骤。这里指大概操作原型,实际处理复杂的多,如锁升级,约束检查等等
2. BULK导入
当BULK导入提交事务时,事务使用到的所有数据页会被写入磁盘,这样来保证事务原子性。相当于每次提交事务时都做一次CHECKPOINT。如果需要回滚BULK事务,SQL Server会检索日志获取事务涉及的页或者区信息,然后将之重新标记为未使用。备份事务日志时会将BULK涉及的数据页和索引页都备份到日志备份中。还原包含BULK事务的日志备份时,不支持还原到指定时间点。
每个数据文件第八个页是BCM页(BULK Chandged Map),之后每隔511230页会有一个BCM页。BCM上的每一位(Bit)代表着一个区,如果此位为1,则表示自上次BACKUP LOG后,这个区被BULK类型操作修改过。再下次日志备份时,会将这些被修改过的区复制到日志备份中。
3. 使用最小日志记录导入数据时需要满足的条件
并不是任何情况下都可以实现最小日志导数,判断逻辑如下(来自Itzik Ben-Gan)
a) SQL Server 2008之前的版本判断逻辑:
non-FULL recovery model
AND NOT replicated
AND TABLOCK
AND (
Heap
OR (B-tree AND empty)
)
b) SQL Server 2008及以后版本的判断逻辑:
Non-FULL recovery model
AND NOT replicated
AND (
(Heap AND TABLOCK)
OR (B-tree AND empty AND TABLOCK)
OR (B-tree AND empty AND TF-610)
OR (B-tree AND nonempty AND TF-610 AND key-range)
从SQL 2008开始可以使用跟踪标记610和排它键范围锁,实现空/非空聚集索引表的最小化日志操作。
排他键范围锁的作用例子:聚集索引表tb(id INT),目前有4行数据,分别为1,1000,2000,3000。现在需要向表中插入500行数据,这些数据的值区间为[1001,1500]。
当插入时,SQL Server不需要获取聚集索引整体的排它锁(像tablock这种),而只是获取原有键值区间的排它键范围锁。这里就是在(1000,2000)区间上获取X KEY-RANGE LOCK。而不在这个区间的数据,仍然可以被其它进程访问。如果要实现非空索引表的最小化日志记录导数,需要预先将导入数据按目标表的索引键值列进行排序,并启用跟踪标记610。
从上面的判断逻辑可以看出,实现最小日志记录的大前提是:数据库不是完整恢复模式且表没有标记为复制。对于堆表总是需要使用TABLOCK。对于索引表,则要分为空表和非空表两种情况来处理。这部分内容在后文的例子再展开来说明。
观察BULK导入的日志
使用未公开的系统函数sys.fn_dblog查找相关的日志内容。fn_dblog接受两个参数用以指定要查询的日志区间,分别表示开始和结束的LSN。输出字段中,此文需要关注的是Operation, Context, Log Record Length和AllocUnitName。因为是未公开的的函数,所以输出内容代表的意义,需要结合个人经验和大家的“共识”来解读。
Operation(LOP):表示执行何种日志操作, 例如修改行为LOP_MODIFY_ROW,设置位图页时为LOP_SET_BITS等等。
Context(LCX):日志操作的上下文,一般表示受影响的对象类型。例如LCX_GAM,LCX_HEAP,LCX_PFS等。
Log Record Length:以byte为单位的日志长度
AllocUnitName:表示受影响的具体对象
使用如下脚本进行分析,脚本来自Jakub K
-- 日志条目录数据和总大小 SELECT COUNT(*)AS numrecords, CAST((COALESCE(SUM([Log Record LENGTH]), 0)) / 1024. / 1024. AS NUMERIC(12, 2)) AS size_mb FROM sys.fn_dblog(NULL, NULL) AS D WHERE AllocUnitName = 'dbo.tableName' OR AllocUnitName LIKE 'dbo.tableName.%'; -- 各类型日志的平均长度和数量 SELECT Operation, Context, AVG([Log Record LENGTH]) AS AvgLen, COUNT(*) AS Cnt FROM sys.fn_dblog(NULL, NULL) AS D WHERE AllocUnitName = 'dbo.tableName' OR AllocUnitName LIKE 'dbo.tableName.%' GROUP BY Operation, Context, ROUND([Log Record LENGTH], -2) ORDER BY AvgLen, Operation, Context;

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在現代製造業中,精準的缺陷檢測不僅是確保產品品質的關鍵,更是提升生產效率的核心。然而,現有的缺陷檢測資料集常常缺乏實際應用所需的精確度和語意豐富性,導致模型無法辨識特定的缺陷類別或位置。為了解決這個難題,由香港科技大學廣州和思謀科技組成的頂尖研究團隊,創新地開發了「DefectSpectrum」資料集,為工業缺陷提供了詳盡、語義豐富的大規模標註。如表一所示,相較於其他工業資料集,「DefectSpectrum」資料集提供了最多的缺陷標註(5438張缺陷樣本),最細緻的缺陷分類(125個缺陷類別

開放LLM社群正是百花齊放、競相爭鳴的時代,你能看到Llama-3-70B-Instruct、QWen2-72B-Instruct、Nemotron-4-340B-Instruct、Mixtral-8x22BInstruct-v0.1等許多表現優良的模型。但是,相較於以GPT-4-Turbo為代表的專有大模型,開放模型在許多領域仍有明顯差距。在通用模型之外,也有一些專精關鍵領域的開放模型已被開發出來,例如用於程式設計和數學的DeepSeek-Coder-V2、用於視覺-語言任務的InternVL

編輯|ScienceAI基於有限的臨床數據,數百種醫療演算法已被批准。科學家們正在討論由誰來測試這些工具,以及如何最好地進行測試。 DevinSingh在急診室目睹了一名兒科患者因長時間等待救治而心臟驟停,這促使他探索AI在縮短等待時間中的應用。 Singh利用了SickKids急診室的分診數據,與同事們建立了一系列AI模型,用於提供潛在診斷和推薦測試。一項研究表明,這些模型可以加快22.3%的就診速度,將每位需要進行醫學檢查的患者的結果處理速度加快近3小時。然而,人工智慧演算法在研究中的成功只是驗證此

對AI來說,奧數不再是問題了。本週四,GoogleDeepMind的人工智慧完成了一項壯舉:用AI做出了今年國際數學奧林匹克競賽IMO的真題,並且距拿金牌僅一步之遙。上週剛結束的IMO競賽共有六道賽題,涉及代數、組合學、幾何和數論。谷歌提出的混合AI系統做對了四道,獲得28分,達到了銀牌水準。本月初,UCLA終身教授陶哲軒剛剛宣傳了百萬美元獎金的AI數學奧林匹克競賽(AIMO進步獎),沒想到7月還沒過,AI的做題水平就進步到了這種水平。 IMO上同步做題,做對了最難題IMO是歷史最悠久、規模最大、最負

編輯|KX時至今日,晶體學所測定的結構細節和精度,從簡單的金屬到大型膜蛋白,是任何其他方法都無法比擬的。然而,最大的挑戰——所謂的相位問題,仍然是從實驗確定的振幅中檢索相位資訊。丹麥哥本哈根大學研究人員,開發了一種解決晶體相問題的深度學習方法PhAI,利用數百萬人工晶體結構及其相應的合成衍射數據訓練的深度學習神經網絡,可以產生準確的電子密度圖。研究表明,這種基於深度學習的從頭算結構解決方案方法,可以以僅2埃的分辨率解決相位問題,該分辨率僅相當於原子分辨率可用數據的10%到20%,而傳統的從頭算方

編輯|ScienceAI問答(QA)資料集在推動自然語言處理(NLP)研究中發揮著至關重要的作用。高品質QA資料集不僅可以用於微調模型,也可以有效評估大語言模型(LLM)的能力,尤其是針對科學知識的理解和推理能力。儘管目前已有許多科學QA數據集,涵蓋了醫學、化學、生物等領域,但這些數據集仍有一些不足之處。其一,資料形式較為單一,大多數為多項選擇題(multiple-choicequestions),它們易於進行評估,但限制了模型的答案選擇範圍,無法充分測試模型的科學問題解答能力。相比之下,開放式問答

編輯|紫羅蘭AI在簡化藥物發現方面的應用正在爆炸式增長。從數十億種候選分子中篩選出可能具有開發新藥所需特性的分子。需要考慮的變數太多了,從材料價格到出錯的風險,即使科學家使用AI,權衡合成最佳候選分子的成本也不是一件容易的事。在此,MIT研究人員開發了一個定量決策演算法架構SPARROW,來自動識別最佳分子候選物,從而最大限度地降低合成成本,同時最大限度地提高候選物具有所需特性的可能性。該演算法還確定了合成這些分子所需的材料和實驗步驟。 SPARROW考慮了一次合成一批分子的成本,因為多個候選分子通常可

編輯|KX在藥物研發領域,準確有效地預測蛋白質與配體的結合親和力對於藥物篩選和優化至關重要。然而,目前的研究並沒有考慮到分子表面訊息在蛋白質-配體相互作用中的重要作用。基於此,來自廈門大學的研究人員提出了一種新穎的多模態特徵提取(MFE)框架,該框架首次結合了蛋白質表面、3D結構和序列的信息,並使用交叉注意機制進行不同模態之間的特徵對齊。實驗結果表明,該方法在預測蛋白質-配體結合親和力方面取得了最先進的性能。此外,消融研究證明了該框架內蛋白質表面資訊和多模態特徵對齊的有效性和必要性。相關研究以「S
