100% found this document useful (1 vote)
36 views

Full Download Pro SQL Server 2022 Wait Statistics: A Practical Guide to Analyzing Performance in SQL Server and Azure SQL Database, 3rd Edition Thomas Larock PDF DOCX

Larock

Uploaded by

giococery
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
36 views

Full Download Pro SQL Server 2022 Wait Statistics: A Practical Guide to Analyzing Performance in SQL Server and Azure SQL Database, 3rd Edition Thomas Larock PDF DOCX

Larock

Uploaded by

giococery
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

Download Full Version ebook - Visit ebookmeta.

com

Pro SQL Server 2022 Wait Statistics: A Practical


Guide to Analyzing Performance in SQL Server and
Azure SQL Database, 3rd Edition Thomas Larock

https://ebookmeta.com/product/pro-sql-server-2022-wait-
statistics-a-practical-guide-to-analyzing-performance-in-
sql-server-and-azure-sql-database-3rd-edition-thomas-larock/

OR CLICK HERE

DOWLOAD NOW

Discover More Ebook - Explore Now at ebookmeta.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Start reading on any device today!

Pro SQL Server 2022 Wait Statistics: A Practical Guide to


Analyzing Performance in SQL Server and Azure SQL
Database, 3rd Edition Thomas Larock
https://ebookmeta.com/product/pro-sql-server-2022-wait-statistics-a-
practical-guide-to-analyzing-performance-in-sql-server-and-azure-sql-
database-3rd-edition-thomas-larock/
ebookmeta.com

Pro SQL Server 2019 Wait Statistics: A Practical Guide to


Analyzing Performance in SQL Server - Second Edition
Enrico Van De Laar
https://ebookmeta.com/product/pro-sql-server-2019-wait-statistics-a-
practical-guide-to-analyzing-performance-in-sql-server-second-edition-
enrico-van-de-laar/
ebookmeta.com

Expert Performance Indexing in Azure SQL and SQL Server


2022 Fourth Edition Edward Pollack

https://ebookmeta.com/product/expert-performance-indexing-in-azure-
sql-and-sql-server-2022-fourth-edition-edward-pollack/

ebookmeta.com

The Interpretation of International Investment Law


Equality Discrimination and Minimum Standards of Treatment
in Historical Context 1st Edition Todd Weiler
https://ebookmeta.com/product/the-interpretation-of-international-
investment-law-equality-discrimination-and-minimum-standards-of-
treatment-in-historical-context-1st-edition-todd-weiler/
ebookmeta.com
Advanced Optical and Wireless Communications Systems, 2nd
Edition Ivan B. Djordjevic

https://ebookmeta.com/product/advanced-optical-and-wireless-
communications-systems-2nd-edition-ivan-b-djordjevic/

ebookmeta.com

The Medieval Soldier In the Wars of the Roses 2nd Edition


Andrew Boardman

https://ebookmeta.com/product/the-medieval-soldier-in-the-wars-of-the-
roses-2nd-edition-andrew-boardman/

ebookmeta.com

Lonely Planet India 19th Edition Lonely Planet

https://ebookmeta.com/product/lonely-planet-india-19th-edition-lonely-
planet/

ebookmeta.com

Nano-Technological Intervention in Agricultural


Productivity Javid A. Parray

https://ebookmeta.com/product/nano-technological-intervention-in-
agricultural-productivity-javid-a-parray/

ebookmeta.com

The Role of SDN in Broadband Networks Springer Theses


Habibi Gharakheili Hassan

https://ebookmeta.com/product/the-role-of-sdn-in-broadband-networks-
springer-theses-habibi-gharakheili-hassan/

ebookmeta.com
Marvel s SPIDER MAN Hostile Takeover 1st Edition David
Liss

https://ebookmeta.com/product/marvel-s-spider-man-hostile-
takeover-1st-edition-david-liss/

ebookmeta.com
Pro
SQL Server 2022
Wait Statistics
A Practical Guide to Analyzing Performance
in SQL Server and Azure SQL Database

Third Edition

Thomas LaRock
Enrico van de Laar
Pro SQL Server 2022
Wait Statistics
A Practical Guide to Analyzing
Performance in SQL Server and Azure
SQL Database
Third Edition

Thomas LaRock
Enrico van de Laar
Pro SQL Server 2022 Wait Statistics: A Practical Guide to Analyzing Performance in
SQL Server and Azure SQL Database
Thomas LaRock Enrico van de Laar
East Longmeadow, MA, USA Drachten, The Netherlands

ISBN-13 (pbk): 978-1-4842-8770-5 ISBN-13 (electronic): 978-1-4842-8771-2


