100% found this document useful (2 votes)
19 views

Download Refactoring Legacy T SQL for Improved Performance Modern Practices for SQL Server Applications 1st Edition Lisa Bohm ebook All Chapters PDF

Improved

Uploaded by

mhboljudith
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
19 views

Download Refactoring Legacy T SQL for Improved Performance Modern Practices for SQL Server Applications 1st Edition Lisa Bohm ebook All Chapters PDF

Improved

Uploaded by

mhboljudith
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 62

Download the full version of the textbook now at textbookfull.

com

Refactoring Legacy T SQL for Improved


Performance Modern Practices for SQL Server
Applications 1st Edition Lisa Bohm

https://textbookfull.com/product/refactoring-
legacy-t-sql-for-improved-performance-modern-
practices-for-sql-server-applications-1st-edition-
lisa-bohm/

Explore and download more textbook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

High Performance SQL Server: Consistent Response for


Mission-Critical Applications 2nd Edition Benjamin Nevarez

https://textbookfull.com/product/high-performance-sql-server-
consistent-response-for-mission-critical-applications-2nd-edition-
benjamin-nevarez/
textbookfull.com

High Performance SQL Server Consistent Response for


Mission Critical Applications 2nd Edition Benjamin Nevarez

https://textbookfull.com/product/high-performance-sql-server-
consistent-response-for-mission-critical-applications-2nd-edition-
benjamin-nevarez-2/
textbookfull.com

Pro SQL Server Relational Database Design and


Implementation: Best Practices for Scalability and
Performance Louis Davidson
https://textbookfull.com/product/pro-sql-server-relational-database-
design-and-implementation-best-practices-for-scalability-and-
performance-louis-davidson/
textbookfull.com

Adams And Stashak's Lameness In Horses Seventh Edition.


Edition Gary M. Baxter

https://textbookfull.com/product/adams-and-stashaks-lameness-in-
horses-seventh-edition-edition-gary-m-baxter/

textbookfull.com
The Revolution Will Not Be Funded Beyond the Non Profit
Industrial Complex Incite! Women Of Color Against Violence

https://textbookfull.com/product/the-revolution-will-not-be-funded-
beyond-the-non-profit-industrial-complex-incite-women-of-color-
against-violence/
textbookfull.com

Polylactic Acid A Practical Guide for the Processing


Manufacturing and Applications of PLA 2nd Edition Lee Tin
Sin
https://textbookfull.com/product/polylactic-acid-a-practical-guide-
for-the-processing-manufacturing-and-applications-of-pla-2nd-edition-
lee-tin-sin/
textbookfull.com

Human-Machine Shared Contexts 1st Edition William Lawless


(Editor)

https://textbookfull.com/product/human-machine-shared-contexts-1st-
edition-william-lawless-editor/

textbookfull.com

Greek islands Lonely Planet

https://textbookfull.com/product/greek-islands-lonely-planet/

textbookfull.com

Utilising Biomass in Biotechnology: A Circular Approach


discussing the Pretreatment of Biomass, its Applications
and Economic Considerations Helen Treichel
https://textbookfull.com/product/utilising-biomass-in-biotechnology-a-
circular-approach-discussing-the-pretreatment-of-biomass-its-
applications-and-economic-considerations-helen-treichel/
textbookfull.com
Dictators, democrats, and development in Southeast Asia:
implications for the rest 1st Edition Michael T. Rock

https://textbookfull.com/product/dictators-democrats-and-development-
in-southeast-asia-implications-for-the-rest-1st-edition-michael-t-
rock/
textbookfull.com
Refactoring
Legacy T-SQL
for Improved
Performance
Modern Practices for SQL Server
Applications

Lisa Bohm
Refactoring Legacy T-SQL
for Improved Performance
Modern Practices for
SQL Server Applications

Lisa Bohm
Refactoring Legacy T-SQL for Improved Performance: Modern Practices for
SQL Server Applications
Lisa Bohm
Chardon, OH, USA

ISBN-13 (pbk): 978-1-4842-5580-3 ISBN-13 (electronic): 978-1-4842-5581-0


https://doi.org/10.1007/978-1-4842-5581-0

Copyright © 2020 by Lisa Bohm


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 image designed by Freepik (www.freepik.com)
Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street,
6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail [email protected],
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 [email protected], or visit http://www.apress.com/
rights-permissions.
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 via the book’s product page, located at www.apress.com/9781484255803. For more
detailed information, please visit http://www.apress.com/source-code.
Printed on acid-free paper
This book is dedicated to Allen White, who has been my friend as well as
helped me grow into a valued member of the community, and
taught me how important it is to keep giving back and
helping others.
Table of Contents
About the Author����������������������������������������������������������������������������������������������������� xi

About the Technical Reviewer������������������������������������������������������������������������������� xiii


Acknowledgments���������������������������������������������������������������������������������������������������xv

Introduction�����������������������������������������������������������������������������������������������������������xvii

Part I: Everything Is Slow������������������������������������������������������������������������������� 1


Chapter 1: T-SQL Triage�������������������������������������������������������������������������������������������� 3
Severity of the Situation���������������������������������������������������������������������������������������������������������������� 4
Relative Effort������������������������������������������������������������������������������������������������������������������������������� 4
Problem Areas������������������������������������������������������������������������������������������������������������������������������� 4
STATISTICS IO and Time����������������������������������������������������������������������������������������������������������� 5
Query Window Setup��������������������������������������������������������������������������������������������������������������� 5
Code Tests������������������������������������������������������������������������������������������������������������������������������� 6
Execution Plans��������������������������������������������������������������������������������������������������������������������� 11
Perform Triage if Possible����������������������������������������������������������������������������������������������������������� 14
Is There an Index?����������������������������������������������������������������������������������������������������������������� 14
Risk Level of the Change������������������������������������������������������������������������������������������������������� 17
The Answer to Everything…?����������������������������������������������������������������������������������������������������� 18
Triage Outside of Indexing���������������������������������������������������������������������������������������������������������� 18
If Possible, Queries Should Join on Key Values��������������������������������������������������������������������� 19
SARGability���������������������������������������������������������������������������������������������������������������������������� 19
Summary������������������������������������������������������������������������������������������������������������������������������������ 19

Chapter 2: Documentation�������������������������������������������������������������������������������������� 21
Incorporating Existing Documentation���������������������������������������������������������������������������������������� 21
Functionality Documentation������������������������������������������������������������������������������������������������� 28

v
Table of Contents

Statistics Information and Execution Plans�������������������������������������������������������������������������������� 29


Coding (Anti) Patterns����������������������������������������������������������������������������������������������������������������� 29
Number of Calls to Each Database Table������������������������������������������������������������������������������� 30
Datatype Mismatches������������������������������������������������������������������������������������������������������������ 31
Subqueries and Where They’re Located�������������������������������������������������������������������������������� 38
Calculations��������������������������������������������������������������������������������������������������������������������������� 38
Temporary Tables and/or Table Variables������������������������������������������������������������������������������ 40
Loops and/or Cursors������������������������������������������������������������������������������������������������������������ 41
CTEs��������������������������������������������������������������������������������������������������������������������������������������� 42
Join Types������������������������������������������������������������������������������������������������������������������������������ 42
LIKE, NOT LIKE, and NOT IN���������������������������������������������������������������������������������������������������� 43
DISTINCT, TOP, and Other Sorting Operations������������������������������������������������������������������������� 43
Calls to Other User-Defined SQL Objects������������������������������������������������������������������������������� 44
Native SQL Server Functions in a WHERE Clause������������������������������������������������������������������ 44
Indexes���������������������������������������������������������������������������������������������������������������������������������������� 48
Back to Runtime Data������������������������������������������������������������������������������������������������������������ 48
Summary������������������������������������������������������������������������������������������������������������������������������������ 48
Wrapping Up Our Documentation������������������������������������������������������������������������������������������ 48
DailySummaryReportPerMonth: Documentation������������������������������������������������������������������������� 48
Code as of 2019.06.02����������������������������������������������������������������������������������������������������������� 48
Functional Requirements������������������������������������������������������������������������������������������������������ 56
Data Calls������������������������������������������������������������������������������������������������������������������������������ 56
Coding (Anti) Patterns������������������������������������������������������������������������������������������������������������ 57
Indexes���������������������������������������������������������������������������������������������������������������������������������� 59

Part II: Database Structure��������������������������������������������������������������������������� 61


Chapter 3: Database Tables������������������������������������������������������������������������������������ 63
Computed Columns��������������������������������������������������������������������������������������������������������������������� 63
Denormalized Data���������������������������������������������������������������������������������������������������������������������� 63
Datatypes and Field Size������������������������������������������������������������������������������������������������������������� 65
Deprecated Datatypes����������������������������������������������������������������������������������������������������������������� 66

vi
Table of Contents

How Much Data?������������������������������������������������������������������������������������������������������������������������� 66


Data Skew/Cardinality���������������������������������������������������������������������������������������������������������������� 67
Constraints���������������������������������������������������������������������������������������������������������������������������������� 68
Changing Table Definitions���������������������������������������������������������������������������������������������������������� 69
Summary������������������������������������������������������������������������������������������������������������������������������������ 82

Chapter 4: Database Views������������������������������������������������������������������������������������� 83


Nesting���������������������������������������������������������������������������������������������������������������������������������������� 84
Multiple Table Calls���������������������������������������������������������������������������������������������������������������� 95
Additional Pieces for Documentation������������������������������������������������������������������������������������ 97
Know Your Data��������������������������������������������������������������������������������������������������������������������� 97
Functionality Check��������������������������������������������������������������������������������������������������������������������� 99
What Problems Did We Fix?������������������������������������������������������������������������������������������������������ 103
Filtering������������������������������������������������������������������������������������������������������������������������������������� 104
Updating Data Through a View�������������������������������������������������������������������������������������������������� 104
Additional Limitations��������������������������������������������������������������������������������������������������������������� 105
Why Use a View?����������������������������������������������������������������������������������������������������������������������� 105
Summary���������������������������������������������������������������������������������������������������������������������������������� 105

Part III: CRUD Objects��������������������������������������������������������������������������������� 107


Chapter 5: Triggers����������������������������������������������������������������������������������������������� 109
View-Based Triggers����������������������������������������������������������������������������������������������������������������� 109
When Should We Use Triggers?������������������������������������������������������������������������������������������������ 110
Common Issues with Triggers��������������������������������������������������������������������������������������������������� 110
Trigger Recursion���������������������������������������������������������������������������������������������������������������������� 114
Triggers and Multi-record Changes������������������������������������������������������������������������������������������ 119
Testing for Values Changing������������������������������������������������������������������������������������������������������ 123
Limit the Work Your Database Must Do������������������������������������������������������������������������������������� 129
Summary���������������������������������������������������������������������������������������������������������������������������������� 135

vii
Table of Contents

Chapter 6: Stored Procedures������������������������������������������������������������������������������ 137


