1

在 SQL Server 2008 中,我想检查执行查询时幕后的实际情况。我能以某种方式看到以下内容吗?

  1. 查询“产生”的日志记录的数量(甚至可能是内容)。
  2. 当日志的内容实际应用于真实的数据结构时。例如:
    1. 新行何时实际添加到(集群)索引结构中?
    2. 并且更新/插入是否意味着 B-tree 重组(如果是,那么该 B-tree 的大部分(多少页)受到影响)?嗯,也许我应该发布一个关于这个的单独问题......
  3. 每个访问的表的缓冲区未命中/命中数。
  4. 缓冲区的内容(表中的哪些或多少页当前在缓冲区中)?

顺便说一句:我考虑将这个问题分成多个较小的问题,但我想它们有些相关。

4

2 回答 2

3

这是一个简单的演示脚本,可帮助您开始学习 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
于 2011-07-17T22:05:31.390 回答
0

您可以选择 SQL Profiler 并查看存储过程执行计划。

于 2011-07-17T19:08:40.333 回答