https://doi.org/10.1007/978-1-4842-8771-2
Copyright © 2023 by Thomas LaRock, Enrico van de Laar
This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Jonathan Gennick
Development Editor: Laura Berendson
Coordinating Editor: Jill Balzano
Cover designed by eStudioCalamar
Cover Photo by Almas Salakhov on Unsplash
Distributed to the book trade worldwide by Springer Science+Business Media New York, 1 New York Plaza,
Suite 4600, New York, NY 10004-1562, USA. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@
springer-sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole
member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc
is a Delaware corporation.
For information on translations, please e-mail booktranslations@springernature.com; for reprint,
paperback, or audio rights, please e-mail bookpermissions@springernature.com.
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub (https://github.com/Apress). For more detailed information, please visit http://www.
apress.com/source-code.
Printed on acid-free paper
This book is dedicated to all the accidental database administrators,
developers, and anyone who has written a database query and
wondered “what the hell is taking so long?”
Also, for Roy, Moss, and anyone else who decided to turn
it off and back on again.
Table of Contents
About the Authors����������������������������������������������������������������������������������������������������xv

About the Technical Reviewers�����������������������������������������������������������������������������xvii


Acknowledgments��������������������������������������������������������������������������������������������������xix

Introduction������������������������������������������������������������������������������������������������������������xxi

Part I: Foundations of Wait Statistics Analysis����������������������������������������������� 1


Chapter 1: Wait Statistics Internals�������������������������������������������������������������������������� 3
A Brief History of Wait Statistics��������������������������������������������������������������������������������������������������� 4
The SQLOS������������������������������������������������������������������������������������������������������������������������������������ 6
Schedulers, Tasks, and Worker Threads���������������������������������������������������������������������������������������� 9
Sessions�������������������������������������������������������������������������������������������������������������������������������� 10
Requests�������������������������������������������������������������������������������������������������������������������������������� 12
Tasks������������������������������������������������������������������������������������������������������������������������������������� 12
Worker Threads��������������������������������������������������������������������������������������������������������������������� 14
Schedulers����������������������������������������������������������������������������������������������������������������������������� 17
Putting It All Together������������������������������������������������������������������������������������������������������������ 19
Wait Statistics������������������������������������������������������������������������������������������������������������������������ 20
Summary������������������������������������������������������������������������������������������������������������������������������� 25

Chapter 2: Querying SQL Server Wait Statistics����������������������������������������������������� 27


sys.dm_os_wait_stats���������������������������������������������������������������������������������������������������������������� 28
sys.dm_os_waiting_tasks���������������������������������������������������������������������������������������������������������� 31
Understanding sys.dm_os_waiting_tasks���������������������������������������������������������������������������� 31
Querying sys.dm_os_waiting_tasks������������������������������������������������������������������������������������� 33

v
Table of Contents

sys.dm_exec_requests��������������������������������������������������������������������������������������������������������������� 35
Understanding sys.dm_exec_requests��������������������������������������������������������������������������������� 35
Querying sys.dm_exec_requests������������������������������������������������������������������������������������������ 36
sys.dm_exec_session_wait_stats���������������������������������������������������������������������������������������������� 38
Combining DMVs to Detect Waits Happening Now��������������������������������������������������������������������� 40
Viewing Wait Statistics Using Perfmon��������������������������������������������������������������������������������������� 45
Capturing Wait Statistics Using Extended Events����������������������������������������������������������������������� 47
Capture Wait Statistics Information for a Specific Query������������������������������������������������������ 49
Analyzing Wait Statistics on a Per-Query Basis Using Execution Plans�������������������������������������� 59
Summary������������������������������������������������������������������������������������������������������������������������������������ 63

Chapter 3: The Query Store������������������������������������������������������������������������������������� 65


What Is the Query Store?������������������������������������������������������������������������������������������������������������ 65
Enabling the Query Store������������������������������������������������������������������������������������������������������������ 66
Enable the Query Store Using SSMS������������������������������������������������������������������������������������� 66
Enable the Query Store Using T-SQL������������������������������������������������������������������������������������� 68
Query Store Architecture������������������������������������������������������������������������������������������������������������� 68
How Wait Statistics Are Processed in the Query Store��������������������������������������������������������������� 69
Accessing Wait Statistics Through Query Store Reports������������������������������������������������������������� 72
Accessing Wait Statistics Through Query Store DMVs���������������������������������������������������������������� 75
Summary������������������������������������������������������������������������������������������������������������������������������������ 78

Chapter 4: Building a Solid Baseline���������������������������������������������������������������������� 79


What Are Baselines?������������������������������������������������������������������������������������������������������������������� 80
Visualizing Your Baselines���������������������������������������������������������������������������������������������������������� 82
Baseline Types and Statistics������������������������������������������������������������������������������������������������������ 83
Baseline Pitfalls�������������������������������������������������������������������������������������������������������������������������� 85
Too Much Information������������������������������������������������������������������������������������������������������������ 85
Know Your Metrics����������������������������������������������������������������������������������������������������������������� 85
Find the Big Measurement Changes������������������������������������������������������������������������������������� 85
Use Fixed Intervals���������������������������������������������������������������������������������������������������������������� 86

vi
Table of Contents

Building a Baseline for Wait Statistics Analysis�������������������������������������������������������������������������� 86


Reset Capture Method����������������������������������������������������������������������������������������������������������� 90
Delta Capture Method������������������������������������������������������������������������������������������������������������ 91
Using SQL Server Agent to Schedule Measurements����������������������������������������������������������������� 93
Wait Statistics Baseline Analysis������������������������������������������������������������������������������������������������ 96
Summary���������������������������������������������������������������������������������������������������������������������������������� 104

Part II: Wait Types��������������������������������������������������������������������������������������� 105


Chapter 5: CPU-Related Wait Types���������������������������������������������������������������������� 107
CXPACKET��������������������������������������������������������������������������������������������������������������������������������� 107
What Is the CXPACKET Wait Type?��������������������������������������������������������������������������������������� 108
Lowering CXPACKET Wait Time by Tuning the Parallelism Configuration Options��������������� 112
Lowering CXPACKET Wait Time by Resolving Skewed Workloads��������������������������������������� 116
Introduction of the CXCONSUMER Wait Type����������������������������������������������������������������������� 117
CXPACKET Summary����������������������������������������������������������������������������������������������������������� 118
SOS_SCHEDULER_YIELD����������������������������������������������������������������������������������������������������������� 118
What Is the SOS_SCHEDULER_YIELD Wait Type?���������������������������������������������������������������� 119
Lowering SOS_SCHEDULER_YIELD Waits���������������������������������������������������������������������������� 122
SOS_SCHEDULER_YIELD Summary������������������������������������������������������������������������������������� 127
THREADPOOL���������������������������������������������������������������������������������������������������������������������������� 127
What Is the THREADPOOL Wait Type?���������������������������������������������������������������������������������� 128
THREADPOOL Example�������������������������������������������������������������������������������������������������������� 130
Gaining Access to Our SQL Server During THREADPOOL Waits������������������������������������������� 134
Lowering THREADPOOL Waits Caused by Parallelism��������������������������������������������������������� 135
Lowering THREADPOOL Waits Caused by User Connections����������������������������������������������� 137
THREADPOOL Summary������������������������������������������������������������������������������������������������������ 140

Chapter 6: IO-Related Wait Types������������������������������������������������������������������������� 141


ASYNC_IO_COMPLETION����������������������������������������������������������������������������������������������������������� 141
What Is the ASYNC_IO_COMPLETION Wait Type?���������������������������������������������������������������� 142
ASYNC_IO_COMPLETION Example�������������������������������������������������������������������������������������� 143

vii
Table of Contents

Lowering ASYNC_IO_COMPLETION Waits���������������������������������������������������������������������������� 144


ASYNC_IO_COMPLETION Summary������������������������������������������������������������������������������������� 149
ASYNC_NETWORK_IO��������������������������������������������������������������������������������������������������������������� 150
What Is the ASYNC_NETWORK_IO Wait Type?��������������������������������������������������������������������� 150
ASYNC_NETWORK_IO Example������������������������������������������������������������������������������������������� 151
Lowering ASYNC_NETWORK_IO Waits��������������������������������������������������������������������������������� 152
ASYNC_NETWORK_IO Summary������������������������������������������������������������������������������������������ 153
CMEMTHREAD��������������������������������������������������������������������������������������������������������������������������� 154
What Is the CMEMTHREAD Wait Type?�������������������������������������������������������������������������������� 154
Lowering CMEMTHREAD Waits�������������������������������������������������������������������������������������������� 156
CMEMTHREAD Summary����������������������������������������������������������������������������������������������������� 157
IO_COMPLETION������������������������������������������������������������������������������������������������������������������������ 157
What Is the IO_COMPLETION Wait Type?����������������������������������������������������������������������������� 157
IO_COMPLETION Example��������������������������������������������������������������������������������������������������� 158
Lowering IO_COMPLETION Waits����������������������������������������������������������������������������������������� 159
IO_COMPLETION Summary�������������������������������������������������������������������������������������������������� 159
LOGBUFFER and WRITELOG������������������������������������������������������������������������������������������������������� 160
What Are the LOGBUFFER and WRITELOG Wait Types?�������������������������������������������������������� 160
LOGBUFFER and WRITELOG Example���������������������������������������������������������������������������������� 162
Lowering LOGBUFFER and WRITELOG Waits������������������������������������������������������������������������ 164
LOGBUFFER and WRITELOG Summary��������������������������������������������������������������������������������� 165
RESOURCE_SEMAPHORE���������������������������������������������������������������������������������������������������������� 165
What Is the RESOURCE_SEMAPHORE Wait Type?���������������������������������������������������������������� 165
RESOURCE_SEMAPHORE Example�������������������������������������������������������������������������������������� 167
Lowering RESOURCE_SEMAPHORE Waits��������������������������������������������������������������������������� 172
RESOURCE_SEMAPHORE Summary������������������������������������������������������������������������������������ 172
RESOURCE_SEMAPHORE_QUERY_COMPILE����������������������������������������������������������������������������� 173
What Is the RESOURCE_SEMAPHORE_QUERY_COMPILE Wait Type?���������������������������������� 173
RESOURCE_SEMAPHORE_QUERY_COMPILE Example��������������������������������������������������������� 177
Lowering RESOURCE_SEMAPHORE_QUERY_COMPILE Waits���������������������������������������������� 180
RESOURCE_SEMAPHORE_QUERY_COMPILE Summary������������������������������������������������������� 181

viii
Table of Contents

SLEEP_BPOOL_FLUSH�������������������������������������������������������������������������������������������������������������� 181
What Is the SLEEP_BPOOL_FLUSH Wait Type?�������������������������������������������������������������������� 181
SLEEP_BPOOL_FLUSH Example������������������������������������������������������������������������������������������ 184
Lowering SLEEP_BPOOL_FLUSH Waits������������������������������������������������������������������������������� 186
SLEEP_BPOOL_FLUSH Summary���������������������������������������������������������������������������������������� 187
WRITE_COMPLETION����������������������������������������������������������������������������������������������������������������� 187
What Is the WRITE_COMPLETION Wait Type?���������������������������������������������������������������������� 187
WRITE_COMPLETION Example��������������������������������������������������������������������������������������������� 188
Lowering WRITE_COMPLETION Waits���������������������������������������������������������������������������������� 188
WRITE_COMPLETION Summary������������������������������������������������������������������������������������������� 189

Chapter 7: Backup-Related Wait Types����������������������������������������������������������������� 191


BACKUPBUFFER������������������������������������������������������������������������������������������������������������������������ 192
What Is the BACKUPBUFFER Wait Type?������������������������������������������������������������������������������ 192
BACKUPBUFFER Example���������������������������������������������������������������������������������������������������� 195
Lowering BACKUPBUFFER Waits����������������������������������������������������������������������������������������� 195
BACKUPBUFFER Summary�������������������������������������������������������������������������������������������������� 197
BACKUPIO���������������������������������������������������������������������������������������������������������������������������������� 197
What Is the BACKUPIO Wait Type?��������������������������������������������������������������������������������������� 197
BACKUPIO Example������������������������������������������������������������������������������������������������������������� 198
Lowering BACKUPIO Waits��������������������������������������������������������������������������������������������������� 199
BACKUPIO Summary������������������������������������������������������������������������������������������������������������ 200
BACKUPTHREAD������������������������������������������������������������������������������������������������������������������������ 200
What Is the BACKUPTHREAD Wait Type?����������������������������������������������������������������������������� 200
BACKUPTHREAD Example���������������������������������������������������������������������������������������������������� 201
Lowering BACKUPTHREAD Waits����������������������������������������������������������������������������������������� 202
BACKUPTHREAD Summary�������������������������������������������������������������������������������������������������� 203

Chapter 8: Lock-Related Wait Types��������������������������������������������������������������������� 205


Introduction to Locking and Blocking��������������������������������������������������������������������������������������� 207
Lock Modes and Compatibility�������������������������������������������������������������������������������������������� 207
Locking Hierarchy���������������������������������������������������������������������������������������������������������������� 209

ix
Table of Contents

Isolation Levels�������������������������������������������������������������������������������������������������������������������� 211


Querying Lock Information�������������������������������������������������������������������������������������������������� 214
LCK_M_S���������������������������������������������������������������������������������������������������������������������������������� 217
What Is the LCK_M_S Wait Type?���������������������������������������������������������������������������������������� 218
LCK_M_S Example�������������������������������������������������������������������������������������������������������������� 218
Lowering LCK_M_S Waits��������������������������������������������������������������������������������������������������� 220
LCK_M_S Summary������������������������������������������������������������������������������������������������������������ 220
LCK_M_U���������������������������������������������������������������������������������������������������������������������������������� 221
What Is the LCK_M_U Wait Type?���������������������������������������������������������������������������������������� 221
LCK_M_U Example�������������������������������������������������������������������������������������������������������������� 223
Lowering LCK_M_U Waits��������������������������������������������������������������������������������������������������� 224
LCK_M_U Summary������������������������������������������������������������������������������������������������������������ 224
LCK_M_X���������������������������������������������������������������������������������������������������������������������������������� 225
What Is the LCK_M_X Wait Type?���������������������������������������������������������������������������������������� 225
LCK_M_X Example�������������������������������������������������������������������������������������������������������������� 225
Lowering LCK_M_X Waits���������������������������������������������������������������������������������������������������� 227
LCK_M_X Summary������������������������������������������������������������������������������������������������������������� 227
LCK_M_I[xx]������������������������������������������������������������������������������������������������������������������������������ 227
What Is the LCK_M_I[xx] Wait Type?����������������������������������������������������������������������������������� 227
LCK_M_I[xx] Example���������������������������������������������������������������������������������������������������������� 228
Lowering LCK_M_I[xx] Waits����������������������������������������������������������������������������������������������� 230
LCK_M_I[xx] Summary�������������������������������������������������������������������������������������������������������� 230
LCK_M_SCH_S and LCK_M_SCH_M����������������������������������������������������������������������������������������� 231
What Are the LCK_M_SCH_S and LCK_M_SCH_M Wait Types?������������������������������������������ 231
LCK_M_SCH_S and LCK_M_SCH_M Example�������������������������������������������������������������������� 232
Lowering LCK_M_SCH_S and LCK_M_SCH_M Waits���������������������������������������������������������� 234
LCK_M_SCH_S and LCK_M_SCH_M Summary������������������������������������������������������������������� 234

Chapter 9: Latch-Related Wait Types�������������������������������������������������������������������� 235


Introduction to Latches������������������������������������������������������������������������������������������������������������� 235
Latch Modes������������������������������������������������������������������������������������������������������������������������ 237
Latch Waits�������������������������������������������������������������������������������������������������������������������������� 238

x
Table of Contents

sys.dm_os_latch_stats������������������������������������������������������������������������������������������������������� 240
Page-Latch Contention�������������������������������������������������������������������������������������������������������� 241
PAGELATCH_[xx]����������������������������������������������������������������������������������������������������������������������� 244
What Is the PAGELATCH_[xx] Wait Type?����������������������������������������������������������������������������� 244
PAGELATCH_[xx] Example��������������������������������������������������������������������������������������������������� 245
Lowering PAGELATCH_[xx] Waits����������������������������������������������������������������������������������������� 250
PAGELATCH_[xx] Summary�������������������������������������������������������������������������������������������������� 255
LATCH_[xx]�������������������������������������������������������������������������������������������������������������������������������� 256
What Is the LATCH_[xx] Wait Type?������������������������������������������������������������������������������������� 256
LATCH_[xx] Example������������������������������������������������������������������������������������������������������������ 257
Lowering LATCH_[xx] Waits������������������������������������������������������������������������������������������������� 262
LATCH_[xx] Summary���������������������������������������������������������������������������������������������������������� 263
PAGEIOLATCH_[xx]�������������������������������������������������������������������������������������������������������������������� 263
What Is the PAGEIOLATCH_[xx] Wait Type?�������������������������������������������������������������������������� 264
PAGEIOLATCH_[xx] Example������������������������������������������������������������������������������������������������ 266
Lowering PAGEIOLATCH_[xx] Waits������������������������������������������������������������������������������������� 268
PAGEIOLATCH_[xx] Summary���������������������������������������������������������������������������������������������� 272

Chapter 10: High-Availability and Disaster-Recovery Wait Types������������������������ 273


DBMIRROR_SEND��������������������������������������������������������������������������������������������������������������������� 274
What Is the DBMIRROR_SEND Wait Type?��������������������������������������������������������������������������� 277
DBMIRROR_SEND Example������������������������������������������������������������������������������������������������� 277
Lowering DBMIRROR_SEND Waits��������������������������������������������������������������������������������������� 279
DBMIRROR_SEND Summary������������������������������������������������������������������������������������������������ 280
HADR_LOGCAPTURE_WAIT and HADR_WORK_QUEUE�������������������������������������������������������������� 281
What Are the HADR_LOGCAPTURE_WAIT and HADR_WORK_QUEUE Wait Types?��������������� 281
HADR_LOGCAPTURE_WAIT and HADR_WORK_QUEUE Summary���������������������������������������� 284
HADR_SYNC_COMMIT��������������������������������������������������������������������������������������������������������������� 284
What Is the HADR_SYNC_COMMIT Wait Type?�������������������������������������������������������������������� 284
HADR_SYNC_COMMIT Example������������������������������������������������������������������������������������������ 285
Lowering HADR_SYNC_COMMIT Waits�������������������������������������������������������������������������������� 288
HADR_SYNC_COMMIT Summary����������������������������������������������������������������������������������������� 291

xi
Table of Contents

REDO_THREAD_PENDING_WORK���������������������������������������������������������������������������������������������� 292
What Is the REDO_THREAD_PENDING_WORK Wait Type?��������������������������������������������������� 292
REDO_THREAD_PENDING_WORK Summary������������������������������������������������������������������������ 294

Chapter 11: Preemptive Wait Types���������������������������������������������������������������������� 295


SQL Server on Linux������������������������������������������������������������������������������������������������������������������ 296
PREEMPTIVE_OS_ENCRYPTMESSAGE and PREEMPTIVE_OS_DECRYPTMESSAGE������������������� 299
What Are the PREEMPTIVE_OS_ENCRYPTMESSAGE and PREEMPTIVE_OS_
DECRYPTMESSAGE Wait Types?������������������������������������������������������������������������������������������ 299
PREEMPTIVE_OS_ENCRYPTMESSAGE and PREEMPTIVE_OS_DECRYPTMESSAGE
Example������������������������������������������������������������������������������������������������������������������������������� 299
Lowering PREEMPTIVE_OS_ENCRYPTMESSAGE and PREEMPTIVE_OS_
DECRYPTMESSAGE Waits���������������������������������������������������������������������������������������������������� 307
PREEMPTIVE_OS_ENCRYPTMESSAGE and PREEMPTIVE_OS_DECRYPTMESSAGE
Summary����������������������������������������������������������������������������������������������������������������������������� 307
PREEMPTIVE_OS_WRITEFILEGATHER��������������������������������������������������������������������������������������� 307
What Is the PREEMPTIVE_OS_WRITEFILEGATHER Wait Type?��������������������������������������������� 307
PREEMPTIVE_OS_WRITEFILEGATHER Example������������������������������������������������������������������� 308
Lowering PREEMPTIVE_OS_WRITEFILEGATHER Waits�������������������������������������������������������� 309
PREEMPTIVE_OS_WRITEFILEGATHER Summary������������������������������������������������������������������ 310
PREEMPTIVE_OS_AUTHENTICATIONOPS����������������������������������������������������������������������������������� 311
What Is the PREEMPTIVE_OS_AUTHENTICATIONOPS Wait Type?���������������������������������������� 311
PREEMPTIVE_OS_AUTHENTICATIONOPS Example��������������������������������������������������������������� 312
Lowering PREEMPTIVE_OS_AUTHENTICATIONOPS Waits���������������������������������������������������� 314
PREEMPTIVE_OS_AUTHENTICATIONOPS Summary������������������������������������������������������������� 316
PREEMPTIVE_OS_GETPROCADDRESS��������������������������������������������������������������������������������������� 316
What Is the PREEMPTIVE_OS_GETPROCADDRESS Wait Type?�������������������������������������������� 316
PREEMPTIVE_OS_GETPROCADDRESS Example������������������������������������������������������������������ 319
Lowering PREEMPTIVE_OS_GETPROCADDRESS Waits�������������������������������������������������������� 320
PREEMPTIVE_OS_GETPROCADDRESS Summary����������������������������������������������������������������� 320

xii
Table of Contents

Chapter 12: Background and Miscellaneous Wait Types�������������������������������������� 321


CHECKPOINT_QUEUE����������������������������������������������������������������������������������������������������������������� 322
What Is the CHECKPOINT_QUEUE Wait Type?���������������������������������������������������������������������� 322
CHECKPOINT_QUEUE Summary������������������������������������������������������������������������������������������� 325
DIRTY_PAGE_POLL�������������������������������������������������������������������������������������������������������������������� 326
What Is the DIRTY_PAGE_POLL Wait Type?�������������������������������������������������������������������������� 326
DIRTY_PAGE_POLL Summary���������������������������������������������������������������������������������������������� 329
LAZYWRITER_SLEEP����������������������������������������������������������������������������������������������������������������� 329
What Is the LAZYWRITER_SLEEP Wait Type?����������������������������������������������������������������������� 329
LAZYWRITER_SLEEP Summary������������������������������������������������������������������������������������������� 331
MSQL_XP���������������������������������������������������������������������������������������������������������������������������������� 331
What Is the MSQL_XP Wait Type?���������������������������������������������������������������������������������������� 331
MSQL_XP Example�������������������������������������������������������������������������������������������������������������� 332
Lowering MSQL_XP Waits��������������������������������������������������������������������������������������������������� 333
MSQL_XP Summary������������������������������������������������������������������������������������������������������������ 334
OLEDB��������������������������������������������������������������������������������������������������������������������������������������� 334
What Is the OLEDB Wait Type?��������������������������������������������������������������������������������������������� 334
OLEDB Example������������������������������������������������������������������������������������������������������������������� 334
Lowering OLEDB Waits�������������������������������������������������������������������������������������������������������� 335
OLEDB Summary����������������������������������������������������������������������������������������������������������������� 336
TRACEWRITE����������������������������������������������������������������������������������������������������������������������������� 336
What Is the TRACEWRITE Wait Type?����������������������������������������������������������������������������������� 337
TRACEWRITE Example��������������������������������������������������������������������������������������������������������� 337
Lowering TRACEWRITE Waits���������������������������������������������������������������������������������������������� 341
TRACEWRITE Summary������������������������������������������������������������������������������������������������������� 344
WAITFOR����������������������������������������������������������������������������������������������������������������������������������� 344
What Is the WAITFOR Wait Type?����������������������������������������������������������������������������������������� 345
WAITFOR Example��������������������������������������������������������������������������������������������������������������� 345
WAITFOR Summary�������������������������������������������������������������������������������������������������������������� 346

xiii
Table of Contents

Chapter 13: In-Memory OLTP–Related Wait Types������������������������������������������������ 347


Introduction to In-Memory OLTP����������������������������������������������������������������������������������������������� 347
Checkpoint File Pairs (CFPs)������������������������������������������������������������������������������������������������ 348
Isolation������������������������������������������������������������������������������������������������������������������������������� 352
Transaction Log Changes���������������������������������������������������������������������������������������������������� 352
WAIT_XTP_HOST_WAIT������������������������������������������������������������������������������������������������������������� 353
What Is the WAIT_XTP_HOST_WAIT Wait Type?������������������������������������������������������������������� 353
WAIT_XTP_HOST_WAIT Summary��������������������������������������������������������������������������������������� 356
WAIT_XTP_CKPT_CLOSE����������������������������������������������������������������������������������������������������������� 357
What Is the WAIT_XTP_CKPT_CLOSE Wait Type?���������������������������������������������������������������� 357
WAIT_XTP_CKPT_CLOSE Summary������������������������������������������������������������������������������������� 358
WAIT_XTP_OFFLINE_CKPT_NEW_LOG�������������������������������������������������������������������������������������� 359
What Is the WAIT_XTP_OFFLINE_CKPT_NEW_LOG Wait Type?�������������������������������������������� 359
WAIT_XTP_OFFLINE_CKPT_NEW_LOG Summary���������������������������������������������������������������� 360

Appendix I: Example SQL Server Machine Configurations������������������������������������ 361

Appendix II: Spinlocks������������������������������������������������������������������������������������������ 365

Appendix III: Latch Classes���������������������������������������������������������������������������������� 369

Appendix IV: Waits and DMVs������������������������������������������������������������������������������� 381

Index��������������������������������������������������������������������������������������������������������������������� 391

xiv
About the Authors
Thomas LaRock has over 20 years of IT experience holding administrator roles. He is
a Microsoft Certified Master in SQL Server and a Microsoft Data Platform MVP since
2009. LaRock has spent much of his career working with data and databases, which led
to his selection as a Technical Advocate for Confio Software in 2010 for the software now
known as SolarWinds Database Performance Analyzer (DPA).
Currently, he serves as a Head Geek for SolarWinds, a company specializing in
software for enterprise infrastructure monitoring. This role allows for LaRock to work
with a variety of customers, helping to solve questions regarding network, application,
and database performance tuning and virtualization. You can reach Thomas through his
blog (thomaslarock.com/blog) and find him on Twitter (@SQLRockstar).

Enrico van de Laar has been working with data in various formats and sizes for over
15 years. He is a data and advanced analytics consultant for DataHeroes where he helps
organizations optimize their data platform environment and helps them with their first
steps in the world of advanced analytics. He is a Data Platform MVP since 2014 and a
frequent speaker on various data-related events throughout the world. He frequently
blogs about technologies such as Microsoft SQL Server and Azure Machine Learning on
his blog at enricovandelaar.com. You can contact Enrico on Twitter at @evdlaar.

xv
About the Technical Reviewers
Denny Cherry is the owner and principal consultant for
Denny Cherry & Associates Consulting and has over two
decades of experience working with platforms such as Azure,
Microsoft SQL Server, Hyper-V, vSphere, and Enterprise
Storage solutions. Denny’s areas of technical expertise
include system architecture, performance tuning, security,
replication, and troubleshooting. Denny currently holds
several of the Microsoft certifications related to SQL Server
for versions 2000 through 2017 including the Microsoft
Certified Master as well as being a Microsoft MVP for over
a decade. Denny has written several books and dozens of
technical articles on SQL Server management and how SQL
Server integrates with various other technologies.

Joseph D’Antoni is a Principal Consultant at Denny Cherry


& Associates Consulting. He is recognized as a VMWare
vExpert and a Microsoft Data Platform MVP and has over
20 years of experience working in both Fortune 500 and
smaller firms. He has worked extensively on database
platforms and cloud technologies and has specific expertise
in performance tuning, infrastructure, and disaster recovery.

xvii
Acknowledgments
There are many people to acknowledge and thank for helping me with this book. I’ll do
my best to include as many as I can, but please don’t be offended if I forget you; it’s not
on purpose.
I’ll start with my wife, Suzanne, for her patience as I spent many off-hours
completing this book. Oh, and for all the time I’ve spent away from home for the past
15 years.
Thanks to Bob Ward of Microsoft for helping uncover new SQL 2022 features, as well
as your willingness to share your knowledge on SQL Server for the past 25 years. And
thanks for your time in Barcelona in 2006 when you inspired me to want to learn more
about SQL Server.
Thanks to my partner in #TeamData, Karen Lopez, for your help, support, and
friendship for many years. I became a better technical writer and presenter by learning
from you.
Thanks to Kevin Kline for your guidance and support as I left my career as a
production DBA to become a Technical Advocate and for providing an example of what
proper community leadership looks like.
To Buck Woody, for your support in helping me understand my strengths and your
guidance in career opportunities through the years.
To Craig and Vinny, for giving me the opportunity to fail as a DBA, and to Frank and
Lori for not letting it happen as much as it should have.
To Rie, Betsy, Rochelle, and everyone on the Microsoft Community team for
awarding me the Microsoft MVP status all these years.
Finally, to Jonathan, for thinking of me when it came time to update this book for
SQL 2022. Thank you for the opportunity to write another book for you, 12 years later.

xix
Introduction
“Write the book you wish someone else would have written and handed to you when you
were starting as a DBA.”
Those words were spoken to me by my friend and mentor, Kevin Kline, roughly 13
years ago. At the time I was writing my first book, DBA Survivor, and I asked Kevin for
advice on how to approach the project. His answer gave me clarity, and I’ve used the
same approach for this book you are now reading.
At the time I started as a junior DBA, Tom Davidson’s well-known SQL Server 2005
Waits and Queues whitepaper was years away from publication. What I knew about waits
I would find using DBCC statements against (the artist formally known as) Sybase ASE
and SQL Server 2000 instances.
In other words, I didn’t know much.
With the release of SQL Server 2005 and the publication of the Davidson whitepaper,
wait statistics became a viable tuning methodology. Administrators and developers
could now use waits and queues to understand exactly why a query was running longer
than expected. Overnight our team transitioned from reacting to query performance
issues to being proactive in understanding which resources the overall database
workload needed most.
Every request sent to a database server has the same constraints: memory,
processing, disk, network, and locking/blocking. It doesn’t matter if you want to rely
solely on execution plans for query tuning; the physical and logical constraints for the
query remain the same: they are just presented differently in an execution plan. The
waits and queue tuning methodology reduces the complexity and time necessary for
query performance tuning by an order of magnitude.
Once you understand how the database engine processes requests, how waits
happen, and how to track them, you are well on your way to being an expert in query
performance tuning.
And that’s the goal of this book. When you are done reading, I want you to have all
the skills necessary to be an expert in query performance tuning. That’s the book I wish
someone would have written and handed to me when I was first starting as a DBA.

xxi
Introduction

To reach the goal, this book has been split into two unequal parts. Part I,
“Foundations of Wait Statistics Analysis,” provides details on how the database engine
processes a query (officially called a request, which is sent by a session, after a connection
to the instance is established) followed by information on how to query wait statistics
information through various SQL Server dynamic management views (DMVs). Part I
finishes with an overview of the Query Store feature and guidance on how to create and
gather metrics to build your own baselines.
Part II, “Wait Types,” dives into specific waits, the causes, some examples, and
possible resolutions. The chapters are divided by wait categories, which is a bit tricky
as some waits (such as PAGEIOLATCH) have overlap between more than one possible
constraint (memory and disk). Therefore, the chapters break down specific waits into
categories by CPU, IO, backups, locks, latches, high-availability and disaster-recovery,
preemptive, background and miscellaneous, and In-Memory OLTP.
Yes, waits for background and miscellaneous are included, despite their being
benign for query performance. It’s important for you to know why (and when) these
waits happen and when they are safe to ignore (they usually are, but not always).
One thing to note, the examples in this book use a database named GalacticWorks.
This is a modified version of AdventureWorks I use for a variety of demos when teaching
my classes. The examples in the book will work with AdventureWorks, so don’t panic
about not having GalacticWorks; you’ll be fine with most versions of AdventureWorks.
When you finish this book, I want you to have the confidence to tackle any query
performance tuning problem. You’ll have the details, information, and knowledge
necessary to be an expert. And maybe soon enough, you’ll be teaching others and maybe
someday write your own book, too.

xxii
PART I

Foundations of Wait
Statistics Analysis
CHAPTER 1

Wait Statistics Internals


SQL Server wait statistics are an important tool for analyzing performance-related
problems and optimizing SQL Server performance. However, they are not always
known to many database administrators or developers. I believe this has to do with their
relatively complex nature, the sheer volume of different types available, and the lack
of documentation for many types of wait statistics. Wait statistics are also directly tied
to the specific SQL Server on which they occur, meaning it is impossible to compare
wait statistics of Server A to wait statistics of Server B, even with identical hardware and
database configuration. Every configuration option, from the hardware firmware level
to the configuration of the SQL Server Native Client on the client computers, will impact
the wait statistics!
Therefore, we will start this book with a review of SQL Server internals pertaining to
wait statistics. We will discuss how wait events are generated, how to view wait events,
and how to analyze them as part of a proper performance tuning methodology. Then in
Part II of this book, we will explore and examine specific wait events.
This chapter will look at the history of wait statistics through the various versions of
SQL Server. Next, we will review the SQL Operating System, or SQLOS. The architecture
of the SQLOS is closely tied to wait statistics and to performance troubleshooting in
general. The rest of this chapter is dedicated to one of the most important aspects of wait
statistics: thread scheduling.
Before we begin, I want to mention a few things related to the terminology used
when discussing wait statistics. In the introduction of this book and the preceding
paragraphs, I mentioned the term wait statistics. The sentence “compare wait statistics
of Server A to wait statistics of Server B” is technically wrong, since we compare the
wait time (the total time we have been waiting on a resource) of a specific wait type (the
specific wait type related to the resource we are waiting on). From this point on, when I
use the term wait statistics, I mean the concept of wait statistics, and I will use the correct
terms wait time and wait type where appropriate.

3
© Thomas LaRock, Enrico van de Laar 2023
T. LaRock and E. van de Laar, Pro SQL Server 2022 Wait Statistics,
https://doi.org/10.1007/978-1-4842-8771-2_1
Chapter 1 Wait Statistics Internals

A Brief History of Wait Statistics


SQL Server has been around for quite some time now. The first release of SQL Server
dates back to 1989 and was released for the OS/2 platform. Until SQL Server 6.0, released
in 1995, Microsoft worked together with Sybase to develop SQL Server. In 1995, however,
Microsoft and Sybase went their separate ways. Both Microsoft and Sybase stayed active
in the database world (SAP acquired Sybase in 2010). In 2022, Microsoft will release
SQL Server 2022, while SAP released SAP Sybase ASE 16 in 2014 (but is still maintained
today), both relational enterprise-level database systems.
Between SQL Server 6.0 and SQL Server 2022, many things have changed, and it is
difficult to compare any two versions alongside one another. One thing which has not
changed through the years is the concept of wait statistics. Each version of SQL Server
stores information about its internal processes. Even though the way we access such
information has changed over the years, wait statistics remain an important part of the
internal logging process.
In early versions of SQL Server, access to wait statistics required the use of
undocumented commands. Figure 1-1 shows how to query wait statistics information in
SQL Server 6.5 using the DBCC command.

Figure 1-1. SQL Server wait statistics for SQL Server 6.5

4
Chapter 1 Wait Statistics Internals

One of the big changes introduced with SQL Server 2005 was the conversion of
many internal functions and commands into Dynamic Management Views (DMVs) and
Dynamic Management Functions (DMFs). This made it easier to query and analyze the
information returned by functions and commands, including wait statistics information.
A new way of performance analysis was born with the release of the SQL Server 2005
Microsoft whitepaper SQL Server 2005 Waits and Queues by Tom Davidson.
In the subsequent releases of SQL Server, the volume of new and different wait types
grew exponentially whenever new features or configuration options were introduced.
If you look at Figure 1-1, you will notice that 21 different wait types were returned.
Figure 1-2 shows the amount of wait types, as the number of rows returned, available in
SQL Server 2022.

Figure 1-2. SQL Server wait statistics in SQL Server 2022

5
Chapter 1 Wait Statistics Internals

With the release of SQL Server 2022 RC0, the number of wait types increased to more
than 1,300 different wait types! The number of wait types will likely continue to grow
in future SQL Server releases, as new features are introduced or existing features are
changed. Thankfully there is a lot more information available about wait statistics now
than there was in SQL Server 6.5!

The SQLOS
The world of computer hardware changes constantly. Every year, or in some cases
every month, we stuff more cores inside of processors, increase the memory capacity of
mainboards, or introduce entirely new hardware concepts like PCI-based persistent flash
storage. Database Management Systems (or DBMSs) are eager to take advantage of new
hardware trends. Because of the fast-changing nature of hardware and the need to utilize
new hardware options as soon as they become available, the SQL Server team decided to
change the SQL Server platform layer starting with SQL Server 2005.
Before SQL Server 2005, the platform layer of SQL Server was restricted, with many
operations performed by the operating system itself. This meant it was difficult for
SQL Server to keep up with the fast-changing world of server hardware, as changing a
complete operating system in order to utilize faster hardware or new hardware features
is a time-consuming and complex operation.
Figure 1-3 shows the (simplified) architecture of SQL Server before the introduction
of the SQLOS in SQL Server 2005.

6
Chapter 1 Wait Statistics Internals

Figure 1-3. SQL Server architecture before the introduction of SQLOS

SQL Server 2005 introduced one of the biggest changes to the SQL Server engine
seen to this day, the SQLOS. This is a completely new platform layer functioning as a
user-level operating system. The SQLOS has made it possible to fully utilize current
and future hardware and has enabled features like advanced parallelism. The SQLOS
is highly configurable and adjusts itself to the hardware it is running on, thus making it
perfectly scalable for high-end or low-end systems alike.
Figure 1-4 shows the (simplified) architecture of SQL Server 2005, including the
SQLOS layer.

7
Chapter 1 Wait Statistics Internals

Figure 1-4. SQL Server 2005 architecture

The SQLOS changed the way SQL Server accesses processor resources by
introducing schedulers, tasks, and worker threads. This gives the SQLOS greater control
of how work should be completed by the processors. The Windows operating system
uses a preemptive scheduling approach. This means that Windows will give every
process that needs processor time a priority and fixed slice of time, or a quantum. This
process priority is calculated from a number of variables like resource usage, expected
runtime, current activity, and so forth. By using preemptive scheduling, the Windows
operating system can choose to interrupt a process when a process with a higher priority
needs processor time. This way of scheduling can have a negative impact on processes
generated by SQL Server, since those processes could easily be interrupted by higher
priority ones, including those of other applications. For this reason, the SQLOS uses its
own (cooperative) non-preemptive scheduling mechanism, making sure that Windows
processes cannot interrupt SQLOS processes.

8
Chapter 1 Wait Statistics Internals

Nerd Note SQL Server 7 and SQL Server 2000 also used non-preemptive
scheduling using User Mode Scheduling (UMS). SQLOS brought many more system
components closer together, thus enabling better performance and scalability.

There are some exceptions when the SQLOS cannot use non-preemptive scheduling,
for instance, when the SQLOS needs to access a resource through the Windows
operating system. We will discuss these exceptions later in this book in Chapter 11,
“Preemptive Wait Types.”

Schedulers, Tasks, and Worker Threads


Because SQLOS uses a different method to execute requests than the Windows operating
system uses, SQL Server introduced a different way to schedule processor time using
schedulers, tasks, and worker threads. Figure 1-5 shows the different parts of SQL Server
scheduling and how they relate to each other.

9
Chapter 1 Wait Statistics Internals

Figure 1-5. SQL Server scheduling

Sessions
A session is the connection a client has to SQL Server after it has been successfully
authenticated. We can access session information by querying the sys.dm_exec_
sessions DMV using the following query:

SELECT *
FROM sys.dm_exec_sessions;

In older versions of SQL Server, user sessions had a session_id greater than 50;
everything lower was reserved for internal SQL Server processes. However, on very busy
servers, there was a possibility SQL Server needed to use a session_id greater than 50. If
you are only interested in information about user-initiated sessions, it is better to filter
the results of the sys.dm_exec_sessions DMV using the is_user_process column instead
of filtering on a session_id greater than 50. The following query will only return user
sessions and will filter out the internal system sessions:

10
Chapter 1 Wait Statistics Internals

SELECT *
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;

Figure 1-6 shows a small part of the results of this query.

Figure 1-6. sys.dm_exec_sessions results

There are many columns returned by the sys.dm_exec_sessions DMV that provide
information about each session. Some of the more interesting columns include the
following:

host_process_id – The process ID or (PID) of the client program


connected to SQL Server will show NULL for internal sessions.

cpu_time – The amount of processor time (in milliseconds) the


session has used since it was first established.

memory_usage – The amount of memory (8k pages) used by the


session since it was first established.

reads – Number of reads performed by this session since it was


first established.
writes – Number of writes performed by this session since it was
first established.

row_count – Number of rows returned for this session up to


this point.

status – Possible values include “running,” “sleeping,” “dormant,”


and “preconnect.”

The most common values of the status column are “running,” which indicates that
one or more requests are currently being processed from this session, and “sleeping,”
which means no requests are currently being processed from this session.

11
Chapter 1 Wait Statistics Internals

Requests
A request is the SQL Server execution engine’s representation of a query submitted by a
session. Again, we will use a DMV to query information about a request; in this case, we
query the sys.dm_exec_requests DMV:

SELECT *
FROM sys.dm_exec_requests;

Figure 1-7 shows a portion of the results of this query.

Figure 1-7. sys.dm_exec_requests results

The sys.dm_exec_requests DMV is an incredibly powerful tool for troubleshooting


performance-related issues. This DMV has a lot of information about current queries
and helps detect performance bottlenecks relatively quickly. Because the sys.dm_exec_
requests DMV also displays wait statistics–related information, we will take a thorough
look at it in Chapter 2, “Querying SQL Server Wait Statistics.”

Tasks
Tasks represent the work to be performed by the SQLOS, but tasks do not perform any
work themselves. When a request is received by SQL Server, one or more tasks are

12
Discovering Diverse Content Through
Random Scribd Documents
The Project Gutenberg eBook of A Queen of Nine Days
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.

Title: A Queen of Nine Days

Contributor: E. C. Kenyon

Release date: September 1, 2021 [eBook #66202]

Language: English

Credits: Al Haines

*** START OF THE PROJECT GUTENBERG EBOOK A QUEEN OF


NINE DAYS ***
"WE MUST HIDE HERE A LITTLE WHILE," SAID MY RESCUER
A QUEEN OF NINE DAYS

BY HER GENTLEWOMAN

MARGARET BROWN

EDITED AND DONE INTO MODERN ENGLISH

BY

EDITH C. KENYON

LONDON
THE RELIGIOUS TRACT SOCIETY
4 BOUVERIE STREET & 65 ST. PAUL'S CHURCHYARD, E.C.
Made and Printed in Great Britain by
Butler & Tanner Ltd.,
Frome and London

CONTENTS

CHAPTER

Prologue

I Leaving Home

II My Champion

III Hiding from the Enemy

IV Better Happenings

V Lady Caroline talks with Me

VI Papistry or Protestantism

VII Sir Hubert and I

VIII Lady Jane Grey

IX Plato

X Queen of England

XI By the River

XII In the Tower

XIII At St. Paul's Cross


XIV The Crown Resigned

XV At Sion House Again

XVI In The Power of Sir Claudius

XVII The Prisoner in the Dungeon

XVIII On the Point of Being Wed

XIX Escaping from the Enemy

XX A Trying Experience

XXI Queen Mary's Boon

XXII With Lady Jane

XXIII Wyatt's Insurrection

XXIV Lady Jane's Death Sentence

XXV Some of Lady Jane's Last Words

XXVI Lady Jane's Execution

XXVII Conclusion. Home Again

Epilogue

PROLOGUE

It has been laid upon me as a very solemn duty by the late Lady Jane
Dudley, or Grey as she is usually called, to whom I owe obedience and
fealty born of love, which is all the more insistent because she is no longer
here to claim it, that I should set forth, in the best language possible to one
of my limited education, the stirring events that my eyes have witnessed
and the true story, as it is known to me, of the short, sad tragedy of her life
and death. And this being so, I will make no excuse for my boldness and
presumption in attempting work which might well be left to learned and
authoritative historians, especially as I remember that my dear lady said to
me, Margery, others may write more learnedly on the matter, but loving
eyes see further and more truly than those of the mere critic, and I would
fain be represented to posterity as I am rather than as I am supposed to be.
And, fear not, child, for though you are weak and humble in your own eyes,
His grace and help are to be had for the asking, Who gives power to the
faint, and to such as have no might increases strength.' For my lady knew
that this is a righteous task which she was setting me—the representation of
truth, as we know it, is always righteous—and to those who do the like His
promises never fail.

MARGARET BROWN.

CHAPTER I

Leaving Home

It was in the month of May, in the year 1553, and I was a young girl,
only seventeen, when my dear father—my mother being dead—astonished
me beyond measure by disclosing the fact that I was to leave my home in
Sussex and proceed to the city of London, there to become gentlewoman to
a lady of high degree.

That was not the sort of life I should have chosen by any means, for my
freedom was as dear to me as to any of God's creatures of earth, or sea, or
sky. Having no mother, and with a most easy-going father and a brace of
madcap young brothers, I had run wild all my life, and could ill brook the
idea of being confined within four walls for the most part of my days,
attired in the fine clothing of a grand lady. What compensations should I
have for such joys as lying for hours on the soft turf of the Downs, looking
up to the blue sky and making out pictures in the white clouds flitting
across it, whilst I listened to the singing of the skylarks, or sitting beneath
an overturned boat on the seashore, hearing the lapping of the waves and
gazing across the Channel, with wondering speculations of the lands
beyond those fair blue waters, or, on the other hand, rowing out upon the
sea with my brothers, or riding with them at breakneck paces over hill and
dale? What would they do without me, little Hal with his endless scrapes
and foolhardy schemes, and Jack with his love of fighting and passionate
essays to assert the manhood latent in him? Notwithstanding my wildness, I
was a softening influence in their lives, for there was in me ever, even then,
the consciousness which is not very far from any of us that there is a Higher
Law than even the sweetest promptings of our own fond wills. I never
talked about it—father used to say, 'Many words show weakness in a
cause'—much less preached to the boys, but I knew it was so and they were
aware I knew it, and that was quite enough. They were good lads, and, as
the serving men and women said, I had them at a word.

I did not like the thought of leaving my brothers, or my father, or, as I


have said, my freedom and the skylarks, turf, sky, clouds, seashore and
mystery of wild sea-waves, with the unknown lands beyond, but never
thought of opposing my father's will, and, easygoing though he was, dared
not question it; however, I went down to the parsonage to speak to Master
Montgomery, our curate, of the matter, and, after listening to all I had to
say, and cheering me with descriptions of wondrous sights to be seen in
London, he uttered wise words, which stilled my trouble mightily.

'Child,' he said, laying his hand gently on my head, 'listen to me. This
call which has come to you is not of your own seeking, therefore it must be
from Him Who alone was found worthy to hold the Book of Life—the lives
of His people—in His hands. He Who called Rebekah from her water-pot
and David from his sheep, Elisha from his ploughing and the praying
women of Jerusalem to follow Him to the Cross, is surely calling you to do
some special work. It may be lowly in its nature, or it may be great, but
whatever it be, it is surely work that you and no one else can do. Like the
little maid who was carried away into captivity and did great things for her
master Naaman, the Syrian, so, it may be, you, too, may carry help and
healing to some afflicted one amongst those whom the world calls mighty.
And remember,' he added very earnestly, 'remember that you can do nothing
in your own strength, but that with the help of the Holy Spirit, which is
given to those who ask for it, all things will be possible.'

I went away, feeling very solemn and almost more frightened than
encouraged, and it was a relief to my over-charged heart when, as I was
going home with great soberness, I encountered Hal, bareback on his black
pony, tearing along like wildfire, and calling to me to follow, as there was a
ship passing in the Channel, and so I ran after him down to the beach; and
what with one thing and another, I did not give Master Montgomery's words
their full consideration until the time came when, being far away from him,
I found my thoughts recurring to them.

Before I set off to London City there was great to-do amongst the
women servants in making me sufficient garments for a lady's wardrobe,
and it was a wonderful sight to see the things they got together and the way
they wished to dress me. I did not like it very much, for I did not think I
should ever be able to skip and play and ride bareback attired in that
fashion, but my father said I was a child and knew nothing about it, and
they were women and ought to know what they were doing; so we left it all
to them, and I put off the thought of wearing their handiwork as long as
possible.

The day before I went my father informed me about those to whom I


was going. It seemed the Duke of Northumberland, knowing my father, Sir
Henry Brown, with whom he had been in battles in their younger days, had
sent for me to come and be one of the gentlewomen of his daughter-in-law,
the young Lady Jane Grey, newly married to his fourth son, Lord Guildford
Dudley, in London City. My father said that it was a great distinction for me
to be selected out of scores of other country maidens for the work, and that
if ever I had speech with the noble duke I was to thank him heartily for his
favour towards us—this I promised readily, not knowing what manner of
man that was whose doings were afterwards an enormous factor in working
dire woe to those I loved. And then my father went on to say that business
of importance would prevent his going with me on this my entrance into the
big world—oh, father! I saw through that, for was it not from you I
inherited the nature which loved home and freedom better than the life
among great people of exalted rank?—but he said he would send me with
old and trusty servants, who would take me safely in a horse-litter from our
town of Brighthelmstone[1] on the south coast, all the long way to Sion
House, in Isleworth, near London City, where my Lady Grey was residing
at that time.

[1] Now called Brighton.—ED.

And the next day, after a troubled leave-taking from all I loved so dearly,
I suffered him to bestow on me his blessing, which he did with many words
of touching kindness, and put me in the litter.

I must confess that I did not perceive very much of the road we went
over during the first part of my journey, owing to a weakness which came
on in my eyes and a sickness and dejection of spirit such as I had never
previously known, and my good maid Betsy proved to be very annoying for
talking over much, which was indeed her wont when excited, and making
doleful laments about the dangers of the way and the roughness of the roads
that, without doubt, somewhat impeded our progress.

But afterwards, after a long while, I felt better and could think less
miserably of my father's tender blessing and of the sudden breakdown and
loud crying of poor Jack and the afflicting disappearance of Hal, who I
knew had hidden himself in order that he might get over the parting in
secret, and the crying of the woman servants we left behind, and solemn
faces of the men and the waving of Master Montgomery's old hat as we
passed the parsonage, so that by the time we neared a neighbouring castle I
could even look admiringly upon it. We stayed that night at Horsham, in a
queer little inn kept by a monstrously fat innkeeper and his exceedingly thin
wife, who at another time would have amused me greatly by her fussiness
and servility.

And the next day we proceeded on our way, passing many strange and
curious places, but meeting with no brigands and no mishap at all until it
chanced that, on the King's highway, we came upon a group of unruly, wild-
looking men and boys, who were dragging a poor old woman, with great
violence, towards a large pond.

'What is the matter? Oh, Betsy, see!' I cried. 'What are those men doing
to that poor old woman? Look! they are dragging her to that pond! Poor
creature! They will hurt her!'

'Mistress, 'tis only a witch!' cried Betsy, who had been told to call me
Mistress now that I was going to be a great lady. 'Suchlike do much harm,'
she continued. 'They sell their souls to the devil for gold; they meet each
other on broomsticks riding through the air, and plot mischief. From such
may we be delivered!' she went on fervently. 'They had better be drowned!'
she concluded.

'No, no. 'Tis cruel! Tell Humphrey to stop.' And I myself called to the
men to stay the horses bearing my litter, and looked out full of sympathy
with the poor old creature. Was there no one to stand up for her, no one to
stay this rough horse-play which was going on? Master Montgomery had
always taught us to treat the aged with reverence, and therefore it seemed
truly shocking to me, as also most alarming.

'Forsooth, Mistress Marg'et,' said Joseph, my lacquey, coming to my


litter, ''tis the country roughs that are just wild to drown yon old witch.'

'But they shall not!' declared I vigorously; 'they shall not! Stop it,
Joseph! Stop it at once!'

'Mistress, I cannot! The men are just mad! Hark at their shouts! They are
wild to do it.'

'They shall not do it!' cried I. 'Tell them, Joseph, that Mistress Margaret
Brown forbids it.'
Joseph and Timothy, the head man, and John, the other lacquey, looked
timidly towards the crowd of excited men and boys who were shouting,
gesticulating and urging on each other to drag along the old woman with
cuffs and kicks.

I got out of my litter and looked round. It was such a beautiful country,
on one side great woods just bursting into leaf, on the other green
meadowland, threaded by a silvery stream and studded here and there with
blossoming hawthorn trees. Nowhere could I see a house, yet some there
must be not far distant, judging from the crowd of men and boys. Alone,
with my few servants, what could I do? Who would have suspected that in
such a lovely place there could be doings so outrageous?

'I must speak to them, Betsy,' I said, and across my mind flashed the
thought that perhaps Master Montgomery was thinking of some such work
as this when he spoke of that to which he believed I was being called.[2]

[2] Young people are usually in haste. They always aim to reach the end
of things at once; they cannot wait.—ED.

'Oh, no, mistress! You must not, indeed you must not interfere!' cried the
terrified woman.

'Hold thy tongue, Betsy,' said I. 'I shall go to them and speak,' and in my
heart I prayed for help where Master Montgomery said it would never be
denied.

And then I advanced towards the roughs, who turned to look at me in


amazement.

In a tone and in a manner of authority, for my father always said that it


was no use speaking otherwise to knaves, I bade them cease from
persecuting a poor old woman who might be innocent of all offence, and
passionately adjured them to refrain from violence.
The effect of this was marvellous. Releasing their victim, they fell back,
and she, poor soul, knelt on the grass before me, crying out for mercy and
catching hold of the border of my gown.

'What has she done?' I asked.

A Babel of voices answered. The old woman had brought disease on


Farmer North's cattle. She had turned her evil eye on a young woman who
had straightway sickened and died. She had looked on a man as he rode to
market and his horse had run away, thrown him off and killed him. Last of
all she had spirited away her own orphan grandson, a boy of great promise,
who had been committed to her care by his deceased parents and of whom
she had professed to be very fond. This young man was believed to have
been sent through the earth to the abodes of the lost.

'I did not do it, lady! I did not! Saul was the darling of my old age. I
know no more than they where he has gone. I am no witch. Ask the
minister; he knows.'

This and much more cried the poor old dame in quavering tones.

'Listen to her. She is innocent,' I said authoritatively to the rascals, who


were recovering themselves and again holding out threatening hands. 'She is
a poor old woman, very lame and infirm.'

That did not touch them, so I seized a weightier argument.

'Have you not heard,' I said, 'of One Who laid His hands upon the sick
and lame and made them whole? Jesus had compassion on the multitude.
He took pity on the infirm. He laid His hands on them and blessed them. He
——'

'He sent the devils into the swine, so that they ran into the sea,'
interposed a man's voice grimly.

'The devils? Yes. But not the man out of whom they were driven. He sat
at Jesus' feet, clothed and in his right mind.'
'True! true!' cried several voices.

It really seemed as if mercy were going to win the day. But at that
moment, with a tremendous noise, a number of men and boys came round a
bend in the road, dragging forward a wretched object whose head was
hidden in a man's jacket.

'A witch! A witch!' yelled the newcomers, brandishing their sticks.

'And we have another! Ha! ha! ha!' laughed and shrieked the men and
boys beside me.

Then I perceived that the newcomers were led on by as evil-looking a


young man as you could see anywhere. His dress showed him to be a
knight, but anything more unknightly than his manner and his conduct
could not well be found; he seemed just like the knaves who formed his
company, and an ill-looking lot they were, with scarcely a whole garment
among them.

'Oh, mistress,' said Timothy, who had left his horses that he might have
speech with me. 'Yon is Sir Claudius Crossley, who is said to be your
father's sworn enemy. I pray you make haste and get into the litter before he
recognizes you. Then we will drive away as fast as the horses can take us.'

'Save me! Save me, lady!' cried the old woman, clinging to my feet, as
my hands tried to drag her away.

How could I desert her? It was hard on my servants, but I would not
listen to their advice. For I saw nothing, heard nothing but that pitiful old
woman, with her despairing cries to me to save her, and the menacing
crowd of villains thirsting for her life.
CHAPTER II

My Champion

I began to speak again to the villains, repeating much that I had said
before, with even greater earnestness.

Sir Claudius Crossley stared at me, and listened for a moment or two
with a bewildered air. Then perceiving the drift of my words, he rudely
shouted to me to shut my mouth, and, signing to his men, they caught up
the old woman at my feet and bundled her along to the side of the other
victim, interposing several of their broad backs between me and the poor
old creatures.

The road being now completely blocked by the shouting men and boys,
my servants closed round me and literally carried me back to the litter. In
truth they were themselves of the opinion that the old women were witches,
who had sold themselves to the devil for a term of years, and ought
therefore to be put to death.

I was perforce obliged to sit in my litter, but it could not proceed because
of the crowd which blocked the way. I would not look towards the wretched
scene, but Betsy would not refrain from telling me every detail of what was
taking place with the supposed witches and their enemies.

'Both old women are witches, mistress,' she cried. 'I thought so, and now
I know it; they are ugly as sin. The men are making them confess. The way
they do it is to pull their hair and screw their wrists until they say for what
sum the devil has bought their souls, and for what length of time they have
bound themselves to serve him. No, mistress, Timothy will not allow you to
interfere. He promised Sir Henry that he would take you safely to Sion
House, near London, and he means to do it. Now, mistress, they are tying
the witches' thumbs together—the two of them are being tied together by
the thumbs, I mean—and now they are going to throw them into the water.
If they do not sink, they will know they are witches, and will force them
under; if they sink, they will drown, so there will be an end of them in any
case.'

'Oh, this is terrible—terrible!' I cried. Putting my head out of my litter, I


called to the ruffians to cease their cruelty. 'It is murder,' I said; 'it is nothing
but murder! "Thou shalt do no murder."'

But I might as well have spoken to the wind, which was beginning to
rise in fitful gusts.

The mob—for by this time the crowd had become a howling mob—was
in no mood to be stayed from proceeding to extremities. A shower of mud
and stones was flung at my litter and its attendants, one of the men-servants
receiving a blow upon the shoulder, which might have put it out of joint,
being most violent.

'Wait till we have drowned the witches, then we will come for you!'
shouted Sir Claudius cruelly.

'Ay, ay, sir!' chorused many voices.

This was alarming. My servants put their heads together, muttering their
fears. I overheard them saying that they had seen the witch looking hard at
me as she begged for mercy, and that I might be doomed, and what could
three men and a woman do against more than a hundred ruffians?

'Mistress,' said old Timothy to me at length. 'We can do nothing against


so many, and unfortunately we have already incurred their anger. Far better
would it be, therefore, for us to turn and flee whilst they are occupied in
drowning the witches.'

'Flee! Do you mean that?' exclaimed I.

'Yes. Yes, mistress dear. And quickly—quickly! It is our only chance.'

And Timothy looked affrightedly at the angry faces of the mob.

'Nay. But that is cowardly!' I cried, 'to run away and think only of our
own skins when the weak and old are being murdered!'
'We shall be murdered ourselves in a few more minutes if we stay here,'
muttered the old man. 'Child,' he said, forgetting my new dignity, which
indeed profited me nothing just then, 'it is to save our lives—yours, the
most precious of all. How could I face Sir Henry again if you were killed?'

And his voice shook.

'Killed! Killed? Are they threatening that? Oh, but, Timothy, we have
never done them any harm.'

'Ay, but you have!' cried the loud, domineering voice of Sir Claudius, as
he thrust himself forward to get between Timothy and me. 'You have tried
to stop our sport!'

'Sport!' cried I, with the most mighty contempt I ever felt in all my life.
'Sport! Call you it sport to torture and kill poor feeble old women?'

Angered by my words, the miscreant was about to lay hold of me with


his great hands, when the lacquey Joseph gave him a blow of the fist which
sent him staggering into the midst of his men.

Alas, that was, as it were, a signal for hostilities to commence. Men and
boys rushed on us from all sides. My men-servants were seized by
overpowering numbers and hurled to the ground, and I myself was lifted
bodily out of the litter and set on a bank by the roadside, so that all might
see me.

The two old women were drowned now—their murderers thirsted for
more blood, and Sir Claudius, smarting from the treatment he had received
from the hands of my good Joseph, yearned above all things for revenge.

'Eh, lads! What shall we do to my lady?' he asked mockingly, pointing to


me.

'Drown her also,' suggested one, with a hoarse laugh.

'Strangle her,' cried another.


'Carry her away to some remote country place, and then get money from
her friends before we will tell them where she is,' said a third.

Cries of approval and many alternative suggestions arose from the mob.

Looking from one to the other, I could see no pity, no relenting


anywhere, least of all in Sir Claudius. I spoke to him.

'I am a lady,' I said; 'where is your chivalry?'

The man had not any, but I thought it as well to cry out for what ought to
have been there.

'You tried to save those witches,' he began.

'And you will try to save me, will you not?' I asked, looking at him, with
the vain hope that I should see something which was not there.

'That I will not!' cried the churl.

'Shall we drown her, Sir Claudius? Shall we drown her, too?' demanded
many voices.

'Help! Help for a lady! Help for Mistress Brown!' shouted the lacquey
Joseph with his loud, stentorian voice. The honest fellow had been bound
hand and foot; he had nothing left but his voice with which to serve me, and
the next moment it was silenced with a blow and a gag; but it had done
good work.

Noiselessly over a soft fallow field a little group of horsemen had


approached, and at the sound of that loud, manly cry of my poor Joseph's
they charged into the mob, calling out lustily:—

'Disperse, in the King's name! In the King's name I say disperse!'

Bullies are cowards all the world over. The men who had drowned old
women and were threatening a defenceless girl with a like fate, took to their
heels with one accord, knocking down each other and falling over each
other in their flight, whilst, alarmed and struck, first on this side and then on
that, my horses set off galloping, and dashed, with the litter, amongst the
crowd, treading down some and crushing others. The damage they did was
appalling. Curses, shouts, groans and screams filled the air on every side.

In a few moments none of the roughs remained near me, and I was
enabled to look up at my deliverer.

He was a handsome knight of medium size and frank, soldier-like


deportment and bearing; as I found afterwards, he was scarcely twenty-six,
yet he looked much older, having seen service in the profession of arms
from his boyhood. He was dressed in crimson velvet, very worn and travel-
stained. Indeed, both he and his horse bore traces of a rapid journey across
country, as did also his followers and their horses.

'How shall I thank you?' I said gratefully. 'Sir, you have saved my life.'

'I thank God that I came in time,' he said. 'I fear those rascals have
terrified you much.'

'I fear they have hurt my good serving-men,' I said, looking round for
them.

My champion, desirous of serving me still more, picked up my poor


Timothy, who, having been thrown down and trampled upon, was in no
little pain. He breathed better, however, when his arms were freed and his
legs unbound, and began to lament the loss of the horses and litter, which
made us think he was coming round finely. We left him, therefore, to look
to Joseph, who was in a desperate state, having been almost smothered by
the gag which was tied over his mouth and nostrils. His face, swollen and
discoloured, was fearful to look upon, but I took his poor head on my lap
and endeavoured to induce him to drink from a flask my rescuer had put in
my hand.

The good knight stood by me, with the kindest eyes it seemed to me that
I had ever seen.

'Give him time,' he said; 'give him time. There is no hurry.'


It seemed to me, as I glanced at him, that he would have stood there all
day with great content, so long as he could watch me doing things, and no
doubt he was tired, having ridden far.

'But look after the others, please,' I said, feeling anxious about Betsy and
John.

'They are all right,' he answered. 'They have picked themselves up


bravely. And your man is coming round.'

Then one of his followers came up to him, saying, 'Sir Hubert, we do


wrong to linger here. Those villains will return with greater numbers, bent
upon wreaking vengeance. There was one amongst them of good birth, and
a knight, but of low nature, who is notorious for crime. He will return, if no
one else does; and the lady——'

The rest of the sentence I could not hear, but it seemed to mightily excite
my brave deliverer.

Joseph was sitting up whilst this was going on, and begging my pardon
for the liberty he had taken in lying down with his head on my lap. At the
same moment John and Betsy declared themselves recovered.

'Lady,' said the knight, ''tis necessary that we hurry on. Say, could you
ride my horse? Or stay, Smith,' turning to one of his men, 'you have a quiet
nag; bring her here for the lady.'

'Is there no hope of recovering my litter?' I asked, adding, 'I am going all
the way to Sion House, near London, where the Duke of Northumberland's
daughter-in-law awaits me.'

'The litter is lost to you,' was the startling answer. 'If we wait here for its
return, or pursue those runaway horses, we shall be lost too. Madam,' the
knight bent his head to speak softly in my ear, 'I will not hide it from you.
These are fearful times for a lady to be travelling alone with so small a
retinue. Lawless men, such as those that have just been routed, might carry
you off where your friends would never hear of you again——'
'Why frighten us?' I interrupted, but had no time to say more, for the
noise of brawling again broke upon my ear.

The knight turned to his men, saying, 'They are coming. They are many,
we are few. We must ride back the way we came, across the fields. Take up
the lady's men and woman.'

And with that he lifted me hastily from the ground, and, placing me upon
his own horse, vaulted lightly into the saddle behind me.

'Hold fast, madam,' he said in my ear. 'Put your arms round my neck; so.
That is it. Now, Sultan, good horse, gallop thy fastest!'

Whinnying low, the horse tore off across the fallow fields, and away we
went like the wind, but I did not know even so much as the name of the
valiant knight to whom I was clinging as for life.

CHAPTER III

Hiding from the Enemy

I had been carried off in such haste as left me no time to look back and
see if my servants were equally well mounted, and for some time all I could
do was to cling to my cavalier. I felt his heart beating as I did so and his
warm breath fanning my cheeks. Moments seemed hours as they passed.

And now shouts and the sound of pursuing horsemen entering the fields
in full career after us sounded in our ears, and, looking back, we saw a
company of riders as well as foot-runners.

'Hold tight, madam; we take the fence. Hurrah! old Sultan has done it!'
cried my knight, and we were over and speeding across a meadow long
before any one else had reached the fence.
Presently I heard shooting, and, looking back, perceived that my knight's
men, hampered by the wounded servants and unable to leap the fence, were
obliged to turn and fight. This kept back the pursuers and gave us a better
chance of escape.

My cavalier drew rein and looked back across the meadow. Alas, four
horsemen, having separated themselves from the others, had just leaped the
fence and were galloping after us.

'Sultan, good horse!' cried my knight encouragingly, and his steed


answered with a low whinny, and galloped along as before. 'Cling to me,
madam. Hold tight!'

Again I clung to him convulsively, not venturing to speak about my fears


for my poor servants and our own perilous position.

Another higher and thicker fence was leaped, not quite so successfully
this time, for poor Sultan was just done and, floundering, caught his hoof in
a long hawthorn branch. Down he fell upon his knees, and I saw stars and
thick darkness.

When I came to myself, I found I was being carried in the strong arms of
the good knight. I said nothing, for indeed what could I say? What he was
doing for me that day I should never forget, never in all my life. But I could
not speak of it.

Presently I could see that we were passing through a plantation of young


trees, on a path so narrow that my rescuer had much difficulty in carrying
me through it. He was exceedingly careful lest I should receive a knock
from some too prominent bough or tree-trunk, yet I noticed he bruised his
own hands more than once in his endeavour to protect me. I thought I
should never feel the same about those hands again; they had suffered for
me. Once as he carried me on I tried to wipe off the blood that flowed from
a scratch on his neck with my neckerchief, torn off for the purpose, much to
his concern.

'Do not,' he said. 'It does not matter about me.'


But I persisted that it did, and bound his neck with the neckerchief,
begging him to permit the liberty I was taking.

He looked at me then very kindly, saying, 'No one ever took so much
trouble about me before,' and that seemed to me the most extraordinary
shame that ever was.

When we were through the plantation we found a wooden shanty, or


covered shed, in the field at the other side of the trees. The door of the place
was not locked, and my knight set me down upon my feet and opened it.
Then he led me in, and we found there was an old cart in it, full of cut grass.

'We must hide here a little while,' said my rescuer. 'Perhaps our pursuers
will not come to this side of the trees.'

'I am afraid they will,' returned I, 'if they saw us entering the wood.'

'Then we must hide,' said he. 'Madam, can you get into the cart?'

'Easily,' I answered. 'My name,' I added shyly, for it was awkward for us
not to know each other's names, 'is Margaret Brown.'

'Mistress Margaret Brown,' said he, pronouncing the words so


beautifully that it seemed to me my cognomen had never sounded half so
well before. Then he added, 'And mine is Hubert Blair.'

'Sir Hubert Blair?' said I thoughtfully, thinking what a very nice name it
was and how well it seemed to suit the man.

'Yes,' answered he with a smile. 'But now, Mistress Brown, please to get
into the cart and lie down. Then I will cover you with the cut grass which
half fills it.'

'Will you hide yourself too?'

'Aye, aye.'

He assisted me into the cart and piled the grass over me, even putting a
thin layer of it over my head. Then, perceiving a heap of grass in the corner
of the shed, and, thinking he could conceal himself more quickly in it, he
told me that he was going to do so, beseeching me, whatever happened, to
make no sound, but to lie still where I was hidden.

'You may rely upon me,' I said. 'You, Sir Hubert, are the captain of this
adventure, and I know how to obey.'

Sir Hubert then hid himself as well as he could in the heap of cut grass in
the corner of the shed, and scarcely had he done so when the noise of men
and horses was to be heard outside.

Presently a man pushed the door open and entered.

'What's in here?' he said aloud. 'A queer sort of a shed! Better call the
others. But no, it seemeth empty, except for this grass. What have we here?'

He had approached the cart, and was peering in cautiously.

'Bad farming to leave so much stuff in a cart!' he went on, poking the
grass a little with his stick, or weapon.

I trembled, and was fearful that my trembling would cause the grass to
move. Indeed, he must have seen something of the sort, for he said in a low
tone, 'Thou needst not fear. As sure as my name is Jack Fish, I will keep the
other men out of this place.'

With that he went away, returning, however, in a moment to add, 'Thou


hadst best keep here a little while longer before thou attemptest to go away.
I am a true man. I will keep thy secret.'

With that he crossed over to the heap of grass in the corner of the shed,
behind which Sir Hubert was hidden. Then, being of a playful humour, he
began to poke the grass heap gently with his foot, blustering a little as he
did so.

'Hullo!' said he, ''tis strange how men and grass become mixed in these
days! Easy now, don't show thyself! I am a truthful man, and I want to say I
have seen no one. Thou needst not fear.'
'Thanks. You are a good man.'

The words came out of the grass with weird effect.

'I'll get the others away from here directly; I really joined them to
prevent their doing mischief. But do not stir for half an hour or so. Then
keep well to the right and thou wilt regain the high road, and perchance find
thy litter awaiting thee.'

Now Sir Hubert was so delighted to hear this, and so certain that the man
was a friend, that he threw the grass off him and sat up, but was instantly
almost smothered with the quantity of green stuff the other immediately
threw over him.

The next instant another voice at the door inquired: 'Is any one hidden
here, Jack Fish?'

''Twas a fancy of mine to search the shanty. However, I might have


known those fugitives would not have ventured to stay here,' returned
Master Fish.

'Well, there is no place to hide in here, unless it be the cart. Have you
looked into that grass on it?'

'Aye, aye. I've poked about it rarely, but nothing bigger than a mouse ran
out of it.'

'Well, come on then, if there is nothing here,' cried the other impatiently.

They left the shed, Jack Fish lingering a moment to close the door and to
say noisily to those within and those without, 'All right! All right!'

We were still for the next ten minutes, which seemed an age; then Sir
Hubert said:

'He was a good old fellow yon, and I liked his hint about your litter. It
will be a fine thing indeed if we can find it on the high road when we get
there.'
'Yes indeed,' I said, 'and my servants too, which last is a matter of more
importance, for they are very dear to me.'

I had raised my head out of the grass, and was sitting up.

'Do you think I can get out of the cart now?' I asked.

'Not yet. Wait a little longer where you are. I will look round outside;'
and shaking off the grass sticking to him on all sides, Sir Hubert proceeded
to the door, at which he listened cautiously before attempting to open it.

The next moment he stepped back quickly to his place in the corner,
saying, 'Some one is coming.'

Then he hid himself under the grass as before.

An old man entered, with a large two-pronged hay fork in his hand.

'They will have stolen my cart, I'll be bound!' he said aloud.

He looked suspiciously around, but gave a grunt of satisfaction upon


seeing the cart.

Approaching it, he was about to plunge his fork into the grass, when Sir
Hubert sprang up, caught hold of the tool and wrenched it from his grasp.

'Your pardon, master,' said the knight hastily to the man. 'But I have
placed something in your cart which you might unwittingly have damaged
had you plunged your fork into it.'

'Cannot a man do as he likes in his own shed?' cried the old countryman.
'And who art thou,' he demanded, 'and what business hast thou here?'

'I am Sir Hubert Blair, of Harpton Hall, in Sussex. I was travelling in


these parts with but a few retainers, when I met with a lady and her servants
set upon by roughs and in danger of their lives. I carried the lady on my
own horse across the fields until a mischance happened to my horse in
leaping the last fence before we came to the wood close by. He fell down on

You might also like