Temporary Tables vs. Table Variables���������������������������������������������������������������������������������������� 137
The Temporary Table����������������������������������������������������������������������������������������������������������� 138
The Table Variable���������������������������������������������������������������������������������������������������������������� 138
Loops���������������������������������������������������������������������������������������������������������������������������������������� 139
Functionality Review����������������������������������������������������������������������������������������������������������������� 139
Start with the Simplest Data����������������������������������������������������������������������������������������������������� 139
Add More Data in Small, Easily Testable Increments����������������������������������������������������������� 142
Windowing Functions���������������������������������������������������������������������������������������������������������������� 144
Avoiding Row or Data Duplicates���������������������������������������������������������������������������������������������� 146
How Did We Get Here Again?���������������������������������������������������������������������������������������������������� 151
But What About Performance?�������������������������������������������������������������������������������������������������� 153
No Missing Rows – Tally Tables!����������������������������������������������������������������������������������������������� 171
What Else Should We Watch For?��������������������������������������������������������������������������������������������� 177
GetUserInfoByName: Documentation���������������������������������������������������������������������������������������� 177
Code as of 2019.07.07��������������������������������������������������������������������������������������������������������� 177
Functional Requirements���������������������������������������������������������������������������������������������������� 179
Data Calls���������������������������������������������������������������������������������������������������������������������������� 179
Possible Red Flags�������������������������������������������������������������������������������������������������������������� 180
Run Statistics for This Call�������������������������������������������������������������������������������������������������������� 181
Functions and STATISTICS IO Output����������������������������������������������������������������������������������������� 182
Coming Up with a Plan of Action����������������������������������������������������������������������������������������������� 183
Go Away, Subqueries!���������������������������������������������������������������������������������������������������������� 183
Remove the Function!��������������������������������������������������������������������������������������������������������� 185
Remove the Leading % in Our LIKE Statement�������������������������������������������������������������������� 186
Summary���������������������������������������������������������������������������������������������������������������������������������� 190

Chapter 7: Functions�������������������������������������������������������������������������������������������� 191


Scalar Functions����������������������������������������������������������������������������������������������������������������������� 191
Viewing STATISTICS IO Caused by Functions���������������������������������������������������������������������������� 193
Scalar-Valued Functions in a WHERE Clause���������������������������������������������������������������������������� 199

viii
Table of Contents

Native SQL Server Functions���������������������������������������������������������������������������������������������������� 200


The Dreaded “Massive Business Logic” Function�������������������������������������������������������������������� 203
Using OUTER APPLY to Join Aggregate Data����������������������������������������������������������������������������� 211
Metrics with Increasing Number of Return Rows���������������������������������������������������������������� 213
Table Valued Functions (TVFs)��������������������������������������������������������������������������������������������������� 215
Summary���������������������������������������������������������������������������������������������������������������������������������� 218

Part IV: The Bad and the Ugly��������������������������������������������������������������������� 219


Chapter 8: Agent Jobs������������������������������������������������������������������������������������������ 221
What Agent Jobs Should Be Doing�������������������������������������������������������������������������������������������� 221
Good Job(s)!������������������������������������������������������������������������������������������������������������������������ 221
When Should I Run Jobs?���������������������������������������������������������������������������������������������������� 222
Common Issues with Agent Jobs���������������������������������������������������������������������������������������������� 224
Overlap�������������������������������������������������������������������������������������������������������������������������������� 224
Summary���������������������������������������������������������������������������������������������������������������������������������� 226

Chapter 9: External Influences����������������������������������������������������������������������������� 227


Linked Servers�������������������������������������������������������������������������������������������������������������������������� 227
Security������������������������������������������������������������������������������������������������������������������������������� 227
Queries Joining Tables from Different Databases��������������������������������������������������������������� 228
Network IO��������������������������������������������������������������������������������������������������������������������������� 228
How Can We Fix This?��������������������������������������������������������������������������������������������������������� 229
SQL Code Calls in the Application��������������������������������������������������������������������������������������������� 229
So What’s the Problem?������������������������������������������������������������������������������������������������������ 229
Dynamic SQL����������������������������������������������������������������������������������������������������������������������� 231
Summary���������������������������������������������������������������������������������������������������������������������������������� 231

Index��������������������������������������������������������������������������������������������������������������������� 233

ix
About the Author
Lisa Bohm leads a team of database administrators (DBAs)
for a software development company. Her history with
legacy database code began early in her career with a
summer project to rewrite the chemical inventory database
for the research division of a local VA hospital. From
there, she went on to building front-end web applications.
When the web calls timed out, Lisa dug in to learn what
databases can do. She has since transitioned into database
administration, inheriting and improving legacy applications
along the way. Her personal focus remains on solid database
architecture and writing well-performing T-SQL.  

xi
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
About the Technical Reviewer
Kathi Kellenberger is a data platform MVP and the editor of Simple Talk at Redgate
Software. She has worked with SQL Server for over 20 years. She is also coleader of the
PASS Women in Technology Virtual Group and an instructor at LaunchCode. In her
spare time, Kathi enjoys spending time with family and friends, singing, and cycling.

