这是一个简单的演示脚本,可帮助您开始学习 SQL Server 内部知识。要查看查询的各个操作,请访问Paul Randal 的 SQLSkills 博客。
该博客上的其他帖子将涵盖诸如 DBCC PAGE 之类的主题,这将允许您查看 PAGE 和 DBCC IND 的内容,它将向您显示表/索引的分配图。我建议阅读 Microsoft SQL Server 2008 Internals 的副本,其中详细介绍了所有这些主题。
事务日志记录演示脚本
对于两个 Select,未命中显示为物理读取和预读,这些是从磁盘到缓冲池的读取。然后查询引擎使用这些页面,这就是逻辑读取。因此,对于暖选择上的 io 统计信息,它没有物理读取或预读,因此所需的所有页面都已经在缓冲池中。
/* -- Cleanup Script
USE master
DROP DATABASE ExampleDB
*/
SET NOCOUNT ON
SET STATISTICS IO OFF
GO
CREATE DATABASE ExampleDB
GO
USE ExampleDB
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log
CHECKPOINT
GO
-- Show Empty Transaction Log
SELECT * FROM fn_dblog(NULL,NULL)
GO
-- CREATE SIMPLE TABLE
CREATE TABLE NewTable
(
A int identity NOT NULL PRIMARY KEY,
B char(8000) NOT NULL DEFAULT ('')
)
GO
-- Show Transaction Log With CREATE TABLE records
SELECT * FROM fn_dblog(NULL,NULL)
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log
CHECKPOINT
GO
PRINT 'INSERT Start'
GO
INSERT NewTable
VALUES (DEFAULT)
GO 1000
PRINT 'INSERT End'
GO
-- Show Transaction Log With INSERT records
SELECT * FROM fn_dblog(NULL,NULL)
GO
-- Turn On IO Statistics (these appear in the messages tab)
SET STATISTICS IO ON
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log and modified buffer pages
CHECKPOINT
GO
-- DROP CLEAN BUFFERS to empty cache
DBCC DROPCLEANBUFFERS
GO
PRINT 'SELECT Start Cold Cache'
GO
SELECT * FROM NewTable
GO
PRINT 'SELECT End Cold Cache'
GO
PRINT 'SELECT Start Warm Cache'
GO
SELECT * FROM NewTable
GO
PRINT 'SELECT End Warm Cache'
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log
CHECKPOINT
GO
DROP TABLE NewTable
-- Show Transaction Log With DROP TABLE records
SELECT * FROM fn_dblog(NULL,NULL)
GO
对于缓冲池的内容,起点是这个 DMV
SELECT *
FROM sys.dm_os_buffer_descriptors