xiii
Acknowledgments
I would like to thank all of the people who believed in me, encouraged, and pushed me
to continue to grow and learn. Special thanks go to Mindy Curnutt, Eric Blinn, and Tim
Tarbet, who showed me how amazing someone can be at the job they choose to do, and
believed that I could be that good too.
I cannot leave out the people who work for me. I lead a wonderful team of involved
people who are active in their continued learning, and continue to inspire me every day
by finding solutions to really difficult problems.
Also thank you to my family (including my #sqlfamily) who have always been
supportive, loving, and unstinting of hugs and moral support when needed!

xv
Introduction
What is legacy code? There are a few definitions floating around out there, but as a
working definition, we’re going to use the following:
Legacy code is code that is no longer being actively supported by the people who
wrote it.
Why are we going to use that? In software development, good documentation goes a
long way. Developers should understand what code is trying to accomplish and how it’s
trying to do so. When documentation either doesn’t exist or isn’t as thorough as required
and the original programmers aren’t available if you need to know why something was
written a particular way, it can be a nightmare to fix. In some cases, it may not even
be clear whether code ever worked as intended, or if the functionality of the change
someone is requesting is within the original intent of the programmer(s).

A Tale of Woe
How does legacy code start? Let’s look at this story. Code is written to solve a problem –
for example, someone is copying data into Excel every day and doing some hand
manipulation to generate a graph to add to a larger report. A developer sets up a quick
application to pull the data from the database and export it into Excel automatically for
the user, also performing the calculations the user was doing by hand.
This user then trains their successor and another person in the department on how
to view this report. One of them says, “Hey, this is great! Can you also make it pull data
for this other report and we can show how these numbers reflect against each other?”
Someone else loves the additional functionality but needs the code to work in a different
way, or do different statistical calculations, or needs to add an additional field on the
report. That person’s manager is intrigued by the functionality and wants a weekly
summary report to review. Code structure starts to resemble something that is cobbled
together, as multiple developers add bits of functionality over time. Oftentimes, there
is little to no documentation on the functionality or the choice of code – everyone just
adds a bunch of lines at the end of the code to handle the small part they were asked to
develop.

xvii
Introduction

Many times, front-end developers don’t specialize in T-SQL, so do not usually have
a deep understanding of the SQL Server optimizer. Especially in the case of “let’s just
add lines of code to the bottom of this to handle additional functionality,” calls to the
database can increase exponentially; in many cases, calls grab the same data over and
over. And, oh, by now, over half the company is using this app in one way or another – or
perhaps three ways. The vast majority of these uses, by the way, were never intended by
anyone who had ever touched the code.
Users complain about slowness and performance. Even more frustrating, all of the
other business-critical applications that use the same database(s) become slower and
slower as they fight for resources and locks with the application and its chatty data calls.
Also, of course, every developer that has ever touched this application has moved on or
has been promoted and hasn’t looked at code for years, so has no recollection of ever
manipulating any code even remotely similar to this patched-together behemoth that is
rampaging through the company infrastructure.

Congratulations!
You have inherited one of these types of applications, or you probably wouldn’t be
here reading this book. Although there will be (possibly many) times that you may
want to cry, yell, or swear, this will also give you some unparalleled opportunities to be
a hero and pull off some very spectacular-seeming fixes. Just remember, though, that
when you really fix something amazing, most people will be completely oblivious to
that fact. Then, when you do something you think is so obvious that a worm out there
on the sidewalk could probably manage it, you may get so many congratulations and
thanks that you’ll wonder if you really did something magical. That is probably more
of a general life/job observation and not related specifically to legacy code, but it’s also
prevalent here.

What This Book Is


This book is meant to help you, the reader, step in and identify potential issues in a
specific database object relatively quickly. There are a few assumptions that go with this:

1. Hardware/hardware configuration/VM configuration has been


ruled out as the performance problem.

xviii
Introduction

2. External sources have been ruled out as the problem (although we


all know it’s really the network…).

3. The database objects that are causing concern have been


identified.

We are going to continue on from the point of “Okay, this has been identified as an
issue. Now what do I do with it?” Most of what we’ll be doing is actually looking at the
code with the help of a few performance measures and learning about best practices to
help identify problem areas. You should be familiar with basic T-SQL coding syntax and
techniques and how to do a bit more advanced querying.
We will cover most of the issues commonly seen by object type, as well as a couple
of less common problems just for fun. Once these problem areas within the object are
identified, you can then mitigate the performance issues with relatively low effort and
cost. Some objects may require a much deeper dive. Once we’ve done some triage to
help alleviate the immediate pain an object is causing, we will cover what is involved in
effectively performing the deeper dive.
We also will talk about how to quickly tell if you’re on the right track in terms of the
fixes you want to apply. We’ll go over some simple (and free) tools that can be used to
measure performance, so you can document the before/after metrics to go along with
the rest of the documentation you’re going to be sure to add so the next poor sod
(I mean the next person) who has to maintain this system will have an easier time of it!

What This Book Is Not


Magic. This book is not magic, although at times it might seem like it helps you perform
some. Seriously though, there are times when things are so bad that you cannot fix them.
This is pretty rare, and either myself or one of the members of my various teams has
almost always managed to “just fix it,” but just be aware that it is possible that something
is unsalvageable. Even better, your boss should also be aware of this and have your back
should you run into that situation. If you are not that fortunate, you may want to consider
finding another job, but that is probably outside the scope of this book.

xix
Introduction

This is not a deep dive into indexes, statistics, or database maintenance. I’d hope
that you have all of those things set up. If you do not, please go find a book that discusses
those items and make sure you are doing them! If you are not in charge of the database
administration specifically, talk to whoever is and make sure THEY have those bases
covered. We will definitely mention indexes and statistics, but there is much more
complete information on them in other places, so discussion will be more of a flyby than
exhaustive information.
This is also not a way to identify problematic hardware, external forces, or database objects.
We mentioned in the preceding text what the assumptions are. If you skipped those, please
go back and at least read those points so we’re all on the same page when we start our triage.

T he Tools
We will be using a data dump from Stack Overflow. Brent Ozar kindly provided it on
his web site at www.brentozar.com/archive/2015/10/how-to-download-the-stack-
overflow-database-via-bittorrent/ which he in turn got from the awesome Stack
Overflow folks.
I will also include a backup with the files for the book so everyone can start on the
same foot. If you want to follow along with the examples, please make sure to run the
database setup script (included in the files for the book) after restoring the database
backup to add the additional objects we’ll be using throughout the book.
SQL Server Management Studio (SSMS) will be the code-running application of
choice. It is a free download from Microsoft: https://docs.microsoft.com/en-us/sql/
ssms/download-sql-server-management-studio-ssms
SentryOne Plan Explorer is also a free download. We will be using it to look at
execution plans and performance metrics related to the plan:

www.sentryone.com/plan-explorer
The last tool is a web site. You can paste in your exhaustively long statistics IO/time
output, and it will parse it into nice handy tables. It is worth its weight in… um… bitcoin?
If you’ve ever spent time trying to wade through output from a cursor or loop, you’ll
completely understand. Please be forewarned though that there is a limit to how much
you can dump in and have it still actually regurgitate output:

http://statisticsparser.com/

xx
Introduction

The Inconsequential (Mostly) Details


I ran examples using SSMS 18 on a Dell Latitude E7470 laptop. I set up a VM using Oracle
VirtualBox. The VM had a single vCPU and 8 GB RAM. I was using SQL Server 2016 SP2
running on Server 2016 Core.

Let’s Go!
Now that we’ve gotten that out of the way, let’s pull up the code for our first painful
object and go do some first aid!

xxi
PART I

Everything Is Slow
CHAPTER 1

T-SQL Triage
The most dreaded call a DBA can get is this: “Everything in the application is slow! FIX IT!”
In many cases, the database is one of the culprits of the poor performance of the legacy
code. When you are approached to deal with some of these issues, what do you do? Well,
first you identify painful code. We’re going to assume that you (or someone else) have
already identified the concerning areas. Once that happens, we need to assess the situation
by answering these questions:

1. Determine how critical the situation is:

a. Are users down?

b. Are all users down?

c. Is this causing the business to lose money?

2. Determine the relative effort involved:

a. How many lines of code are involved?

b. How many areas of the application call this code?

c. How much of the code needs to be changed?

3. Identify problem areas in the code:

a. What areas are causing pain?

4. Perform triage if possible.

3
© Lisa Bohm 2020
L. Bohm, Refactoring Legacy T-SQL for Improved Performance, https://doi.org/10.1007/978-1-4842-5581-0_1
Chapter 1 T-SQL Triage

Severity of the Situation


This is something you can only determine by gathering information either from users or
user managers. I know, I know, it means you have to actually talk to people. However, it
is a great indicator of whether you should immediately drop everything else and work
on this immediately, or if it can wait until the task you’re working on is completed. If you
don’t already, you may want to consider having a written SLA (Service-Level Agreement)
that states how quickly you or your team is expected (or required) to react to certain
events. Severity should be a key piece of that document.

Relative Effort
If this is a several-thousand-line-of-code object, just shake your head sadly and walk
away. Just kidding! However, the effort to just understand what is going on will be
significant, let alone the effort to actually fix the performance issues. This is where great
documentation comes into play, but it’s unlikely that if you’re reading this book, you
have that kind of help at your disposal.
Additionally, you need to think about QA (quality assurance) effort. The best
scenario is to never EVER let untested code go into production. By untested, I mean code
that hasn’t passed a rigorous QA process. Running something once on your laptop seems
like a great idea, but there are all sorts of weird scenarios that you may not be aware of,
that a QA professional will have a much better grasp on.
How many precise pain points are in this code? This will be the biggest
determination of what kind of triage we can perform to put smiles on the users’ faces (or
at least make them stop complaining to your boss). Regardless of any of these answers
though, if code has been identified as a real problem, triage is only your first step.
Even if you “fix” it with an index or other smooth wizardry, DO NOT STOP there! Fully
document the code and rewrite if necessary.

Problem Areas
“Hello? Sam DBA? Every time a user tries to change their display name, the application
hangs for seconds, and it’s really frustrating everyone.”
The best way to see what’s going on with code is to go run some of the code that is
causing problems. Sometimes, settings outside of the actual SQL code can cause issues
4
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
Chapter 1 T-SQL Triage

as well. Application connection strings can sometimes set ANSI settings, and this can
make SQL code run very differently from SQL Server Management Studio (SSMS),
for example. We’re going to assume that this has already been ruled out and isn’t the
cause of what we’re seeing in this book, but I wanted you to be aware that if you haven’t
checked into those possibilities, you probably should.
This is really useful information that you just received from the caller. Be aware,
however, that people like to throw around terms like “always” and “never” pretty lightly.
Try to get details: “When you say every time, is it 100% of the time? Is it 90% of the time?
Is it any time of day or limited to certain times?” Document the answers to go along with
the ticket/request/complaint documentation.
Let’s go look at what’s happening when a user tries to change their display name.
We’re going to try to change the following users’ display names in the sections to follow
as we look for where the issues are. We’ll use Jon Skeet who has an Id of 22656 and stic
who has an Id of 31996. The query will be run against the dbo.Users table.

STATISTICS IO and Time


STATISTICS IO is a measure of the amount of IO resources a query uses, and STATISTICS
TIME measures CPU and elapsed time a query runs, as well as query compile time. If you
are counting on that number at the bottom right of SSMS to measure query time, STOP
IT! It is not accurate – or certainly not accurate ENOUGH.

Query Window Setup


First, open up SSMS. Connect to the database and open a new query window and then
turn STATISTICS IO and STATISTICS TIME on. To do this through the UI, choose the
menu option for Query, then Query Options, and then Advanced. Figure 1-1 shows the
Advanced window for the Query Options.

5
Chapter 1 T-SQL Triage

Figure 1-1. Query Options Advanced window in SSMS

Make sure you check BOTH the SET STATISTICS TIME and the SET STATISTICS IO
boxes and then click OK.
If you want to go all scripting, you simply type in the query window the code
shown in Listing 1-1.

Listing 1-1. Command to set STATISTICS TIME and IO on

SET STATISTICS TIME, IO ON;

and click Execute (or hit Ctrl-E). Please note that either way you set STATISTICS
TIME and IO on, it will only be set for that specific query window or connection (SPID).
If the connection gets reset (e.g., restarting SSMS) or if you open another query window,
you will need to turn STATISTICS TIME and IO on again for the new query window.

C
 ode Tests
Next, we want to update a user’s name. So, first, I went and found a user by querying the
Users table and came up with a quick query to change a name. I ran it twice, because the
first run usually includes compile time. This user’s original name was “stic”, by the way.
We’ll change it back later.

6
Chapter 1 T-SQL Triage

Listing 1-2. Code to update the display name of user “stic”

UPDATE Users
SET DisplayName = 'stic in mud'
WHERE Id = 31996;

Listing 1-3 shows what the STATISTICS IO and TIME output looks like for the query in
Listing 1-2.

Listing 1-3. SSMS STATISTICS TIME and IO output

SQL Server parse and compile time:


   CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
   CPU time = 0 ms, elapsed time = 0 ms.
Table 'Users'. Scan count 0, logical reads 3, physical reads 0, read-ahead
reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server parse and compile time:
   CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
Table 'WidePosts'. Scan count 1, logical reads 61083, physical reads 0,
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-
ahead reads 0.
SQL Server Execution Times:
   CPU time = 110 ms,  elapsed time = 116 ms.
Table 'WidePosts'. Scan count 1, logical reads 305110, physical reads 0,
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-
ahead reads 0.
SQL Server Execution Times:
   CPU time = 1141 ms,  elapsed time = 1142 ms.
SQL Server parse and compile time:
   CPU time = 1141 ms,  elapsed time = 1142 ms.

SQL Server Execution Times:


   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

7
Chapter 1 T-SQL Triage

SQL Server Execution Times:


   CPU time = 1266 ms,  elapsed time = 1270 ms.

There is a much nicer way to look at the output in Listing 1-3. Go to the web site
http://statisticsparser.com/, and paste that output into the big window. Click the
Parse button, and scroll to the bottom of the page. You’ll get a nice summary table that
will give you what you need to know at a glance. This is the section labeled “Totals” on
the web page. Table 1-1 shows the read columns from the “Totals” section after running
the output shown in Listing 1-3 through the Statistics Parser web site.

Table 1-1. The “Totals” section read columns of the Statistics Parser site output for
Listing 1-3
Table Scan Count Logical Reads Physical Reads Read-Ahead Reads

Total 2 366,195 0 0
Users 0 3 0 0
WidePosts 2 366,192 0 0

CPU Elapsed

SQL Server parse and 00:00:01.141 00:00:01.142


compile time:
SQL Server Execution Times: 00:00:02.532 00:00:02.539
Total 00:00:03.673 00:00:03.681

So what are we looking at with Table 1-1? When we’re using STATISTICS output
to help with query tuning, we’re mostly going to focus on logical reads. The first time
you run a query, if your data isn’t in memory, you will see higher physical reads. When
testing queries, I generally ignore the first run and focus on the second. This is more
accurate to what is usually seen in production, where the data being called frequently
will already be in memory. Also, by always using this method, we can make sure we’re
comparing apples to apples.

8
Chapter 1 T-SQL Triage

We are seeing a LOT of page reads in Table 1-1, especially for the update of a single
row. But what is this WidePosts table? We weren’t updating that table… were we? No,
we were updating the dbo.Users table. Somehow, this WidePosts table is related to
the Users table. In SSMS, are there any objects around the Users table? A foreign key
constraint? A… wait, a trigger? Hmm, let’s look at the definition of the trigger, which
is shown in Listing 1-4.

Listing 1-4. ALTER statement for the ut_Users_WidePosts trigger

/*****************************************************************
  Object Description: Pushes user changes to the WidePosts table.
  Revision History:
  Date         Name             Label/PTS    Description
  -----------  --------------   ----------   -------------------
  2019.05.12   LBohm                         Initial Release
*****************************************************************/

ALTER TRIGGER [dbo].[ut_Users_WidePosts] ON [dbo].[Users]


FOR UPDATE
AS
SET NOCOUNT ON;

IF EXISTS
(
      SELECT 1
      FROM INSERTED i
      INNER JOIN dbo.WidePosts wp ON i.id = wp.OwnerUserId
)
BEGIN
      IF EXISTS
      (
            SELECT 1
            FROM INSERTED i
            INNER JOIN dbo.WidePosts wp ON i.Id = wp.OwnerUserId
            WHERE i.Age <> wp.Age

9
Random documents with unrelated
content Scribd suggests to you:
jobbágyait leölte, marháit elhajtotta, s mikor végre apa és fiú
kibékűltek, a viszályt Simon keserülte meg, mert Dénes bujtogató
tanácsaira hivatalától, s minden ingó bingó jószágától megfosztatott,
kivéve nehány száz holdat az összedúlt birtokok egyikéből, hova
kegyvesztett fejét lehajthassa. Oda vonúlt, s ha meg nem halt tán
most is ott teng a szerencsétlen öreg, – fiáról pedig nem tudni él-e
hal-e? de ha élne s itt volna is, tudom a nádor aligha akarna tudni
arról, hogy egykor leányát jegyezte el néki.
A lovagot, úgy látszék, nem igen érdekelte e hosszas elbeszélés,
mert tekintetét felváltva a versenyzőken s a sátrakon jártatván, a
nyereggyártóra alig hallgatott, sőt időközben rövid észrevételeket is
tőn egy vagy más nyillövés felett, s meg nem állhatá, hogy legalább
egy mozdulattal tetszést, vagy ellenkezőt ne nyilvánitson.
– Beh megváltozott a régi jó világ! morgá, szürke fejét
elégedetlenűl rázva az öreg szolga, kinek uráhozi meghitt modora a
régi cselédet árulá el; beh más nap süt most az égen, mint Béla és
Imre király idejében! Vén szemem könnyel telik el, ha körülnéz s
egyet sem láthat atyád barátai közűl, a helyen pedig, mely Isten és
emberek előtt jó nagy uramat illetné meg, halálos ellenét a gonosz
Dénest kénytelen szemlélni!
– Sejtésem s némi homályos emlék mondja, szólt egyenesen a
szolgához intézett halk hangon a lovag; hogy ama szálas izmos
termetű ember ott a harczbirák sátrában, Endre király jobbján, kinek
kos orra fölött oly közel egymáshoz állnak vad szemei, szakálla
bajsza pedig őszbe csavarodott – hogy az a nádor?
– Az. Alig három évvel ifjabb atyádnál, jó nagy uramnál, s
mennyivel ifjabbnak látszik! Hja! a búgond legjobb ránczcsináló és
fehérítő. Ő hirtelen s akkor őszült meg, mikor téged örökre
elveszettnek hittünk. Mióta megjöttél ismét fiatalodni kezd.
– S kik ott a többiek? csak a királyt ismerem közöttük, ő keveset
változott a szentföldi hadjárat óta.
– Balra, ha nem csalódom, Miklós tárnok ül, mellette Mihály bán
szabolcsi, s Tamás tolnai főispánok; a nádor mellett amaz alacsony
termetü úr a veszprémi érsek; a király mögött ülő kövér gyapjuzsák
pedig, kin oly ormótlanúl áll az aranyos magyar ruha, Volvelin
asztalnok; egy év előtt még zsidó volt az ilyen –
– S nagybátyám? nincs jelen vagy csak én nem ismerek rá?
vágott az ifju a szolga szavába.
– Épen most lép a királyi sátorba, mindnyájan, még a királyné is
fölkelnek előtte! felelt ragyogó szemekkel az öreg.
A lovag a mutatott helyre nézett, hol egy tiszteletet parancsoló
arczú s galambfehér szakállú agg foglalta el a királyné jobbján
üresen hagyott helyet.
Ez, Robert esztergomi érsek volt, ki a nehány nap előtt befejezett
országgyülésen ama joggal ruháztatott fel, hogy a hozott törvények
meg nem tartása miatt az ország bár mily magas hivatalnokait,
egyházi átokkal terhelhesse.
VII.

A sötétkék májusi égről lesugárzó nap délpontra kezdett hágni, a


nyilverseny végéhez közelgett, s már csak két vetélytárs között
forgott fenn a kérdés, kiknek mindegyike háromszor egymásután
lőtte nyilát a czéllap kellő közepébe, a jutalom dicsőségét pedig a
másikkal megosztani nem akarta.
A harczbirák egy utolsó s elhatározó lövést határoztanak, s az
eddigi két nyertes: Miklós a nádor fija, s a kalocsai érsek öcscse az
ifju Ugrin, egymás mellett állva éles szemmel mérték a czélul kitűzött
gyürűt, mely két keresztbe tett póznához kötött vékony zsinegről
lefüggve, a légben csendesen forgott. E gyürűn átfüződve kellett a
nyilvessző tompa széles végének megakadni, mit eszközölni annál
nehezebbé vált, minthogy a gyürűnek lassu körbeni forgása épen a
kellő másodpercz pontos megtartását igényelte.
A versenynek azonban egy egészen véletlenül közbe jött
esemény vete véget.
Az ifju Ugrin már épen jobb vállához emelintve tegezét a felajzott
húrt készűlt elbocsátani, midőn egy, a királyi sátorból előhangzó
sikoltásra ösztönszerüleg ereszté le a feszitett ivet, s feltekintvén
tapasztalá, hogy a király, a királyné, a harczbirák, a nézők serege,
minden fő a magasba néz fel, honnan kettős vad víjjogás minden
perczben hallhatóbbá válik, dühös fájdalmas víjjogása két ragadozó
madárnak, mely kiterjesztett szárnyakkal egymást csapkodva s
körmeikkel egymás húsába merűlve, a királyi sátor fölött sok ölnyire
élethaláltusát vív.
E vívók egyike Jolánta királynénak honából Auxerre-ból magával
hozott kedvencz vadász-sólyma volt, mely viszont úrnőjéhez hosszu
megszokás s állatoknak saját hála-ösztön által annyira ragaszkodék,
hogy tőle elválni, sőt tápot is mástól elfogadni soha nem akart. A
királyné, mint akkor szokásos volt, balkarján vagy öklén mindig
magával vitte a vékony ezüst lánczocskán tartott ritka szépségü
madarat.
Vele volt az a czéllövészet alkalmával is, s miután csaknem végig
nyugalmasan gubbaszkodott rendes helyén, egyszerre tollait
borzolni, fejét előre nyújtani, szárnyait emelgetni s fuldokló
sajátságos sívással annak jeleit kezdé adni; hogy zsákmányt vagy
ellenséget lát, s vele megküzdeni vágyik.
A királyné eleinte hizelgő szó- és simogatással igyekvék őt
csitítani, aztán, mint ezt már számtalanszor tevé, ereje- és
hüségében megbízva a lánczról szabad szárnyakra bocsátá a
nyugtalant, s tovább nézé az érdekes versenyt.
A sólyom pár ölnyire emelkedék a légben, ott szárnyait
örvendetesen megcsattogtatá, aztán, mint a gondolat villáma,
felhasított a tiszta égbolt felé, s mindig kisebb ponttá válva, végre
elenyészett.
A merész kalandort már már feledteté a sorompók közti két
vetélytárs kisérlete; a királyné ezt jól láthatni előrehajolt, Robert
érsek gondolatokba merülve simított végig hattyu-szakállán, Olinda
pedig szótlanul, de titkon örülve ült, hogy a nagy tekintélyü ősz
jelenléte által megmenekült a borzadva látott jegyes, Sámuel
kincstárnok izetlen udvarlásától, ki a háttérben, egymásba füzött
karokkal állva, sötét arczát s kancsal szemeit a szép hajadonra
szögezé. Az előtérben kis asztalkán ezüst nyilvessző feküdt, mit majd
a nádor lánya kezéből veend át hősi jutalomként a nyertes.
A kérdés, hogy ez ki leend? pár percz mulva elhatározásnak
nézett elébe, midőn Olinda némi meleget érze kezén elömleni, s
látva, hogy ezt néhány csepp vér okozá, mely a magasból karja- s
fehér pártájára hullott, az első megdöbbenésben élénken kiálta fel. A
véreső rejtélyét rögtön megfejté a már említett víjjogás, s a királyné
sólymának egy nála tizszer nagyobb kesellyeli elszánt viaskodása.
Egy pillanat azonban a küzdőkre kétségbevonhatlanul mutatá, hogy
ez nem sokáig fog tarthatni, s a sólyom vesztével leend bevégezve, a
kesely egyike lévén ama roppant állatoknak, melyek a Vértes szikla
odúiban fészkelve, ki-kicsapnak a tájra, s melyeket a bojtár, nyája
veszélyesebb ellenének tart a farkasnál.
Belátta ezt a királyné is s remegett kedvencz madaráért.
– Ott a czélpont! kiálta az összebonyolódott viaskodókra mutatva
fel; ki a sast a sólyom bántalma nélkűl elejti, azé leend a díj!
A sas már ekkor mindkét lába körmeivel tartá a sólymot s vinni
akarta legyőzött ellenét.
Miklós és Ugrin íjjából ugyanazon pillanatban süvölte fel a vessző,
s az óriási saskesely rövid perczig a légben mozdulatlan függni
látszék, aztán hirtelen hanyatt fordúlva zuhant le egyenesen a királyi
sátor elébe. Esését a bámuló néptömeg örömujjongása kisérte.
Hosszú kopasz nyakának fejét egy nyíl szögezte át; merevülő
csont körmei közt még mindig ott lihegett az általa megvérzett
sólyom.
Mire ez onnan kiszabadíttaték, a két vetélytárs Ugrin és Miklós a
legnagyobb érdek-feszültséggel sietett s ért a sátor elébe, megtudni,
melyiké közülök a siker dicsősége?
A harczbirák egyike kihúzta a hullából s magasan fölemelé a jól
irányzott vesszőt.
– Ez nem az enyém! szólt, miután megtekinté Miklós s boszus
kétkedéssel lépett hátra.
– Megfoghatlan! az enyém sem! csodálkozék Ugrin;
Magyarországban ily nád nem terem, sem ily vasat reá nem
készítenek, tevé hozzá; a nyíl ébenfeketeségű s mégis hajlékony
vesszejét figyelmesen vizsgálva.
– A mai nap díja e nyíl tulajdonosát illeti bár ki legyen az, s azért
hívja fel hirnökünk a megjelenésre! parancsolá a sólymának
megmentője iránt háladatos Jolánta királyné.
A hirnök, az általános meglepetés feszült csendében teljesité a
rendelvényt, s midőn szavait végzé, a néptömegből ugyanazon sugár
alak bontakozott ki, kinek csúcsos lezárt sisakját, finom fonadékú
aczél ingét, tegzét, kardját az imént annyira meg bámulta a sokaság.
Szilárd léptekkel közeledett a harczbirák felé, hol Endre király ült,
s karjait mellén keresztbe fonva hajlott meg előtte, aztán a pár
lépésnyire lévő királyi sátorbeliek előtt.
– Ismeretlen lovag, szólt hozzá a nádor, mint a harczbirák egyike:
emeld le sisakod s nevezd meg magad!
A lovag lecsatolta sisakját s megrázta a fejéről legyürüző holló
fürtöket, melyek a rendkivül napbarnitott arczot árnyékolák kőrűl.
Sötétkék szemeit lassú tekintettel hordá meg a gyülekezeten, mely
őt igy fedetlenül sem ismerve, még inkább bámulá: aztán csengő
fennhangon szólt:
– Tizennégy év előtt, király! e helyről kisértelek a szentföldre, s
az arab fogságban töltött tizennégy év után, mely idő alatt atyám
kegyelmedet, fiját, mindenét veszté, itt állok előtted, karomat s
életemet hazámnak ajánlani fel. Nevem Lőrincz, a kegyvesztett
Simon fija.
Bár ezelőtt már hire járt, hogy a kegyvesztett Simon bán fia él
Palaestinában, s bizonyos súlyú ezüstért kiváltható, az egész még is
meseszerübbnek látszott, hogysem rögtöni megjelenése köz
meglepetést, sőt némelyeknél döbbenést ne okozzon. Sámuel sötét
ragyás képe még jobban elkomorodott, s szemei baljóslatú
ránczokba vonúltak össze e név hallatára; Olinda arcza ellenben
ragyogó pirban derült fel, mintha a fagy ellen megvédő nap lépett
volna fel láthatárán; a királyné kedvtelő szemekkel mérte végig a
gyönyörü ifjat, sőt maga Robert érsek is fölkelt ülőhelyéből, s
hallhatólag fejezé ki örömét e nem várt föllépésén öcscsének, kit
nővére tökéletes képmásának lenni talált.
Endre király arczán jó indulat s kegyesség tükrözé magát, mit
szavakkal volt már épen kifejezendő, midőn a vonásait kémlő Dénes
nádor által megelőzteték.
– Maradtál volna inkább ott honnan jövél gyermek, dörgé ez
boszús szózatával; mint hogy ily büszkén jelensz és szólalsz meg itt,
hol helyed és szavad nincsen, te, a pártütő Simon fija, kinek atyja a
király és az ország által felségsértés büneért harmadiziglen
számüzetett. Az országgyülés, mely az 1222-ki törvényeket nehány
nap előtt erősité meg, nem törlé el ennek büntető itéleteit, tudd ezt,
s ne merészelj többé a király szine előtt megjelenni!
– Szavaimat a királyhoz s annak kegyelméhez intéztem, felelt a
nádortól elfordított arczczal Lőrincz; nem pedig ahoz, ki családom
elkobzott javait bitorolja. Simon fija csak a királytól várhat itéletszót.
Endre király perczig habozott s hihetőleg győz bocsánatra kész
szivének hajlama, ha tekintete a nádornak fenyegető
arczkifejezésével nem találkozik. Ez háttérbe szorítá a jobb indulatot.
– A nádor kimondá itéletemet; szólt s hangja inkább engesztelő
volt, mint sújtó; s ez itélet nem csak az enyém, de az országé is.
Bocsánatom helyett, mit nem adhatok, vidd magaddal sajnálatom, s
menj merre utaid visznek.
Fájó csend következék e nem lélekből származott szavakra.
– Dénes nádor legalább egyszer szólt igazat életében: töré meg e
csendet az apja tetteért bünhödő; s ez akkor volt, midőn mondá,
hogy jobb lett volna a pogányok közt maradnom. Isten és jobb jövő
velünk!
S ezzel, a csúcsos sisakot fejére illesztve, tova menni készült.
– Megállj lovag! szólt hozzá a királyné, midőn a sátorhoz ért; a díj
mindenesetre tied, térdelj elénk, s te Olinda nyújtsd azt neki át.
– Nem ugy királyné, asszonyom! vágott ismét közbe az oda siető
nádor; a harczbiró én vagyok, s a díjjat, e kegy- és érdemjelt, a kegy
és érdemen kivül levőnek nem itélhetem, ki mint ilyen a versenyből
különben is kizárva, hivatlanul tolta fel magát.
– Igaz, a számüzöttet dísz nem s csak gyász illeti: mondá a harag
szenvedélye nélkül s mélyen az elhalaványult Olinda szemeibe
tekintve egykori jegyese; de azt sem Isten, sem ember nem tilthatja
el, folytatá emelt szózattal, hogy e tollat e nap s a hölgy emlékeül ne
viseljem, kinek nekem igért s esküdött keze tőlem elragadtatik.
Mondá, s a sas szárnyából kitépett magas tollat sisakgombjába
tüzve, nyugodt méltósággal távozott s haladt el az utána bámuló
néptőmeg előtt.
VIII.

Simon bán, kiről a nyilazó verseny alkalmával a fehérvári


nyereggyártó beszélt az idegen lovagnak, méltósága s javai vesztése
után az osztrák határszélhez közel fekvő kis darab földére vonúlt,
egész mindenére, mit neki, életén kivül az ifjabb király Béla
közbenvetése megmenthetett.
A király köréből ekként számüzött lovag keserű gyűlöletet
szivében vitt magányába Dénes nádor s hatalomban levő pártja
ellen, melynek nem csak hogy saját bukását tulajdonítá, de melynek
működésétől a sanyargatott hon irányában sem várhata egyebet,
mint köz elszegényedést, elerkölcstelenülést, a hadi erő vég
elgyengülését, s az országnak vég feloszlatását.
E gyűlölet ama nem szünő fájdalommal váltakozott, s többnyire
egy marczangoló érzületté egyesült: mit az egyetlen fiától megrabolt
apa, édeskínos emlékek által ápolt megszaggatott lelkében.
A szerencsétlenség s a magány e lelket még fogékonyabbá tevé a
szenvedett sérvek átérzésére s keserű hangulatát lassankint
világgyülöletté fokozá. Évek multak, hogy puszta jószága
határbarázdáit nem lépte át, s hű szolgáján kivül mással nem válta
szót. E régi szolga s még két megmenekült cseléde volt minden
környezete, kikkel ő együtt szántá a bokrokkal felvert sok éves
ugarok egy kis részét, miből az egy évi élelem bőven kikerűlt.
De ha legnagyobbrészt pusztán s parlagon maradtak is a
miveletlen földek, úri jogait rajtuk gyakorlatba venni szigorúbban
senki nem tudta, mi aztán minden oldalról tőszomszédjának végtelen
sok bajába került. E tőszomszéd Bengabál Dávid nem egyszer a
birtok többszörös árával kinálta őt meg, de Simon erről hallani sem
akart, s büszke hidegen utasítá vissza. Ezt a dolog vérig boszantá, s
mi jogszerüen nem sikerűlt, ármányok és Dénes nádor által akarta
Simont e birtokból kitúrni. A király azonban, ki Béla fiának esküvel
erősitett szavát adá, Simonnak e számüzetési helyén egy hajszálát
sem bántani, ez egyszer erélyt tanúsitott s az öreg lovag jogai
sértetlenek maradtak.
Egy kiépítetlen kőház, mit Simon még mint tárnok kezde
emeltetni, a közeli mocsarakban bőven termő náddal jól roszúl
fedve, volt az egykori zászlós úr romlatag hajléka, hol ő, Márton
szolga s a két cseléddel megvonúlva élt. Az alacsony hosszú terem,
faragatlan tölgyasztallal közepén s vadbőrökkel beterített
mohágygyal szögletében, az úr tanyája volt, s télire félig száraz
gallyakkal tölteték meg, hogy legyen mivel a barlang-szájszerű nagy
kandallóba fűteni. Tulsó végében pedig a formátlan kőháznak téres
ól állott, hol a nehány ló tartására több gond fordíttaték, mint
mennyit a tulajdonos önmagának igényelt.
A ház ajtaja előtt illatos levelű vén diófa terjeszté védőleg
terebélyes ágait a kuszált födélre, s árnyékban tartá az alája
alkalmazott padot, hol a hirtelen öreggé őszülő férfi, a jövőnek soha,
a jelennek alig s csak a múltak emlékeinek élve, oly örömest
szeretett elidőzni.
– Ha ő most itt volna! vagy: mily nagy és deli volna ő már! vagy:
csak élne, csak tudnám, hogy él, e kopár lét nem volna oly
reménytelen! s ezekhez hasonló sohajok törtek fel néha a sulyosan
emelkedő mell bensejéből, miket Márton az öreg szolga, kit a
szerencsétlenség s hüsége, egykori urának inkább barátjává emelt,
néma bús fejbólintással viszonzott. Jól tudta, ki ezen ő, kire az
örömtelen apának bárhonnan elinduló gondolati örökösen
visszatérnek, ez viszont meg volt győződve, hogy a hű szolga vele
együtt érez s átérti fájdalmát, s igy könnyülés volt legalább azt véle
időnként nehány vonatkozó szóval közölhetni.
Igy múlt gyászos elvonultságban év év után, s már a
tizenkettedik azon órától számitva, melyben a lovag fiának vesztéről
értesűlt. A vén diófa tizenharmadszor hullatá már az alatta
merengőre őszi leveleit, midőn ezt egy estén szokatlan zaj verte fel
határozatlan lelki zsibbadtságából. Feltekintett s Mártont látta meg,
mint hoz karon szorítva egy idegent, s beszél hozzá – szokása ellen
hangosan.
Az öreg szolga, a mint a vándor mezű idegennel ura elé ért, csak
ennyit mondhatott: „ez az én uram s most beszélj!“ s ezzel rögtön
két nagy köny gördült le ősz pilláirúl, mint később vallá, az első és
utolsó talán életében.
A jövevény elmondá, hogy mint egyike a szentföldi hadjáratkor
foglyúl maradt harczosoknak, most onnan küldetve jő, tudtúl adni,
hogy Lőrincz él és ezer márka jó ezüstért vissza váltható. Elmondá,
hogy a kilenczéves fogoly fiú Szelaheddin kedvencz apródjává lőn, ki
őt minden hadi és lovagi gyakorlatban oktattatá, s hihetőleg saját
testőrseregében kitünő rangra emelendi, ha időközben hirtelen meg
nem hal; utóda azomban nem öröklé e hajlamot, s Lőrinczet,
minthogy ez az Izlamot fölvenni nem akarta, gyűlölt hadi fogolyként
tekintve, közmunkákra kényszeríti, s tudván, hogy atyja a legfőbb
rangú magyar nemesek egyike, váltsági díjját az emlitett súlyú
ezüstben határozta meg.
A jövevénynek, ki bajor születésü lévén, honába erre tért vissza,
még sokat, igen sokat kelle beszélni. Az éj első fele ily kifogyhatlan
forrású kérdések- és feleletekben tölt el; másik felében az öröm nem
engede a boldog apa szemeire álmotszállani. Tervezett és számitott
és töprenkedett, hogy és miként szerezze meg az akkori idők becs-
fogalmaihoz mérve roppant összeget?
Az első szürkületkor lovára ült s Fertővár felé, melynek pompás
épületét külföldről jártak megbámulni utasok, ő azonban még eddig
megtekintésre sem méltatta, lovagolt, s felkeresvén a vár urát, az
egyetlent, ki e pénzszűk időkben a kellő összeget rögtön
előterjeszteni képes lehete, érte ősi gyémántjait ajánlá fel zálogúl.
S most Bengabál Dávidon volt a sor a büszke nemes éreztetett
daczát visszatorlani, mit meg is tőn az által, hogy a kölcsönt
megtagadva, azt csak ama feltétel alatt igéré, ha a kivánt ezer
márkáért fekvő birtokát örök áron adandja át. Erről ismét Simon, bár
az elpusztult jószág az ajánlott összegnek felét sem érte meg, nem
akart hallani, s oly kijelentéssel távozék, hogy nagyértékü
gyémántjaira más zálogost is találand.
Ezt azonban könnyebb volt mondani, mint eszközölni azon
időben, s az öreg Simon már már ingadozott szándékában, midőn
harmadnap reggelén maga a tőzsér jött az ajánlat elfogadásával, s
ama titkos tervvel, mit később foganatba is vőn.
Az alku megkötteték három tanú előtt. Dávid át vevé a
gyémántokat, Simon az ezer márkát oly kötelezéssel, hogy azt
három részletben fizetendi le, s az utolsó részletnél a zálogot
visszaveendi.
Huszonnégy órát sem késett ezután, s Mártont helyettesül hon
hagyva megindult a hosszú útra, melyből tíz viszontagságos hó
múlva, kedves fiával együtt érkezett meg a katangkórós ősi telek
romlakába.
IX.

Lőrincz természettől nagyra törő lelke a változatlan magányban


nem találva élményt, komor és gondolkodó lőn.
Mi másnak álmodta ő a sugár pálmák honában a tizennégy év
óta nem látott magyar földet susogó csererdőivel, zugó folyamaival,
kalásztengerű sikjaival, a rajta pezsgő rokonnéppel s ennek harczi
dicsőségével!
A gyermekkori benyomások édes-tisztán maradtak s éltek ott
emlékében s a visszavágyó fájdalom varázs ecsete által még
tündériebbekké szinezve ragyogtak előtte. Minden, mit az idő és
tértávolság bűcsövén szemléle, fényes, nagy és dicsőnek
mutatkozék, s hazáját nem is tudta másként, mint magasztos lovag-
erény, szabadság és győzelem hazájának képzelni, hol a számára
nőtt cser-ág tőle tenger és puszták által elválasztva, fonnyad el.
Szelaheddin udvarában Esztergam falaira, a czédrusokkal
szegélyzett Jordán partjain az ősz Dunára, a tevés sivatagon a tiszai
sikra gondolt, s a hősökkel környezett Endre király, a méltóságos
hullámzatú folyam, az alföldi lapály rezgő délibábjával és dobogó
méneseivel, az édes szülőföld kiterjesztett karokkal látszék őt hívni
keblére, s ismerős szellemhangon beszélve hozzá, napról napra
fájóbbá növelé szivében amaz olthatlan epedést, melynek neve:
honvágy.
S most midőn a tizennégy év gyönyörű eszmény-világát a
valóságban letörpűlni, elhomályosodni látta, most, midőn az apai
magány szűk körében tétlenségre kárhoztatva, oly messze esett
ragyogó álmai valósulásától: lelkébe a csalódás lehangoltsága s utó
unalma szállott. A világ-kerülő apának elég és minden volt az újra
birt egyetlen fiú, ellenben e fiúnak, ki mindenben mi nagy és
magasztos a legjobbakkal versenyezni égett, lehetett-e kielégitő a
jövőtlen és czéltalan élet, mi reá, az őt gyülölni s legfölebb tűrni és
remélni tanitó apa körében várt?
Ifju lelke nem volt képes ama sötét árnyalatok felfogására, mikkel
az öreg az ország siralmas állapotát festé. Azt hivé, hogy mindezt
csak a keserü gyűlölet láttatja igy a számüzöttel, ki új kegyért esdeni
büszke. S bár e büszkeséget méltánylá is apjában, de egyszersmind
hivé, hogy ő maga sem fogna megalázást koczkáztatni, ha a király
előtt megjelenve, mint nem részese a néhány év előtti belháborúnak,
sőt ezen egész korszak alatt épen a király ügyeért rabságot
szenvedő, karát s szolgálatát felajánlaná.
E szándékáról azonban mit sem szóla, s azon ürügy alatt, mintha
Bélát az ifjabb királyt menne fölkeresni, egy reggelen, Márton által
kisérve Esztergomnak indúlt.
Itteni fellépése, melynek a nyilverseny alkalmával tanúi valánk,
atyja előtt örökös titok maradt. Jól tudta, hogy e durva visszautasitás
még inkább fogná apját ingerelni, s azért erről Mártonnal
egyetértőleg hallgatva, csak annyit vallott meg, hogy Bélát, ki az
országgyülés befejezte után azonnal a kormánya alatti tiszavidékre
költözött, Esztergomban már nem találva, épen utánna volt
indulandó, midőn anyjáróli nagybátyja Robert esztergomi érsek
titkon magához hivatta s a legkegyelmesebben fogadta őt.
Robert, kinek nővére Simon bán neje volt, a belháburú gyászos
ideje óta nem találkozott sógorával, ki őt, valamint a királyi udvarnak
egyenkint, s öszszesen minden emberét, ellenségének tartá. Pedig
az érsek megtette Simonért a mit tehetett, s Béla után leginkább
neki volt köszönhető, hogy a pártütő életben hagyaték. Ezt azonban
Simon nem tudta vagy tudni nem akarta, s mert a nádor által
szüntelen gyanúsitott ősz, hogy hitelét fentartsa, sógorával minden
viszonyt megszakítani volt kénytelen, ez végre őt is köz-gyűlöletébe
zárta.
S most a büszke vén nemes eleinte alig tudta megbocsátani
fiának, hogy nagybátyja meghivásának engedve, küszöbét átlépte;
midőn azonban megérté tőle, hogy az érsek és nádor közt a
leghalálosabb gyűlölet forrong, s hogy az első, az ifjabb királylyal
Bélával egyetértve, csak az alkalmas időpontra vár, melyben Dénest
és pártját megbuktatva, Endrét a nyomasztó befolyás alól
felszabaditsa; midőn továbbá Lőrincz elmondá, hogy nagybátyja az
egyházi átok kijelentése jogával ruháztatott fel, s ezzel a gonosz
tanácsadók ellen tettleg élni is szándékozik: Simon bán némileg
kibékült fia eljárásával, sőt később azt sem ellenzé, hogy ez az
érseket gyakrabban meglátogathassa, s tőle a keresztyén hit
ágazataiban, miket a mozlemek közt töltött hosszú év sor emlékében
meghomályosított, oktatást nyerhessen.
Lőrincz ezután majdnem többet időzött Esztergomban érsek
nagybátyjánál, mint apja mellett, ki, midőn fia hozzá nehány napra
meg-megtért, újult érdekkel kezdé hallgatni a királyi udvar körül
történőket, s titkon remélve az idők jobbra fordulását, nyugtalanúl
várta ez időpontot, s zúgolódék tapasztalván, hogy az üdvös
országgyülési határozatok daczára, minden a régi kárhozatos
kerékvágásban halad.
Volt még egy pont, mit Lőrincz apja előtt soha egy gondolattal
sem merészelt érinteni. Az érsek látván a köz-erkölcs s a keresztyén
vallás sülyedését, országszerte elrendelé, hogy a falukban s
városokban naponkint isteni tisztelet tartassék, ő maga pedig,
azonkivül hogy a szószékből nyilvánosan is inté a fővárosi népet,
hetenkint kétszer összegyüjté magánál a főnemesek gyermekeit
épületes oktatásokra.
Egy ily alkalommal, az érsek legbensőbb szobájában s
valószinüleg nem egészen történetesen, találkozott Lőrincz a nádor
lányával, ki neki gyermekkorában jegyezteték el, később pedig,
midőn Dénes és Simon közt a barátság megszakadt, s Lőrincznek
évek óta hirét sem lehetett hallani, atyai parancs következtében,
Sámuel kincstárnoknak lőn jegyese. Robert e frigyet nem csak nem
helyeslé, sőt egész erejéből ellene is szegült, kijelentvén, hogy arra
áldását soha sem adandja, s később, midőn a szaraczénekhez szitó
Sámuelre az eretnekség vádja bebizonyult, s az országgyülés által
hivatalától megfosztatott, őt arra itélé, hogy h i b á j á n a k
helyrehozása és maga tisztitása végett
keresztet vegyen fel, menjen túl a tengeren, s
a szent-földről három év múlva mint testben
lélekben megtörődött ájtatos zarándok térjen
m e g . De Sámuel ez egyházi parancsnak nem engedelmeskedék, s
az országban folytatá garázdaságait. Épen ekkor történt Lőrincz újra
föltünése; az érsek használá az alkalmat, s Olinda első eljegyzését
Isten és emberek előtt törvényesnek tartva, kezét Lőrincz kezével –
az említett találkozáskor ismét egyesíté, s e kézfogót addig, mig oltár
előtti szentesítésének ideje eljövend, titokban tartani rendelé.
Lőrincz, midőn ezen, őt Esztergamhoz annyira vonó érdekét atyja
előtt elhallgatá, nemcsak a titoktartási parancsnak, hanem ama
benső sugallatának is engedett, mely nyilván mondá: hogy e
lépésnek legmakacsabb ellenzője saját atyja leend, kiben a Dénes
név említésére is düh és irtózat keletkezik; s igy minden, mire
törekedett, abban állott, hogy őt legalább az érsek iránt
kiengesztelje.
Ez sikerűlt is neki, annyira, hogy midőn utolsó hazajövetele
alkalmával hatszáz márka ezüstöt hozna magával nagybátyjától,
Simon ez összeget, mint neje hozományának egy részét s igy Lőrincz
jogszerü örökségét elfogadhatónak találta.
E hatszáz márka volt az, mellyel 1231-dik év Jakab napján Dants
Simon tartozása nagyobb részét Bengabál Dávidnak lefizetni akarta.
S most vegyük fel újra történetünknek – az előzményekbeni
szükséges tájékozás végett imént elbocsátott fonalát.
X.

Ama napot követő esték egyikén, melyen Bengabál a gyémánt-


feloszlatással kisérletet tőn, apa és fiú együtt ültek a vén diófa lomb-
ernyőzete alatt.
– Minden veszve van! kezdé az első, s véreres szemeinek
villámtekintete elhallgatott átkot fejeze ki.
– Szóltál a tanúkkal, apám? kérdé feszűlten Lőrincz.
– Az egyik, Salamon harminczados, szemem láttára adá ki lelkét;
végszava keserű panasz volt Bengabál orvosa Corzail ellen, hogy
mint ebet hagyja veszni őt, s már négy nap óta nem csak nem
látogatja, de még az orvosságot is, mely benne a lelket tartogatta,
megtagadja a haldoklótól. Nem látod ebben a zsidó kezét, ki nem
irtózott eként menekülni a rá nézve veszedelmes tanútól?
– S a másik, feltaláltad a másikat?
– Salamon halottas ágyától Czenkre nyargaltam át, s holt
embertől gazemberhez jutottam.
– Hogy hogy? egykori hived, Czenki Jób is – –
– Bengabál embere; taval a zsidó szolgálatába állt, s most a
zálogról mit sem akar tudni, a kölcsönt pedig kétezer márkára
mondja, miért én állitólag ingatlan birtokomat kötöttem volna le.
Mérsékelnem kelle magamat, hogy porrá ne zúzzam az ocsmány
hittagadót.
– Fennmarad Márton a harmadik tanú, ki e gaz vallomást a
magáéval megsemmítse, s határozzon aztán az Isten-itélet! mondá
az igazság érzetében Lőrincz.
– Azt hiszed fiú, hogy még mindig Syriában élsz? kelt ki
indulatosan az öreg; az arabok közt, hol az igaz ügyet
megvesztegetés vagy pártérdek nem ferditheti el? nem tudod, hogy
Magyarország ege fed, mely alatt az a törvény, mit az istentelen
nádor mond; az az igazság, mit ő annak lenni itél; hol egy zsidó több
kedvezésben részesűl a törvény előtt, mint húsz nemes; hol a zsidó
hosszu napja jobban megszenteltetik, mint a karácson;
Magyarországban, hol ha a zsidó által elrablott jószágodat
visszafoglalod, a királyi kamra fosztogatójaként – ha törvényes
védelemben megsérted vagy megölöd őt, felségsértő gyanánt s
mindened elvesztésével bünhödöl? Magyarországban, hol zsidó a
kiváltságos nép, s a magyar az elnyomott, az üldözött szolgahad?
hiszed, ez lesz az első eset, hogy zsidó a zálogot eltagadja, s a
magyar hamis vádlóként fizet birságot, vagy ha fizetni nem tud,
odaitélt személye baromként húzza a zsidó jármát? S kihez fordúlsz
aztán igazságért? hová mégy sérelmedet panaszlani? A nádorhoz?
hisz ő maga a biró a zsidó és keresztyén közötti ügyekben s alázatos
szolgája Izraelnek. A királyhoz? mintha e szegény országnak volna
királya! mintha Endre volna egyéb játékbábnál Dénes kezében! Örülj,
hogy nem ismered e népet, a pogányok közűl hozott hited az
emberről tisztábban marad meg.
Lőrincznek már ajkain voltak a szavak, hogy a nádort s
környezetét igen is ismeri, czélszerűbbnek vélte azonban jobb jövő
reményével szelidíteni atyja ingerültségét.
– Türelem és reményben legyen a ti erőtök; mondá nyugodtan; e
szavakat az érsek által naponként hallom ídéztetni. Endre király sincs
örök életre kárhoztatva, s a hitlenek Béla önálló lelkében nem fognak
gyáva és hanyag czoborra találni.
– Csak hogy addig már el leszünk temetve, mert a nemesi birtok
legnagyobb része idegen kézbe menend át, mely a köznyomor alatt
elkorcsúlt népet kénye kedve szerint vezetendi. Mit várhat oly
nemzet, mely országának majdnem tizedrészét Bengabál birtokában
– s az érczbányáktól kezdve az állam minden jövedelmét általa
bérleni, kezelni, kisajtolni megtűri, mig a hon igaz jobb fiai
földönfutókká tétetnek? Mert hogy én, Simon bán, Magyarország fő
zászlós ura, egyetlen ivadékommal veled együtt, rövid nap azzá
leendek, többé nem kétkedem. Régen áskálódik már a veszett
uzsorás engem ez utolsó menedék-fészekből kitúrni, s mert jogos
czímet nem találhatott, ily csalárd eszközzel fog jutni czéljához. –
Simonnak, legalább a közel jövő iránti sejtelmei nagyon is igazak
valának, mert az alkonyépen azon órájában, midőn fiával eként közlé
aggodalmait, Bengabál Dávid szinte e tárgyról értekezett Dénes
nádorral, ki a panaszokat kihallgatni s törvény-napot tartani csak
imént érkezett Fertővárra.
A nádor s kisérete lenn a városban szállásoltaték el, nem mintha
zsidó födél alatt lakni nem akarna, de mert ez ragaszkodott az ősi
szokáshoz, mely akkor – keresztyént házi körébe avatni, laka
megfertőzésének tartá.
A tőzsér gyaloghintóban viteté magát az érkező elé, s kiszállván,
mély meghajlással üdvözlé s hívta meg magához – látogatásra.
A nép bámulva nézte, mily megelőző nyájassággal beszél a
rettegett úr a zsidóval, midőn a vár lépcsőzetén együtt mentek fel.
– Jó Dávid, te folyvást haladsz, szólt tréfásan s a kapu előtt fel s
alá járó alabárdosokra tekintve Dénes, – várat már épitél, megérjük,
hogy még sereged is lesz.
– Ártatlan őrök, felelt alázatosan a tőzsér, kik életemre,
biztosságomra vigyáznak. Az ember nem tudhatja, mely oldalról
támadja meg rosz akarat vagy irigység.
E szelid hang és modor azonban ugyanazon perczben
megtámadólag keménynyé változott, midőn a terembe lépve, ott
magukra maradtak.
– Ez tehát az igéret, az adott szó, a kötelezettség megtartása –
kezdé, összefont karokkal s redős homlokkal állva meg vendége előtt
– hogy ti országgyülésteken, minket a kincstári s egyéb közhivatalok
viselésétől eltiltó törvényt hoztok? ezért kölcsönöztem én, még pedig
kamat nélkül, Endrének újra tiz ezer márkát, nem is említve az
összegeket, miket a hatalmas nádor és kincstárnok – –
– Lassan lassan ben Gábael, szakitá félbe engesztelőleg e
szemrehányásokat a nádor – kevésbbé vagy-e te azért az ország
főadószedője s minden közjövedelem ura? meggörbité-e a második
decretum hitsorsosaid egyetlen egyikének is legkisebb hajszálát?
hidd el, irásban nem rejlik végrehajtási erő, ez nálam, kezeimben
van, s hogy ott maradjon, engednem kellett a papság zúgó
követelésének.
– Igen, a végrehajtási erő kezeidben van, de csak addig marad
ott, mig az esztergomi érseknek tetszik, kinek elég gyávák voltatok a
király által pecsétes iratot adatni, melyben ez, excommunicáltatás
terhe alatt esküszik a hozott törvényeket utólsó betűig megtartani.
Szégyen, szégyen, szégyen – ismétlé gúnyoson kiköpve Bengabál –
az ország urainak papok fenyítő botja alá kerülni! Erszényemből
tőbbé batkát sem láttok, tartozástokat visszakövetelem, mert – ha ez
így tart, – inkább itt hagyom nyomorú országtokat.
– Akkor legalább is tengerentúli afrikai partokra kell költöznöd,
jegyzé meg hidegen ellenfele, jól tudván mit kelljen e
fenyegetésekre adnia. Német, franczia, angol földön s egyebütt
tudtomra az adó beszedését nem bízzák hitsorsosaidra; vagy tán
honvágy lepett meg, s Granada és Toledo narancsberkei felé
sovárgasz? – tevé hozzá jól találó czélzással.
– Hagyjuk e gyermekes feleselést öreg, folytatá összevont
szemöldökkel, melyek igy a hajlott kos-orr fölött e g y koromfekete
vonalt képezének, – te jól tudod, hogy Magyarország nem lehet el
nélküled, de azt is, hogy – te sem lehetsz el Magyarország nélkül.
Végezzünk azért összesimulva – vagy van-e arra példa, hogy a jobb
kéz a balt ütötte volna és viszont?
– Értem, viszonzá gúnynyal a tőzsér; az éhes kincstár, és a
szomju nádor ismét Dávid ben Gábael aranyira szorúltak – –

É
– Épen úgy, vágott ez éllel mondott szavakba Dénes, épen úgy,
mint Dávid ben Gábael szorúl a kincstári jövedelmek bérletére, s a
nádor barátságára, midőn a törvénynapon i g a z s á g o t kell
szolgáltatni.
Ez utóbbi nyomatékos figyelmeztetés nem veszté el hatását.
– Mit kivánsz tehát? kérdé kis vártatva.
– Az elajándékozott várjavak erőhatalommali visszafoglalása évek
óta veszélyes játék, s ha sikerül, a sikerrel Béla és pártja jut
hatalompolczra, s akkor te és én és Sámuel és mindnyájan, kik e
jelen állapotot pártoljuk, legokosabban cselekszünk, ha az országból
kivezető legrövidebb utat keressük fel. De a mi nehezen megy
karddal, könnyen kivihető pénzzel. Az urak a veszett fejszének
legalább nyelét akarják, s némi megváltástól nem idegenek. E
megváltásra egyelőre tiz ezer márka kell – ez összeggel pártunk
megdönthetlenné erősül. Végül barátod megelégszik két ezerrel,
mely leányom készpénzbeli nászhozományát egészitendi ki.
– S mit ajánlsz mind ezekért?
– Semmit és mindent. E pergament lap most még csak nehány
batka értékü, mert egy aláirott néven kivül egyebet nem tartalmaz,
de a név fejedelemé, ki felhatalmazott az üres lapot alkunkhoz
képest betölthetni. Most rajtad a sor kivánni.
Bengabál rövid gondolkodás után vas határozottsággal sorolá el
feltételeit. – A pénzt, ugymond, az 1235. évi adó haszonbér fejében
előlegezem, miután a jövő három évre már ki van fizetve az illeték.
Biztositékul a visszaváltandó várjavakat kivánom. Tudom, tudom, –
akadályozá meg a közbeszólni akaró Dénest; ez feltünést okozna, de
van ebben is mód. Ti Volvelint és Tehát, Oltmant és Neklint, s még
kiket én ajánlandok fogjátok a kezeléssel megbizni, ők keresztyének

– Azaz keresztvizen álltak, de azért még most sem eszik meg a
sertés húst s nem főznek szombaton: nevetett közbe Dénes.
– Mindegy, de van keresztlevelük és nemeslevelük, s igy a világon
senki sem tehet kifogást ellenük. A várkatonaság állitását és zsoldját
kellő számadásig magamra vállalom. Továbbá magamnak tartom
fenn a Sámuel után következő kamragróf kineveztetését, s azért ne
késsetek a terv kivitelével –
– Sámuel ugyanaz nap leend nádorrá, melyen én kormányzóvá, s
ez azonnal megtörténik, mihelyest a főispánok s a várjavak jelen urai
pártomra állanak. Kamaragrófnak tehát Dávid ben Gábael nevét
irjam?
– Nem, a névnek üres tér marad, azt majd én irom oda. Enyém
lesz-e az vagy másé, nem a ti gondotok. Hátra van az általad kivánt
két ezer márka; legyen ez összeg három ezer, s nem kell reá sem
irás, sem tanú, az alku becsületes emberek közt köttetik, kik értik
egymást. Ha tetszenek a feltételek – itt a kezem.
Dénes megszorítá a zsidó kinyújtott sovány tenyerét, s a
legbarátságosabb hangon kérdé meg tőle, mi legyen majd a holnapi
törvénynapon az igazság?
XI.

A rég ohajtott nap hajnala Ráchelt ébren találta. A minden új és


szokatlannak örülni tudó gyermeteg szív százszoros erővel dobogott
fel most, midőn a szokatlanon felül, egy égve kinzó vágy reménylett
teljesülésének nézett eléje.
Bengabál örömünnepe volt e nap, melyről Ráchel csak annyit
tudott, hogy jó atyja igérete teljesitéseül összehivá a vidék lovagjait,
s az ábrándos epedő kebel majd felismerendi közöttük az
életmentőt, az élet adót, az arkangyalt, a büszke nemes arczú lovag
alakjában…
S minek is tudta volna a többi részleteket, a mai nap indokait,
előzményét? Hiszen az első ifjukor boldogító kiváltsága az, hogy nem
ismerve, nem értve az élet sötét árnyoldalait, a rajongó lélek csak a
költészet fénysugaraiban fürdik.
Miért kellett volna neki tudni azt, hogy atyja álnok csellel
fosztotta meg a szomszéd egykori főnemest utósó menhelyétől, s
hazudott tartozásért mely csak palástja volt az alatta rejlő boszúnak,
vesztegetett biró által e főnemes egyetlen fiát rabszolgául itéltette
oda magának.
Bengabál Dávid a Talmudra esküvék, h o g y Simon
állitása szerint neki zálogul adott gyémántok e
földön, alatta vagy fölötte sehol sem léteznek,
Czenki Jób mellette tanuskodott, az öreg Márton tanusága, m i n t
k e r e s z t y é n é z s i d ó e l l e n az akkori törvény értelmében
elvettetett, s e tényállás mellett Dénes nádor Simonnak nem csak
jószágát itélte a tőzsér részére, de, mert az elhagyott birtok
nyolczszáz ezüst márkánál többre nem becsültetett, a hátralék
leróvásául rabszolga gyanánt – mint ez akkor nem ritkán történt meg
– a vádlott személyét is.
A birói végrehajtás szivrázó jelenetek közt ment végbe. Az ősz
Simon, igazsága érzetében s halálos ellene a nádorral szemközt
hideg megvetésbe akarta fojtani indulatát, de kitört ez a heves
véralkatnál, s az ily pogányságot megtürő, eget és földet verő
átkozódásai puszta légbe hangzottak, mert a biró részén volt az erő
és hatalom.
A rabszolgaság pontjánál Lőrincz lépett elő; s ép két karját ajánlá
fel apját a nyomor és gyalázattól megváltani.
Vita támadt apa és fiú között. Bengabál az utóbbit fogadta el. Igy
még jobban leend megtörve az öreg, gondolá, s gyermekében, kit
csak imént nyert vissza, érzékenyebben sujtva. Ráchelére s arra
eszmélt, hogy inkább őt magát érje ezer fájdalom, mig egynek csak
árnyéka is imádott gyermekét.
A válás perczében az apa szíve megszakadt. Fia karjaiban
szélütés által érve omlott össze, s Lőrinczet a hulla öleléséből
hurczolák el bakói.
Ráchelnek azonban ily események lehetőségéről sejtelme sem
volt. Képzete, vágya, reménye csak azon ifju körűl röpkedett, kit
valóságban egyetlen egyszer s akkor is oly rövid időre látott, de kit a
túlszárnyaló phantasia három hó minden óráján át élő eszménykép
gyanánt rajzolt elé, kit ő azóta ismerni, szeretni, s bálványozni
megtanúlt.
Reggel óta ült már a halvány gyermek a laktereméből nyiló
szöglettorony kis kerek ablaka mellett, melyben rendesen rózsaszín
vagy sötétsárga üveglap szokott lenni, hogy a kitekintőnek az alant
elterülő vidéket szeszélyes szinezetben mutassa. Most ezen üveglap
helyett fátyol kelme volt a kerek ürbe alkalmazva, melyen át a künn
levő tárgyak tisztán valának láthatók, anélkül, hogy a szemlélő alakja
kivűlről észrevehető volna.
A kisded ablak Fertővár legszélesebb bástyájára nyilt. E
bástyateren kellett a vidék meghivott nemes urai- és ifjainak
összegyűlni az ünnepélyre, mit Bengabálnak az ellenfél bukásáni
örömtombolása rendezett.
– Egy új rabszolgát fog itt a nádor úri hatalmam alá bocsátani,
mondá a tőzsér ölére vont gyermekének – egy keresztényt, kinek
atyja egykor az ország főura s nekem halálos ellenem volt. Hadd
lássák a kevély nemesek, mint hajlik porig izrael fia előtt a
kiváltságos társ.
– S nemde ő is köztük lesz, atyám? kérdé az öröm és kétkedés
közt remegő sziv.
– Több, mint valószinű. Lovagodat előkelőnek festik szavaid s
ezek húsz mérföldnyi körből fognak ide megjelenni. Sisakján sastoll
leng, mondád s kékes aczélhálózat folyja körül derekát – –
– Igen, igen, ő te is ráismerendsz, kiváland ő a többek közűl, ha
ezren volnának is.
– A te kedves szemeidben s most midőn még ezret, sőt kettőt
sem láttál; tevé hozzá mosolyogva az atya; ki tudja, mire a nap
áldozik, ez marad-e véleményed?
Bengabál reménylé, hogy többek látása s a változatosság által
elmosódni s szétoszolni fog a makacsúl ápolt eszménykép, mit ő
inkább az idegzet szeszélyjátéknak, mint a kebel komolyabb
érzelemvilágának tartott. Aztán, gondolá hozzá nagyratörő czéljának
büszkesége, ha e szeszély valóvá érnék is, hány nemes van
Magyarországon, ki Bengabál lánya kezét elfogadni kész ne volna s
kivált ha vőmnek nászajándokúl az ország kincstárnokságát
adhatom?
Kürtriadás jelenté a nádor s lenn a városban összegyűlt lovagok
érkeztét. A lépcsőzet alján a lovak szolgáknak adattak át, s a nemes
urak gyalog jöttek fel a tőzsér látogatására, ki titkos büszkeséget
helyezett abban, hogy vendégeit ne délczeg paripák, de saját lábaik
hozzák elébe.
Fölkelt, arczon csókolá Ráchelt, s beinté a teremben váró Mártát
és Corzailt.
– Őrködjetek, mondá, távollétemben e drága lény fölött; s te
lelkem gyöngye édes Ráchelem ismerd meg választottadat, hogy
még ma tehessem őt, leendő férjedűl, boldogságtól áradó kebledre.
De Ráchel alig hallá már a távozó atya szavait – egész lelkével az
oly közel jövőn függve, ez minden egyéb eszmét magába nyelt.
Kedélye, kivált az ingerlékeny idegzetű nőknél, mint ő volt, gyakran
megfejthetlen rögtöni változáson ment át. Sejtelem, minő nagy
boldogság vagy szerencsétlenség előtt szokta elfogni a szivet,
szállotta meg lényét. A rég epedett percztől, most midőn
megérkezett, rettegni kezde; s a helyett, hogy a bástyatérre fellépő
lovagokra tekintene ki, mint ki napba nézni nem mer, kezébe rejté
arczát, melynek különben is átlátszó finom halványsága még
viaszszerübbé vált.
Az orvos és a dajka aggódva vették körűl az egész testében
lázasan reszketőt, ki kérdéseikre csak koronkénti felzokogással felelt.
Corzail az ablak felé ohajtá vonni figyelmét, reménylve, hogy a künn
zajló élet látása más irányt adand a benső viharában elfúló
kedélynek – hasztalan, Ráchel félig öntudatlan állapota sem a mór
orvos szavaira, sem Márta kérelmeire, sem a kivűlről beható zajra
nem birt zsibbadtságából magához térni.
Corzail már épen erősitő szerrel tért vissza mellé, midőn egy
erőteljes érczes hang csengésére Ráchel riasztott vadként üté fel
fejét, s szemeiben égető tüz gyúlt ki.
E végtelen keserüséggel mondott szavak tisztán valának
behallhatók:
– Gyönyörködjetek, atyám s hazám gyilkosának rabszolgájában
Magyarország fiai!
Ráchel felszökött dülő helyzetéből, kimeredt az ablak fátyolán, s
ugyanazon pillanatban éles sikoltással rogyott vissza dajkája
karjaiba.
XII.

A sikoltás, mely oly fájdalmasan hangzott, mintha egy ketté


repedt szivnek volna utósó panasza, lenn is halható volt. Mindenki
feltekintett, anélkül, hogy megtudhatná, miért, kitől, honnan
származott az?
Csupán kettő előtt nem volt e hang ismeretlen.
Az első, egy athletai termetű ifju, kin a kézbékó és durva darócz
zubbony a rabszolgát – a büszkén fennhordott fő azonban, s a
sötétkék szemek parancsoló tekintete a főnemesi vért árulá el,
ösztönszerüleg sejté, hogy e sikoltás a viszontlátás és
meglepetésnek volt feltörő hangja. Hasonlót, bár akkor rémülésből
származottat hallott ő már az erdőben, midőn Fertővár urának lányát
a parasztok dühétől menté meg.
A másik, ki jól találta el, mily érzület tolmácsa e hang, az apa
volt.
Pár percz múlva a nyugágy mellett térdelt ez, melyen Ráchel a
leghevesebb görcs-rohamok között vonaglott. A szegény gyermek
arczáról eltünt minden élet, vonásai kínosan eltorzultak; kis kezei
jéghidegek lőnek; ütere, mit Corzail aggódva tapintott, el-elmaradt, s
szó nem birta elhagyni fehérült ajkait. A görcs időszakonkénti
szüntével, fényüket vesztett szemeit merően egy pontra szögezé,
aztán keserves zokogásba törve ki, patakként omlottak ezekből a
könyek; majd ismét egyszerre elállt sirása, s a még nedűben rezgő
nagy granátszemek öntudatlan mosolyban ragyogtak fel, mely a
sírásnál is szívrázóbb fájdalomról beszélt.
Bengabál szakállát tépte és köntösét szaggatta meg, hivén, hogy
bálványozott gyermeke rögtön, karjai közt adja ki véglehelletét.
Kincsei felét igérte Corzailnak, ha visszaidézi a bucsúzó életerőt.
A mór orvos nem tudta, a halálra aggódó apát nyugtassa-e, a
jajveszékelő dajkát feddje-e, vagy az előtte ismeretlen bajt miként
orvosolja? enyhitő szereket hozott s a természet működésétől várt
javulást.
A könnyülés a leszálló éjjel érkezett meg. A görcsös szenvedés
fokonkint alább hagyott, a kékes szemhéjjak lenehezűltek, mintha a
hosszú pillákon rezgő könytöredék vonná le azokat, mint zápor után
az ázott lomb vonja maga után az ágat – vonásaira visszatért a
nyugalom, keble hullámzása csillapúlt s a szenvedéstől szender váltá
meg.
Corzail felnyitá a kertre nyiló ablakok egyikét, melyen fris lég és
viola-illat ömlött s a fogyó hold sütött be a kereveten fekvő márvány
szoborra. Ez alvó szobor körűl a tekintetével leányán függő apa, az
összefont karokkal komolyan álló afrikai tudós, s a beteg fejénél
gubbaszkodva figyelő Márta képezének hallgatag csoportozatot.
Mindhárman új bajtól tartva rezzentek fel az éjfél utáni méla
csendben, midőn Ráchel könnyeden ülő helyzetbe emelkedve s még
mindig lezárt szemhéjjakkal, lágy susogású hangon megszólalt. Az
apa, orvos és dajka léhlzetet feltartva figyeltek minden szóra.
– Beteg vagyok, kezdé, szivem lelkem testem egyiránt s egy októl
beteg. Bajomon csak e g y segithet – ha szenvedni fogok csak őt
hivjátok. Ő enyhitheti kinjaimat, de, bár megmentett a haláltól,
életemet visszaadni, fentartani nem akarja. Lelkem nagyobbrésze
nála van, s mi még bennem él, az a többihez kivánkozik. Ha Lőrincz
szeretne, meg volnék mentve. De szivében nincs Ráchel felé vonzó
hajlam, ez egy fő úr leányáé, enyém csak gyűlölete, mint kinek
atyjában atyja gyilkosát látja. Ott ül most sötét kamrájában –
kétségbeesetten; s ő még sem oly boldogtalan, mint én, mert szeret
és szerettetik. Ha szenvedni fogok, hivjátok őt – de ne jőjjön a
vasbékóval kezén – s enyhitni fog…
E szaggatva mondott tételek után csendesen ismét
visszaereszkedett nyughelyére s nehéz sohajtással tovább aludt.

Á
– Álom volt-e ez vagy éberlét? suttogá ámulattal s csaknem
egyszerre Márta és Bengabál.
A mór orvos előtt fejtve volt a kór. Ő olvasott a ritkán előforduló
delejes álmokról, melyekben a beteg általa soha nem hallott neveket
emlit, távollevőkről, jövőről beszél, saját gyógyszerét határozza –
álma tartósságát, felgyógyulását vagy halála napját jósolja meg.
Félrevonta a meglepett apát s közlé vele ismereteiből meritett
meggyőződését.
Bengabál ujuló reménynyel rögtön távozék s Lőrinczért küldött.
Ezt a rabfelügyelő rövid óranegyed múlva elébe állitá. A tőzsér
távozást parancsolt, s midőn az ifjuval egyedűl maradt, kezét
emennek vállára téve szólni akart, de a rab undorral rázta le a reá
sulyosúló kezet, visszalépett s fejét szótlan megvetéssel elfordítá.
– Simon fia Lőrincz, kezdé kérőleg engesztelő hangon az úr;
képes lennél-e feledni a multakat, ha én Dávid ben Gábael téged
egyetlen lányom kezével s ezáltal összes vagyonommal,
befolyásommal, hatalmammal kinálnálak meg?
Lőrincz, mintha nem is hallaná, egy szó feleletre sem méltatá a
kérdőt.
– Nemde hihetlennek tetszik ez ajánlat, folytatá ez, – de hogy
meggyőzzelek őszinteségéről, nyiltan kimondom a feltételt s ha kell
az okot. A feltétel az, hogy térj vissza a vallásra, mely egykor talán
déd-őseidé is volt. Mert hiszen nem keleti faj vagy-e, s keleten nem
Júda országa, vallása népe volt-e az első, a legnagyobb, a – –
– Legátkozottabb! riadt indulatosan közbe Lőrincz, – melyet az
igaz Isten haragja szétszórt, hogy soha többé ne egyesűljön.
– Egyesűlni fog, s tőled és eszélyességedtől függ ez új erős nagy
birodalom koronáját fejedre tenni.
Az ifju hosszan nézte végig Bengabált s válasza megvető
gúnykaczaj volt.

You might also like