100% found this document useful (6 votes)
39 views62 pages

Pro SQL Server Internals 2nd Edition Dmitri Korotkevitch Ebook All Chapters PDF

SQL

Uploaded by

ruibalturang
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (6 votes)
39 views62 pages

Pro SQL Server Internals 2nd Edition Dmitri Korotkevitch Ebook All Chapters PDF

SQL

Uploaded by

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

Download the full version of the textbook now at textbookfull.

com

Pro SQL Server Internals 2nd Edition Dmitri


Korotkevitch

https://textbookfull.com/product/pro-sql-server-
internals-2nd-edition-dmitri-korotkevitch/

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


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

Expert SQL Server Transactions and Locking: Concurrency


Internals for SQL Server Practitioners 1st Edition Dmitri
Korotkevitch
https://textbookfull.com/product/expert-sql-server-transactions-and-
locking-concurrency-internals-for-sql-server-practitioners-1st-
edition-dmitri-korotkevitch/
textbookfull.com

Expert SQL Server In-Memory OLTP 2nd Edition Dmitri


Korotkevitch

https://textbookfull.com/product/expert-sql-server-in-memory-oltp-2nd-
edition-dmitri-korotkevitch/

textbookfull.com

SQL Server Internals In Memory OLTP Inside the SQL Server


2016 Hekaton Engine 2nd Edition Kalen Delaney

https://textbookfull.com/product/sql-server-internals-in-memory-oltp-
inside-the-sql-server-2016-hekaton-engine-2nd-edition-kalen-delaney/

textbookfull.com

Germany s Wild East Constructing Poland as Colonial Space


Social History Popular Culture And Politics In Germany
First Edition Kopp
https://textbookfull.com/product/germany-s-wild-east-constructing-
poland-as-colonial-space-social-history-popular-culture-and-politics-
in-germany-first-edition-kopp/
textbookfull.com
Jacaranda Maths Quest Units 1 2 Essential Mathematics 11
for Queensland 1st Edition Mark Barnes

https://textbookfull.com/product/jacaranda-maths-quest-
units-1-2-essential-mathematics-11-for-queensland-1st-edition-mark-
barnes/
textbookfull.com

Principles of information security Fifth Edition Mattord

https://textbookfull.com/product/principles-of-information-security-
fifth-edition-mattord/

textbookfull.com

Leveraging Applications of Formal Methods Verification and


Validation Verification 8th International Symposium ISoLA
2018 Limassol Cyprus November 5 9 2018 Proceedings Part II
Tiziana Margaria
https://textbookfull.com/product/leveraging-applications-of-formal-
methods-verification-and-validation-verification-8th-international-
symposium-isola-2018-limassol-cyprus-november-5-9-2018-proceedings-
part-ii-tiziana-margaria/
textbookfull.com

Foundations of Deep Reinforcement Learning Theory and


Practice in Python First Edition Laura Graesser

https://textbookfull.com/product/foundations-of-deep-reinforcement-
learning-theory-and-practice-in-python-first-edition-laura-graesser/

textbookfull.com

Young People in the Labour Market Past Present Future


Youth Young Adulthood and Society 1st Edition Andy
Furlong
https://textbookfull.com/product/young-people-in-the-labour-market-
past-present-future-youth-young-adulthood-and-society-1st-edition-
andy-furlong/
textbookfull.com
Chemical Reaction Engineering and Reactor Technology,
Second Edition Tapio O. Salmi (Author)

https://textbookfull.com/product/chemical-reaction-engineering-and-
reactor-technology-second-edition-tapio-o-salmi-author/

textbookfull.com
T HE E X P ER T ’S VOIC E ® IN S QL

Pro SQL Server


Internals

Understand what happens under
the hood and how it affects you

Second Edition

Dmitri Korotkevitch
Pro SQL Server Internals
Second Edition

Dmitri Korotkevitch
Pro SQL Server Internals, Second Edition
Dmitri Korotkevitch
Tampa
Florida, USA
ISBN-13 (pbk): 978-1-4842-1963-8 ISBN-13 (electronic): 978-1-4842-1964-5
DOI 10.1007/978-1-4842-1964-5
Library of Congress Control Number: 2016959812
Copyright © 2016 by Dmitri Korotkevitch
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: Welmoed Spahr
Lead Editor: Laura Berendson
Technical Reviewer: Victor Isakov and Mike McQuillan
Editorial Board: Steve Anglin, Pramila Balan, Laura Berendson, Aaron Black, Louise Corrigan,
Jonathan Gennick, Todd Green, Robert Hutchinson, Celestin Suresh John, Nikhil Karkal,
James Markham, Susan McDermott, Matthew Moodie, Natalie Pao, Gwenan Spearing
Coordinating Editor: Jill Balzano
Copy Editor: April Rondeau
Compositor: SPi Global
Indexer: SPi Global
Artist: SPi Global
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.springer.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 www.apress.com.
Apress and friends of ED books 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 Special Bulk
Sales–eBook Licensing web page at www.apress.com/bulk-sales.
Any source code or other supplementary materials referenced by the author in this text are available to
readers at www.apress.com. For detailed information about how to locate your book’s source code, go to
www.apress.com/source-code/. Readers can also access source code at SpringerLink in the Supplementary
Material section for each chapter.
Printed on acid-free paper
To my family. Thank you for letting me disappear behind the keyboard
and ignore all my chores and duties!
Contents at a Glance

About the Author ..................................................................................................xxiii


About the Technical Reviewers .............................................................................xxv
Acknowledgments ...............................................................................................xxvii
Introduction ..........................................................................................................xxix

■Part I: Tables and Indexes .................................................................. 1


■Chapter 1: Data Storage Internals ......................................................................... 3
■Chapter 2: Tables and Indexes: Internal Structure and Access Methods ............ 31
■Chapter 3: Statistics ............................................................................................ 55
■Chapter 4: Special Indexing and Storage Features ............................................. 81
■Chapter 5: SQL Server 2016 Features ................................................................ 111
■Chapter 6: Index Fragmentation ........................................................................ 141
■Chapter 7: Designing and Tuning the Indexes ................................................... 155

■Part II: Other Things That Matter .................................................... 179


■Chapter 8: Constraints ....................................................................................... 181
■Chapter 9: Triggers ............................................................................................ 195
■Chapter 10: Views ............................................................................................. 213
■Chapter 11: User-Defined Functions .................................................................. 227
■Chapter 12: XML and JSON ................................................................................ 241
■Chapter 13: Temporary Objects and TempDB .................................................... 269

v
■ CONTENTS AT A GLANCE

■Chapter 14: CLR ................................................................................................. 293


■Chapter 15: CLR Types ....................................................................................... 311
■Chapter 16: Data Partitioning ............................................................................ 335

■Part III: Locking, Blocking, and Concurrency ................................. 379


■Chapter 17: Lock Types and Transaction Isolation Levels ................................. 381
■Chapter 18: Troubleshooting Blocking Issues ................................................... 395
■Chapter 19: Deadlocks ...................................................................................... 407
■Chapter 20: Lock Escalation .............................................................................. 423
■Chapter 21: Optimistic Isolation Levels ............................................................. 433
■Chapter 22: Application Locks........................................................................... 443
■Chapter 23: Schema Locks ................................................................................ 447
■Chapter 24: Designing Transaction Strategies .................................................. 457

■Part IV: Query Life Cycle ................................................................. 461


■Chapter 25: Query Optimization and Execution ................................................. 463
■Chapter 26: Plan Caching .................................................................................. 491

■Part V: Practical Troubleshooting ................................................... 517


■Chapter 27: Extended Events ............................................................................. 519
■Chapter 28: System Troubleshooting................................................................. 545
■Chapter 29: Query Store .................................................................................... 581

■Part VI: Inside the Transaction Log ................................................. 597


■Chapter 30: Transaction Log Internals .............................................................. 599
■Chapter 31: Backup and Restore ....................................................................... 615
■Chapter 32: High Availability Technologies ....................................................... 637

vi
■ CONTENTS AT A GLANCE

■Part VII: Columnstore Indexes ........................................................ 657


■Chapter 33: Column-Based Storage and Batch Mode Execution ....................... 659
■Chapter 34: Columnstore Indexes ..................................................................... 687

■Part VIII: In-Memory OLTP Engine................................................... 715


■Chapter 35: In-Memory OLTP Internals ............................................................. 717
■Chapter 36: Transaction Processing in In-Memory OLTP .................................. 753
■Chapter 37: In-Memory OLTP Programmability ................................................. 771

Index ..................................................................................................................... 793

vii
Contents

About the Author ..................................................................................................xxiii


About the Technical Reviewers .............................................................................xxv
Acknowledgments ...............................................................................................xxvii
Introduction ..........................................................................................................xxix

■Part I: Tables and Indexes .................................................................. 1


■Chapter 1: Data Storage Internals ......................................................................... 3
Database Files and Filegroups ......................................................................................... 3
Data Pages and Data Rows .............................................................................................. 8
Large Objects Storage .................................................................................................... 14
Row-Overflow Storage.......................................................................................................................... 14
LOB Storage .......................................................................................................................................... 16

SELECT * and I/O ............................................................................................................ 17


Extents and Allocation Map Pages ................................................................................. 19
Data Modifications ......................................................................................................... 21
Much Ado about Data Row Size ..................................................................................... 23
Table Alteration............................................................................................................... 25
Summary ........................................................................................................................ 28
■Chapter 2: Tables and Indexes: Internal Structure and Access Methods ............ 31
Heap Tables .................................................................................................................... 31
Clustered Indexes ........................................................................................................... 36
Composite Indexes ......................................................................................................... 45

ix
■ CONTENTS

Nonclustered Indexes ..................................................................................................... 46


Summary ........................................................................................................................ 52
■Chapter 3: Statistics ............................................................................................ 55
Introduction to SQL Server Statistics ............................................................................. 55
Column-Level Statistics ................................................................................................. 58
Statistics and Execution Plans ....................................................................................... 62
Statistics and Query Memory Grants.............................................................................. 65
Statistics Maintenance ................................................................................................... 68
New Cardinality Estimator (SQL Server 2014–2016) ...................................................... 69
Comparing Cardinality Estimators: Up-to-Date Statistics ..................................................................... 71
Comparing Cardinality Estimators: Outdated Statistics ........................................................................ 73
Comparing Cardinality Estimators: Indexes with Ever-Increasing
Key Values ............................................................................................................................................ 75
Comparing Cardinality Estimators: Joins .............................................................................................. 76
Comparing Cardinality Estimators: Multiple Predicates........................................................................ 77
Choosing the Model .............................................................................................................................. 78

Query Optimizer Hotfixes and Trace Flag T4199............................................................. 79


Summary ........................................................................................................................ 80
■Chapter 4: Special Indexing and Storage Features ............................................. 81
Indexes with Included Columns ..................................................................................... 81
Filtered Indexes .............................................................................................................. 87
Filtered Statistics ........................................................................................................... 90
Calculated Columns........................................................................................................ 93
Data Compression .......................................................................................................... 97
Row Compression ................................................................................................................................. 98
Page Compression .............................................................................................................................. 102
Performance Considerations .............................................................................................................. 104

Sparse Columns ........................................................................................................... 106


Summary ...................................................................................................................... 110

x
■ CONTENTS

■Chapter 5: SQL Server 2016 Features ................................................................ 111


Temporal Tables ........................................................................................................... 111
Stretch Databases ........................................................................................................ 118
Configuring Stretch Database............................................................................................................. 119
Querying Stretch Databases ............................................................................................................... 121
Stretch Database Pricing .................................................................................................................... 125

Row-Level Security ...................................................................................................... 126


Performance Impact ........................................................................................................................... 128
Blocking Modifications ....................................................................................................................... 130

Always Encrypted ......................................................................................................... 132


Always Encrypted Overview ............................................................................................................... 133
Programmability ................................................................................................................................. 134
Security Considerations and Key Management .................................................................................. 135

Dynamic Data Masking ................................................................................................ 136


Performance and Security Considerations ......................................................................................... 137

Combining Security Features ....................................................................................... 140


Summary ...................................................................................................................... 140
■Chapter 6: Index Fragmentation ........................................................................ 141
Types of Fragmentation ................................................................................................ 141
FILLFACTOR and PAD_INDEX ........................................................................................ 145
Index Maintenance ....................................................................................................... 146
Designing an Index Maintenance Strategy ................................................................... 146
Patterns That Increase Fragmentation ......................................................................... 148
Summary ...................................................................................................................... 153
■Chapter 7: Designing and Tuning the Indexes ................................................... 155
Clustered Index Design Considerations ........................................................................ 155
Identities, Sequences, and Uniqueidentifiers ..................................................................................... 160

Nonclustered Index Design Considerations .................................................................. 165

xi
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
■ CONTENTS

Optimizing and Tuning Indexes..................................................................................... 168


Detecting Unused and Inefficient Indexes .......................................................................................... 168
Index Consolidation ............................................................................................................................ 172
Detecting Suboptimal Queries ............................................................................................................ 174

Summary ...................................................................................................................... 178

■Part II: Other Things That Matter .................................................... 179


■Chapter 8: Constraints ....................................................................................... 181
Primary Key Constraints ............................................................................................... 181
Unique Constraints ....................................................................................................... 183
Foreign Key Constraints ............................................................................................... 184
Check Constraints ........................................................................................................ 188
Wrapping Up ................................................................................................................. 192
Summary ...................................................................................................................... 193
■Chapter 9: Triggers ............................................................................................ 195
DML Triggers ................................................................................................................ 195
DDL Triggers ................................................................................................................. 204
Logon Triggers .............................................................................................................. 206
UPDATE() and COLUMNS_UPDATED() Functions .......................................................... 207
Nested and Recursive Triggers..................................................................................... 208
First and Last Triggers .................................................................................................. 209
CONTEXT_INFO and SESSION_CONTEXT ...................................................................... 209
Summary ...................................................................................................................... 212
■Chapter 10: Views ............................................................................................. 213
Views ............................................................................................................................ 213
Indexed (Materialized) Views........................................................................................ 219
Partitioned Views.......................................................................................................... 224
Updatable Views ........................................................................................................... 224
Summary ...................................................................................................................... 225

xii
■ CONTENTS

■Chapter 11: User-Defined Functions .................................................................. 227


Much Ado About Code Reuse ....................................................................................... 227
Multi-Statement Functions........................................................................................... 229
Inline Table-Valued Functions....................................................................................... 235
Summary ...................................................................................................................... 240
■Chapter 12: XML and JSON ................................................................................ 241
To Use or Not to Use XML or JSON? That Is the Question! ........................................... 241
XML Data Type .............................................................................................................. 243
Working with XML Data ...................................................................................................................... 250
OPENXML ............................................................................................................................................ 260
SELECT FOR XML ................................................................................................................................ 261

Working with JSON Data (SQL Server 2016) ................................................................ 262


SELECT FOR JSON .............................................................................................................................. 263
Built-In Functions ............................................................................................................................... 264
OPENJSON .......................................................................................................................................... 265

Summary ...................................................................................................................... 267


■Chapter 13: Temporary Objects and TempDB .................................................... 269
Temporary Tables ......................................................................................................... 269
Table Variables ............................................................................................................. 276
User-Defined Table Types and Table-Valued Parameters ............................................. 281
Regular Tables in TempDB ............................................................................................ 287
Optimizing TempDB Performance................................................................................. 289
Summary ...................................................................................................................... 291
■Chapter 14: CLR ................................................................................................. 293
CLR Integration Overview ............................................................................................. 293
Security Considerations ............................................................................................... 295
Performance Considerations ........................................................................................ 299
Summary ...................................................................................................................... 309

xiii
■ CONTENTS

■Chapter 15: CLR Types ....................................................................................... 311


User-Defined CLR Types ............................................................................................... 311
Spatial Data Types ........................................................................................................ 319
HierarchyId ................................................................................................................... 328
Summary ...................................................................................................................... 334
■Chapter 16: Data Partitioning ............................................................................ 335
Reasons to Partition Data ............................................................................................. 335
When to Partition? ........................................................................................................ 337
Data Partitioning Techniques ........................................................................................ 337
Partitioned Tables ............................................................................................................................... 338
Partitioned Views ................................................................................................................................ 342
Comparing Partitioned Tables and Partitioned Views ......................................................................... 348
Using Partitioned Tables and Views Together ..................................................................................... 349

Tiered Storage .............................................................................................................. 352


Moving Non-Partitioned Tables Between Filegroups .......................................................................... 353
Moving Partitions Between Filegroups ............................................................................................... 356
Moving Data Files Between Disk Arrays ............................................................................................. 362
Tiered Storage in Action ..................................................................................................................... 364
Tiered Storage and High Availability Technologies ............................................................................. 367

Implementing Sliding Window Scenario and Data Purge ............................................. 367


Potential Issues ............................................................................................................ 369
Summary ...................................................................................................................... 377

■Part III: Locking, Blocking, and Concurrency ................................. 379


■Chapter 17: Lock Types and Transaction Isolation Levels ................................. 381
Transactions and ACID .................................................................................................. 382
Major Lock Types.......................................................................................................... 382
Exclusive (X) Locks ............................................................................................................................. 383
Intent (I*) Locks .................................................................................................................................. 383
Update (U) Locks................................................................................................................................. 384

xiv
■ CONTENTS

Shared (S) Locks................................................................................................................................. 386

Lock Compatibility, Behavior, and Lifetime ................................................................... 387


Transaction Isolation Levels and Data Consistency...................................................... 392
Summary ...................................................................................................................... 393
■Chapter 18: Troubleshooting Blocking Issues ................................................... 395
General Troubleshooting Approach ............................................................................... 395
Troubleshooting Blocking Issues in Real Time ............................................................. 396
Collecting Blocking Information for Further Analysis ................................................... 400
Summary ...................................................................................................................... 405
■Chapter 19: Deadlocks ...................................................................................... 407
Classic Deadlock .......................................................................................................... 407
Deadlock Due to Nonoptimized Queries ....................................................................... 408
Key Lookup Deadlock ................................................................................................... 410
Deadlock Due to Multiple Updates of the Same Row ................................................... 411
Deadlock Troubleshooting ............................................................................................ 416
Reducing the Chance of Deadlocks.............................................................................. 420
Summary ...................................................................................................................... 422
■Chapter 20: Lock Escalation .............................................................................. 423
Lock Escalation Overview ............................................................................................ 423
Lock Escalation Troubleshooting .................................................................................. 427
Summary ...................................................................................................................... 432
■Chapter 21: Optimistic Isolation Levels ............................................................. 433
Row Versioning Overview ............................................................................................. 433
Optimistic Transaction Isolation Levels ........................................................................ 434
READ COMMITTED SNAPSHOT Isolation Level .................................................................................... 434
SNAPSHOT Isolation Level .................................................................................................................. 435
Version Store Behavior ................................................................................................. 440
Summary ...................................................................................................................... 442

xv
■ CONTENTS

■Chapter 22: Application Locks........................................................................... 443


Application Locks Overview ......................................................................................... 443
Application Locks Usage .............................................................................................. 443
Summary ...................................................................................................................... 446
■Chapter 23: Schema Locks ................................................................................ 447
Schema Modification Locks ......................................................................................... 447
Multiple Sessions and Lock Compatibility .................................................................... 449
Lock Partitioning .......................................................................................................... 452
Low-Priority Locks ....................................................................................................... 454
Summary ...................................................................................................................... 456
■Chapter 24: Designing Transaction Strategies .................................................. 457
Considerations and Code Patterns ............................................................................... 457
Choosing Transaction Isolation Level ........................................................................... 459
Summary ...................................................................................................................... 460

■Part IV: Query Life Cycle ................................................................. 461


■Chapter 25: Query Optimization and Execution ................................................. 463
Query Life Cycle ........................................................................................................... 463
Query Optimization ....................................................................................................... 464
Query Execution ........................................................................................................... 468
Operators...................................................................................................................... 473
Joins ................................................................................................................................................... 474
Aggregates ......................................................................................................................................... 477
Spools ................................................................................................................................................. 479
Parallelism .......................................................................................................................................... 481

Query and Table Hints .................................................................................................. 485


INDEX Table Hint ................................................................................................................................. 485
FORCE ORDER Hint ............................................................................................................................. 487
LOOP, MERGE, and HASH JOIN Hints ................................................................................................... 487
FORCESEEK/FORCESCAN Hints........................................................................................................... 487
xvi
■ CONTENTS

NOEXPAND/EXPAND VIEWS Hints........................................................................................................ 487


FAST N Hints ....................................................................................................................................... 488
Summary ...................................................................................................................... 488
■Chapter 26: Plan Caching .................................................................................. 491
Plan Caching Overview................................................................................................. 491
Parameter Sniffing ....................................................................................................... 493
Plan Reuse ................................................................................................................... 499
Plan Caching for Ad-Hoc Queries ................................................................................. 503
Auto-Parameterization ................................................................................................. 505
Plan Guides .................................................................................................................. 506
Plan Cache Internals .................................................................................................... 511
Examining Plan Cache .................................................................................................. 513
Summary ...................................................................................................................... 515

■Part V: Practical Troubleshooting ................................................... 517


■Chapter 27: Extended Events ............................................................................. 519
Extended Events Overview ........................................................................................... 519
Extended Events Objects .............................................................................................. 520
Packages ............................................................................................................................................ 520
Events ................................................................................................................................................. 521
Predicates ........................................................................................................................................... 523
Actions ................................................................................................................................................ 525
Types and Maps .................................................................................................................................. 526
Targets ................................................................................................................................................ 527
Creating Events Sessions ............................................................................................. 530
Working with Event Data .............................................................................................. 531
Working with the ring_buffer Target ................................................................................................... 532
Working with event_file and asynchronous_file_target Targets ........................................................ 533
Working with event_counter and synchronous_event_counter Targets ............................................ 535
Working with histogram, synchronous_ bucketizer, and asynchronous_ bucketizer Targets ........... 536
Working with the pair_matching Target ............................................................................................. 538
xvii
■ CONTENTS

System_health and AlwaysOn_Health Sessions .......................................................... 539


Using Extended Events ................................................................................................. 540
Detecting Expensive Queries .............................................................................................................. 540
Monitoring Page Split Events.............................................................................................................. 542

Extended Events in Azure SQL Databases .................................................................... 543


Summary ...................................................................................................................... 544
■Chapter 28: System Troubleshooting................................................................. 545
Looking at the Big Picture ............................................................................................ 545
Hardware and Network....................................................................................................................... 546
Operating System Configuration ......................................................................................................... 547
SQL Server Configuration ................................................................................................................... 547
Database Options ............................................................................................................................... 548

Resource Governor Overview ....................................................................................... 550


SQL Server Execution Model ........................................................................................ 551
Wait Statistics Analysis and Troubleshooting ............................................................... 556
I/O Subsystem and Nonoptimized Queries ......................................................................................... 557
Parallelism .......................................................................................................................................... 562
Memory-Related Wait Types ............................................................................................................... 563
High CPU Load .................................................................................................................................... 565
Locking and Blocking ......................................................................................................................... 566
Worker Thread Starvation ................................................................................................................... 567
ASYNC_NETWORK_IO Waits ............................................................................................................... 568
Latches and Spinlocks........................................................................................................................ 569
Wait Statistics: Wrapping Up............................................................................................................... 572

Memory Management and Configuration ..................................................................... 574


Memory Configuration ........................................................................................................................ 574
Memory Allocation .............................................................................................................................. 575

What to Do When the Server Is Not Responding .......................................................... 576


Working with Baseline.................................................................................................. 578
Summary ...................................................................................................................... 579

xviii
■ CONTENTS

■Chapter 29: Query Store .................................................................................... 581


Why Query Store?......................................................................................................... 581
Query Store Configuration ............................................................................................ 582
Query Store Internals ................................................................................................... 583
Usage Scenarios........................................................................................................... 586
Working with Query Store in SSMS .................................................................................................... 587
Working with Query Store from T-SQL ................................................................................................ 591
Managing and Monitoring Query Store ........................................................................ 595
Summary ...................................................................................................................... 596

■Part VI: Inside the Transaction Log ................................................. 597


■Chapter 30: Transaction Log Internals .............................................................. 599
Data Modifications, Logging, and Recovery ................................................................. 599
Delayed Durability ........................................................................................................ 604
Virtual Log Files ............................................................................................................ 605
Database Recovery Models .......................................................................................... 607
TempDB Logging .......................................................................................................... 610
Excessive Transaction Log Growth ............................................................................... 610
Transaction Log Management ...................................................................................... 612
Summary ...................................................................................................................... 613
■Chapter 31: Backup and Restore ....................................................................... 615
Database Backup Types ............................................................................................... 615
Backing Up the Database ............................................................................................. 616
Restoring the Database ................................................................................................ 618
Restore to a Point in Time................................................................................................................... 619
Restore with STANDBY ....................................................................................................................... 621
Designing a Backup Strategy ....................................................................................... 622
Partial Database Availability and Piecemeal Restore ................................................... 626
Partial Database Backup .............................................................................................. 630

xix
■ CONTENTS

Microsoft Azure Integration .......................................................................................... 632


Backup to Microsoft Azure.................................................................................................................. 632
Managed Backup to Microsoft Azure .................................................................................................. 633
File Snapshot Backup for Database Files in Azure ............................................................................. 633
Summary ...................................................................................................................... 635
■Chapter 32: High Availability Technologies ....................................................... 637
SQL Server Failover Cluster.......................................................................................... 637
Database Mirroring and AlwaysOn Availability Groups ................................................. 641
Technologies Overview ....................................................................................................................... 641
Database Mirroring: Automatic Failover and Client Connectivity ........................................................ 644
AlwaysOn Availability Groups.............................................................................................................. 646
Log Shipping ................................................................................................................ 648
Replication ................................................................................................................... 649
Designing a High Availability Strategy .......................................................................... 651
Summary ...................................................................................................................... 654

■Part VII: Columnstore Indexes ........................................................ 657


■Chapter 33: Column-Based Storage and Batch Mode Execution ....................... 659
Data Warehouse Systems Overview ............................................................................. 659
Columnstore Indexes and Batch Mode Execution Overview ........................................ 662
Column-Based Storage and Batch Mode Execution ........................................................................... 663
Columnstore Indexes and Batch Mode Execution in Action ................................................................ 665
Column-Based Storage ................................................................................................ 673
Storage Format ................................................................................................................................... 673
Compression and Storage Size ........................................................................................................... 675
Metadata ............................................................................................................................................ 677
Design Considerations and Best Practices for Columnstore Indexes ........................... 681
Reducing Data Row Size..................................................................................................................... 681
Giving SQL Server as Much Information as Possible .......................................................................... 681
Maintaining Statistics ......................................................................................................................... 681
Avoiding String Columns in Fact Tables.............................................................................................. 682
Summary ...................................................................................................................... 684
xx
■ CONTENTS

■Chapter 34: Columnstore Indexes ..................................................................... 687


Columnstore Index Types ............................................................................................. 687
Read-Only Nonclustered Columnstore Indexes
(SQL Server 2012–2014) .............................................................................................. 688
Clustered Columnstore Indexes (SQL Server 2014–2016) ........................................... 691
Internal Structure ............................................................................................................................... 691
Data Load ........................................................................................................................................... 693
Delta Store and Delete Bitmap ........................................................................................................... 694
Columnstore Index Maintenance ........................................................................................................ 698
Nonclustered B-Tree Indexes (SQL Server 2016)................................................................................ 702
Updateable Nonclustered Columnstore Indexes
(SQL Server 2016) ........................................................................................................ 706
Metadata ...................................................................................................................... 709
sys.column_store_row_groups (SQL Server 2014–2016) .................................................................. 709
sys.dm_db_column_store_row_group_physical_stats (SQL Server 2016) ....................................... 710
sys.internal_partitions (SQL Server 2016) .......................................................................................... 710
sys.dm_db_column_store_row_group_operational_stats (SQL Server 2016)................................... 711

Design Considerations.................................................................................................. 711


Summary ...................................................................................................................... 712

■Part VIII: In-Memory OLTP Engine................................................... 715


■Chapter 35: In-Memory OLTP Internals ............................................................. 717
Why In-Memory OLTP? ................................................................................................. 717
In-Memory OLTP Engine Architecture and Data Structures .......................................... 718
Memory-Optimized Tables .................................................................................................................. 720
High Availability Technology Support .................................................................................................. 721
Data Row Structure ............................................................................................................................ 722
Hash Indexes ...................................................................................................................................... 723
Nonclustered (Range) Indexes ............................................................................................................ 728
Hash Indexes Versus Nonclustered Indexes ....................................................................................... 735
Statistics on Memory-Optimized Tables ............................................................................................. 735
Memory Consumers and Off-Row Storage ......................................................................................... 736

xxi
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
■ CONTENTS

Columnstore Indexes (SQL Server 2016) ............................................................................................ 740


Garbage Collection ............................................................................................................................. 743

Data Durability and Recovery ....................................................................................... 744


SQL Server 2016 Features Support .............................................................................. 748
Memory Usage Considerations..................................................................................... 748
Summary ...................................................................................................................... 750
■Chapter 36: Transaction Processing in In-Memory OLTP .................................. 753
Transaction Isolation Levels and Data Consistency...................................................... 753
Transaction Isolation Levels in In-Memory OLTP .......................................................... 754
Cross-Container Transactions ...................................................................................... 759
Transaction Lifetime ..................................................................................................... 760
Referential Integrity Enforcement (SQL Server 2016) .................................................. 765
Transaction Logging ..................................................................................................... 766
Summary ...................................................................................................................... 769
■Chapter 37: In-Memory OLTP Programmability ................................................. 771
Native Compilation ....................................................................................................... 771
Natively-Compiled Modules ......................................................................................... 775
Optimization of Natively-Compiled Modules....................................................................................... 776
Creating Natively-Compiled Stored Procedures ................................................................................. 776
Natively-Compiled Triggers and User-Defined Functions
(SQL Server 2016)............................................................................................................................... 779
Supported T-SQL Features .................................................................................................................. 782
Execution Statistics ............................................................................................................................ 784

Interpreted T-SQL and Memory-Optimized Tables ........................................................ 786


Memory-Optimized Table Types and Variables ............................................................. 786
In-Memory OLTP: Implementation Considerations ....................................................... 788
Summary ...................................................................................................................... 790

Index ..................................................................................................................... 793

xxii
About the Author

Dmitri Korotkevitch is a Microsoft Data Platform MVP and


Microsoft Certified Master (SQL Server 2008) with more than 20
years of IT experience, including years of experience working with
Microsoft SQL Server as an application and database developer,
database administrator, and database architect.
Dmitri specializes in the design, development, and performance
tuning of complex OLTP systems that handle thousands of transactions per
second around the clock.
Dmitri regularly speaks at various Microsoft and SQL PASS events,
and he provides SQL Server training to clients around the world. He
regularly blogs at http://aboutsqlserver.com, rarely tweets as
@aboutsqlserver, and can be reached at [email protected].

xxiii
About the Technical Reviewers

Victor Isakov is a database architect and Microsoft certified trainer. He provides consulting and
training services globally to various organizations in the public, private, and NGO sectors, and
has been involved in different capacities at various international events and conferences.
He has authored a number of books on SQL Server and worked closely with Microsoft to develop the
new generation of SQL Server 2005 certification and the Microsoft Official Curriculum for both ILT and
e-learning.
Specialties include Microsoft SQL Server; Microsoft analysis services; designing database solutions; re-
factoring database solutions; performance tuning database solutions; and SQL Server training.

Mike McQuillan is a software and database specialist who lives


with his wife and daughter in the United Kingdom. Mike is a
polyglot programmer who began messing around with computers
in the 1980s, first with an Atari 800XL and then a Sinclair Spectrum.
He took up databases in the 1990s and quickly fell in love with SQL.
He’s been working with SQL Server since version 7 and is an SQL
Server MCSA.
When he’s not tinkering with computers, Mike and his family enjoy
lengthy walks around Cheshire with the family pups, Dolly and Bertie
(who keep his feet warm when he’s writing).

xxv
Acknowledgments

First and foremost, I am enormously grateful to my technical reviewers, Victor Isakov and Mike McQuillan.
Their suggestions and comments were extremely helpful and dramatically improved the quality of the book.
It would have been impossible for me to complete the project without their help.
The same applies to the entire Apress team and especially to Jill Balzano, Douglas Pundick, and April
Rondeau. Special thanks go to Jonathan Gennick, who is keeping the series alive.
I would also like to thank Tom LaRock, who reviewed the first edition of the book. Even though he was
unable to participate in this project, you can see his influence all over the place.
Next, I would like to thank Thomas Grohser, who helped me to write Chapter 5 and provided great
feedback on a few other topics. He is a Microsoft Data Platform MVP with more than 20 years of experience
working with SQL Server. He specializes in designing and building SQL Server solutions that focus on high
availability, disaster recovery, scalability, security, and manageability.
I would like to thank Niko Neugebauer, who is the one of the world’s best experts in columnstore
indexes and data warehousing. Niko reviewed Chapters 33 and 34 and gave me great feedback on them.
Niko is a Microsoft Data Platform MVP and has, perhaps, the best columnstore indexes–related blog
on the Internet, which can be found at http://www.nikoport.com/columnstore. He also published
the Columnstore Indexes Scripts Library at GitHub, which you can access at https://github.com/
NikoNeugebauer/CISL.
The same thanks apply to Dmitry Pilugin for his help with Chapters 3 and 29. Dmitry is one of very few
people outside of Microsoft who knows how Query Optimizer actually works, and he generously reviewed
those chapters for me. You can read Dmitry’s blog about Query Processor at http://www.queryprocessor.com.
Obviously, a book about SQL Server would be meaningless without the product itself. I would like to
thank the entire Microsoft team for all their hard work and the wonderful platform they created. Special
thanks go to Jos de Bruijn, Sunil Agarwal, Ajay Jagannathan, Gjorgji Gjeorgjievski, Alexey Eksarevskiy, Borko
Novakovic, Arvind Shyamsundar, and many others who patiently answered my questions.
I would like to thank Ian Stirk and Nazanin Mashayekh for the great feedback on the first-edition
content. It helped me to improve the quality of this edition.
Finally, I would like to thank all my friends from the SQL Server community for their support and
encouragement. It is impossible to list everyone here, but there is one group of people I want to thank in
particular. Those are my Nepali friends: Dibya Shakya, Shree Khanal, Ravi Chandra Koirala, and Raghu
Bhandari. It was very motivating to meet such a wonderful community!
Thank you very much! It was a pleasure and honor to work with all of you!

xxvii
Introduction

Four years ago, when I had just started to work on the first edition of Pro SQL Server Internals, many people
asked me, “Why have you decided to write yet another book on the subject? There are plenty of other
Internals books already published.” It was—and, as a matter of fact, still is—a very valid question, which I feel
obligated to answer.
I set myself two goals when I started to work on the series. First, I wanted to explain how SQL Server
works in the most practical way, demonstrating dependencies between particular aspects of SQL Server
Internals and the behavior of your systems. Perhaps it deserves some explanation.
There is a joke in the SQL Server community: “How do you distinguish between junior- and senior-level
database professionals? Just ask them any question about SQL Server. The junior-level person gives you the
straight answer. The senior-level person, on the other hand, always answers, ‘It depends.’”
As strange as it sounds, that is correct. SQL Server is a very complex product with a large number of
components that depend on each other. You can rarely give a straight yes or no answer to any question. Every
decision comes with its own set of strengths and weaknesses and leads to consequences that affect other
parts of the system.
Pro SQL Server Internals covers on what, exactly, “it depends.” I wanted to give you enough information
about how SQL Server works and to show you various examples of how specific database designs and code
patterns affect SQL Server’s behavior. I tried to avoid generic suggestions based on best practices. Even
though those suggestions are great and work in a large number of cases, there are always exceptions. I hope
that, after you read this series, you will be able to recognize those exceptions and make decisions that benefit
your particular systems.
My second goal was based on the strong belief that the line between database administration and
development is very thin. It is impossible to be a successful database developer without knowledge of SQL
Server Internals. Similarly, it is impossible to be a successful database administrator without the ability
to design efficient database schema and write good T-SQL code. That knowledge helps both developers
and administrators to better understand and collaborate with each other, which is especially important
nowadays in the age of agile development and multi-terabyte databases.
This belief came from my personal experience. I started my career in IT as an application developer,
slowly moving to backend and database development over the years. At some point, I found that it was
impossible to write good T-SQL code unless I understood how SQL Server executed it. That discovery forced
me to learn SQL Server Internals, and it led to a new life in which I design, develop, and tune various database
solutions. I do not write client applications anymore; however, I perfectly understand the challenges that
application developers face when they deal with SQL Server. I have “been there and done that.”
My biggest challenge during the transition to the Internals world was to find good learning materials.
There were plenty of good books; however, all of them had a clear separation in their content. They expected
the reader to be either developer or database administrator—never both. I tried to avoid that separation
in this book. Obviously, some of the chapters are more DBA-oriented, while others lean more toward
developers. Nevertheless, I hope that anyone who is working with SQL Server will find the content useful.
You should not, however, consider Pro SQL Server Internals to be a SQL Server tutorial. Nor is it a
beginner-level book. I expect you to have previous experience working with relational databases, preferably
with SQL Server. You need to know RDBMS concepts, be familiar with different types of database objects,
and be able to understand SQL code if you want to get the most out of this series.

xxix
Random documents with unrelated
content Scribd suggests to you:
Kulkiessaan edelleen Ugambia ylös tuli hän kaksi päivää
myöhemmin suureen kylään. Päällikkö, häijynnäköinen veitikka —
hänellä oli teräviksi viilatut hampaat, jotka usein ilmaisevat
ihmissyöjää — otti hänet vastaan näennäisen ystävällisesti.

Apinamies oli nyt lopen uupunut ja oli päättänyt levätä kahdeksan


tai kymmenen tuntia, ollakseen reipas ja voimakas, kun saavuttaisi
Rokoffin — hän oli varma siitä, että se tapahtuisi hyvin lyhyessä
ajassa.

Päällikkö kertoi hänelle, että parrakas valkoinen mies oli lähtenyt


kylästä juuri edellisenä aamuna ja että Tarzan epäilemättä tavoittaisi
hänet pian.

Toista matkuetta ei päällikkö sanonut nähneensä eikä kuulleensa.

Tarzan ei pitänyt miehen ulkomuodosta eikä käytöksestä, sillä


vaikka tämä kyllä oli ystävällinen, näytti hän tuntevan jonkinlaista
halveksumista puolialastonta valkoista miestä kohtaan, joka tuli
ilman seuralaisia eikä antanut lahjoja. Mutta Tarzan tarvitsi lepoa ja
ravintoa, jota kylä tarjosi hänelle vähemmällä vaivalla kuin viidakko,
ja näin ollen, koska hän ei pelännyt ketään ihmistä, eläintä tai
paholaista, kyyristyi hän erään majan varjoon ja oli pian unessa.

Tuskin oli hän lähtenyt päällikön luota, kun tämä kutsui puheilleen
kaksi soturia, joille hän kuiskasi muutamia määräyksiä. Hetkeä
myöhemmin nuo sileäihoiset mustat hahmot kiitivät pitkin joenvartta
ylöspäin itään.

Kylää piti päällikkö ihan hiljaisena. Hän ei sallinut kenenkään


lähestyä nukkuvaa vierasta eikä laulaa tai puhua äänekkäästi. Hän oli
merkillisesti huolissaan siitä, ettei hänen vierastaan häirittäisi.
Kolme tuntia myöhemmin tuli useita kanootteja näkyviin Ugambin
yläjuoksulta päin. Mustien soutajien jäntevät lihakset antoivat niille
nopean vauhdin. Päällikkö seisoi joen rannalla pitäen keihästään
vaakasuorassa päänsä yläpuolella ikäänkuin jonakin ennakolta
sovittuna merkkinä tulijoille.

Ja sellainen tarkoitus olikin hänen asennollaan — se merkitsi, että


kylässä oleva valkoinen muukalainen yhä nukkui rauhallisesti.

Kahden kanootin kokassa olivat sanansaattajat, jotka päällikkö oli


lähettänyt kolme tuntia takaperin. Heidät oli ilmeisesti pantu
hakemaan ja tuomaan tätä seuruetta, ja päällikön samalla antama
merkki oli sovittu ennen heidän lähtöään.

Muutaman hetken kuluttua kanootit laskivat vihreälle rannalle.


Alkuasukassoturit astuivat maihin, ja heidän mukanaan oli puoli
tusinaa valkoisia miehiä. He olivat synkkiä, ilkeännäköisiä veitikoita,
mutta voiton kaikista vei heidän johtajansa, kavalalta näyttävä
mustapartainen mies.

"Missä on valkoinen mies, jonka sanansaattajasi ilmoittivat olevan


kylässäsi?" kysyi hän päälliköltä.

"Tätä tietä, bwana", vastasi alkuasukas. "Olen huolellisesti pitänyt


yllä hiljaisuutta kylässä, että hän olisi vielä nukuksissa teidän
palatessanne. En tiedä, onko hän etsimässä teitä tehdäksenne teille
pahaa, mutta hän kyseli minulta tarkasti tulemistanne ja
menemistänne. Hän on sellainen kuin kuvailitte sen miehen olevan,
jonka luulitte olevan varmassa tallessa Viidakkosaareksi
sanomassanne maassa. Jollette olisi kertonut minulle tarinaa, en olisi
tuntenut häntä, ja silloin hän olisi tullut perässänne ja tappanut
teidät. Jos hän on ystävä eikä vihollinen, niin ei ole tullut mitään
vahinkoa, bwana; mutta jos hän osoittautuu viholliseksi, tahtoisin
hyvin mielelläni pyssyn ja vähän ammuksia."

"Sinä olet tehnyt hyvin", vastasi valkoinen mies, "ja sinä saat
pyssyn ja ammuksia, olkoonpa hän ystävä tai vihollinen, kunhan vain
pysyt puolellani."

"Minä pysyn puolellasi, bwana", sanoi päällikkö. "Tule nyt


katsomaan muukalaista, joka nukkuu kylässäni."

Näin sanoen hän kääntyi ja suuntasi matkan sitä majaa kohti,


jonka varjossa kaikesta tietämätön Tarzan nukkui rauhallisesti.

Noiden kahden miehen takana tulivat muut valkoiset miehet ja


parikymmentä mustaa soturia. Päällikön ja hänen seuralaisensa
kohotettu etusormi sai heidät kaikki pysymään aivan hiljaa.

He kääntyivät majan nurkan ympäri hiipien varovasti varpaillaan.


Ilkeä hymy väreili valkoisen miehen huulilla, kun hänen silmänsä
sattuivat nukkuvan apinamiehen jättiläisvartaloon.

Päällikkö katsoi häneen kysyvästi. Mies nyökkäsi osoittaakseen,


ettei päällikkö ollut erehtynyt luulossaan. Sitten hän kääntyi
takanaan olevia miehiä kohti ja osoittaen nukkujaa viittasi heitä
tarttumaan häneen ja sitomaan hänet.

Hetkeä myöhemmin oli tusinan verran raakoja miehiä hyökännyt


ällistyneen Tarzanin kimppuun, ja he tekivät työnsä niin nopeasti,
että hän oli sidottu lujasti, ennenkuin saattoi vähääkään yrittää
pakenemista.

Sitten he käänsivät hänet selälleen, ja kun hänen silmänsä


kääntyivät lähellä olevaan joukkoon päin, kohtasivat ne Nikolas
Rokoffin pahanilkiset kasvot.

Ivahymy väreili venäläisen huulilla. Hän astui aivan Tarzanin luo.

"Sika!" huudahti hän. "Etkö ole vielä tarpeeksi viisas pysyäksesi


erilläsi Nikolas Rokoffista?"

Sitten hän potkaisi pitkällään olevaa miestä suoraan kasvoihin.

"Siinä on tervetuliaisiksi", sanoi hän. "Tänä iltana, ennenkuin


mustat ystäväni syövät sinut, kerron ensin, mitä jo on tapahtunut
vaimollesi ja lapsellesi ja mitä suunnitelmia minulla on heidän
tulevaisuutensa varalle."
KAHDEKSAS LUKU

Kuolemantanssi

Suuri notkea olento luikerteli pehmeillä käpälillään aivan


äänettömästi pilkkopimeässä yössä viidakon rehevien, toisiinsa
kietoutuneiden puiden ja pensaiden läpi.

Vain kaksi hehkuvaa keltaisenvihreätä pistettä heijastui silloin


tällöin kuun säteissä, joka joskus tunkeutui yötuulessa vienosti
huokailevan lehväkaton läpi.

Aika-ajoin eläin seisahtui ja nuuski etsivästi kuono ylöspäin


kohotettuna. Toisinaan nopea, lyhyt käväisy yläpuolella olevilla
oksilla viivytti hetken ajan sen keskeytymätöntä matkaa itää kohti.
Sen herkkiin sieraimiin tuli monen herkullisen nelijalkaisen olennon
hieno, miltei tuntematon haju, saaden sen julmat, riippuvat
leukapielet vettymään.

Mutta se jatkoi itsepintaisesti matkaansa, omituisesti välittämättä


nälän vaatimuksista, joka jollakin toisella kertaa olisi pannut sen
pehmeän turkin peittämät lihakset pullistumaan ja saanut sen
syöksymään hampaineen johonkin hentoon kurkkuun.
Koko yön olento kulki yksinäistä tietään ja seuraavana päivänä se
pysähtyi vain kerran tappaakseen yhden ainoan otuksen, jonka se
repi palasiksi ja hotki suuhunsa muristen kumeasti ja äreästi,
ikäänkuin se olisi ollut puolikuollut ruuanpuutteesta.

Oli hämärä, kun se lähestyi paalutusta, joka ympäröi suurta


alkuasukaskylää. Nopean ja äänettömän kuoleman varjon tavoin se
kierteli kylää kuono maassa ja pysähtyi lopulta aivan lähelle
paalutusta, missä tämä melkein kosketti usean majan takaosaa.
Siellä eläin nuuski hetken ajan ympäristöään ja kääntäen sitten
päätänsä se kuunteli tarkkaavasti korvat pystyssä.

Se, mitä se kuuli, ei ollut mikään ääni ihmiskorvilla arvosteltuna,


mutta eläimen hyvin harjaantuneet ja herkät aistimet näyttivät
tuovan jonkun sanoman sen villeihin aivoihin. Ihmeellinen muutos
tapahtui siinä liikkumattomassa, patsasta muistuttavassa luu- ja
lihasyhdistelmässä, joka hetkeä aikaisemmin oli ollut kuin elävästä
pronssista valettu.

Aivan kuin ollen teräsvieterien päällä, jotka äkkiä olivat lauenneet,


se ponnahti nopeasti ja äänettömästi paalutuksen harjalle ja katosi
varovasti kuin kissa puuaidan ja läheisen majan väliseen mustaan
solaan.

Toisella puolen olevalla kylätiellä naiset sytyttelivät monia pieniä


tulia ja kokosivat vedellä täytettyjä keittoastioita, sillä aiottiin viettää
suuri juhla, ennenkuin yö olisi lopussa. Tukevan paalun luona
keskellä ympäröiviä tulia seisoi pieni ryhmä mustia sotureita
keskustellen. Heidän ruumiiseensa oli maalattu eriskummaisia leveitä
juovia, valkoisia, sinisiä ja keltaisia. Silmien ja huulien ympäri,
rintaan ja vatsaan oli tehty suuria värikkäitä ympyröitä, ja heidän
savella tahratusta tukkalaitteestaan pisti esiin kirjavia sulkia ja pitkiä
suoria rautalanganpalasia.

Kylä valmistautui juhlaa varten, samalla kun eräässä majassa


hurjan juhlan näyttämön sivulla heidän eläimellisen ruokahalunsa
uhri odotti sidottuna loppuansa. Ja millaista loppua!

Apinain Tarzan jännitti mahtavat lihaksensa saadakseen poikki


kahleet, jotka sitoivat häntä, mutta niitä oli monta kertaa vahvistettu
venäläisen yllytyksestä, joten apinamiehenkään jättiläisvoimat eivät
voineet niille mitään.

Kuolema!

Tarzan oli monta kertaa katsonut tätä kolkkoa metsästäjää


suoraan kasvoihin ja hymyillyt. Ja hän hymyilisi tänäkin yönä, kun
tiesi, että loppu tulisi nopeasti; mutta nyt hän ei ajatellut itseään,
vaan noita toisia, niitä rakkaita, joiden täytyi eniten kärsiä hänen
poistumisestaan.

Jane ei saisi milloinkaan tietää, miten hän kuoli. Siitä hän kiitti
taivasta, ja hän oli kiitollinen siitäkin, että ainakin Jane oli turvassa
maailman suurimman kaupungin sydämessä. Turvassa herttaisten ja
rakastavien ystävien keskellä, jotka tekisivät parhaansa
keventääkseen hänen kuormaansa.

Mutta poika!

Tarzan kiemurteli tuskissaan ajatellessaan häntä. Hänen oma


poikansa! Ja nyt hän itse — viidakon mahtava herra — hän, Tarzan,
apinain kuningas, ainoa koko maailmassa, joka kykeni löytämään ja
pelastamaan lapsen niistä kauhuista, jotka Rokoffin roistomainen
mieli oli suunnitellut, — oli joutunut ansaan kuten tyhmä, mykkä
eläin. Hän kuolisi muutaman tunnin kuluttua ja hänen mukanaan
häviäisi lapsen viimeinen pelastuksen toivo.

Rokoff oli iltapäivällä ollut useita kertoja herjaamassa ja


pahoinpitelemässä häntä, mutta ei ollut onnistunut saamaan yhtään
vastustavaa sanaa tai tuskanvalitusta jättiläisvangin huulilta.

Sitten Rokoff oli lopulta luopunut yrityksestään, jättäen erikoisen


taidokkaasti suunnittelemansa sielullisen kidutuksen viime hetkeen.
Silloin, juuri ennenkuin ihmissyöjien julmat keihäät ainiaaksi
lopettaisivat hänen vihansa esineen kärsimykset, hän aikoi
viholliselleen ilmaista Janen todellisen olopaikan, Tarzanin luullessa
hänen olevan turvallisesti Englannissa.

Hämärä oli laskeutunut kylään ja apinamies saattoi kuulla, kuinka


hänen kiduttamistaan ja illan juhlaa edelleen valmisteltiin. Hän
saattoi ajatuksissaan kuvailla kuolemantanssia — hän oli sen nähnyt
monta kertaa ennen. Nyt hän joutuisi kaiken keskukseksi, paaluun
kytkettynä.

Häntä ei pelottanut kidutus ja kova kuolema — kun ympärillä


tanssivat soturit leikkelisivät hänet palasiksi julman taitavasti,
silpoisivat hänet aiheuttamatta ruumiissa tunnottomuutta. Hän oli
tottunut kärsimiseen, veren näkemiseen ja julmaan kuolemaan.
Mutta elämisen halu oli silti hänessä yhtä voimakkaana, ja kunnes
elämänliekki viimeisen kerran leimahtaisi ja sammuisi, olisi koko
hänen olemuksensa täynnä toivoa ja päättäväisyyttä. Jos heidän
tarkkaavaisuutensa herpautuisi hetkeksikin, keksisivät hänen älykäs
mielensä ja jättiläislihaksensa jonkun tavan päästä pakoon — päästä
pakoon ja kostaa.
Kun hän makasi siinä harkiten kiihkeästi kaikkia
pelastusmahdollisuuksia, tuli tuttu haju heikosti hänen herkkiin
sieraimiinsa. Heti paikalla heräsivät hänen kaikki aistinsa täyteen
toimintaan. Hänen harjaantuneet korvansa kuulivat pian ulkopuolelta
muille kuulumattoman äänen — hänen majansa takana oli joku
olento.

Hänen huulensa liikkuivat, ja vaikka ei kuulunut mitään ääntä,


jonka ihmiskorva olisi erottanut hänen vankilansa seinien takaa, tiesi
hän kuitenkin, että ulkopuolella oleva olento kuulisi hänet. Hän tiesi
jo, kuka siellä oli, sillä hänen sieraimensa olivat ilmaisseet sen yhtä
selvästi kuin meidän silmämme tuntevat vanhan ystävän, jonka
tapaamme kirkkaassa päivänvalossa.

Hetkeä myöhemmin hän kuuli turkispeitteisen ruumiin ja


pehmeiden jalkojen hiljaista liikuntaa, kun eläin kiipesi paalutuksen
yli majan takaa. Sitten kuului räiskinää niissä paaluissa, joista seinä
oli tehty. Pian livahti näin muodostuneesta reiästä suuri eläin, joka
painoi kylmän kuononsa hänen kaulaansa vasten. Se oli Sheeta-
pantteri.

Eläin nuuski pitkällään olevaa miestä vinkuen hiljaa. Tarzanin ja


Sheetan välisellä ajatustenvaihdolla oli rajansa, joten Tarzan ei
voinut olla varma siitä, ymmärsikö Sheeta kaikki, mitä hän koetti
tälle ilmoittaa. Sheeta saattoi tietystikin nähdä, että mies oli sidottu
ja avuton, mutta Tarzan ei voinut sanoa, aiheuttiko tämä seikka
pantterin mielessä mitään käsitystä hänen herraansa uhkaavasta
vaarasta.

Mikä oli tuonut eläimen hänen luokseen? Se, että Sheeta oli tullut,
oli hyvänä enteenä siitä, mitä se saattoi tehdä. Mutta kun Tarzan
koetti saada Sheetan kalvamaan siteet poikki, ei tuo suuri eläin
näyttänyt voivan käsittää, mitä häneltä odotettiin, vaan nuoleskeli
sensijaan vangin ranteita ja käsivarsia.

Pian tuli tässä kaikessa keskeytys. Joku lähestyi majaa. Sheeta


murahti kumeasti ja livahti kaukaiseen, pimeään nurkkaan. Tulija ei
ollut ilmeisesti kuullut varoittavaa ääntä, sillä hän astui miltei heti
majaan — pitkä, alaston, villi soturi.

Hän tuli Tarzanin sivulle ja pisti häntä keihäänsä kärjellä.


Apinamiehen huulilta kuului omituinen, kaamea ääni ja siihen
vastaukseksi hypähti majan äärimmäisen nurkan pimeydestä esiin
turkispeitteinen hahmo salamannopeana kuin kuoleman vasama.
Suuri peto iski suoraan neekerin maalattuun rintaan, kaivaen terävät
kyntensä mustaan ihoon ja upottaen suuret, keltaisen
torahampaansa pikimustaan kurkkuun.

Neekeri päästi hirveän tuskan ja kauhun huudon, johon sekaantui


saaliinsa kimpussa olevan pantterin karmiva kiljunta. Sitten tuli
hiljaisuus — ei kuulunut muuta kuin verisen lihan repimistä ja
ihmisluiden musertumista mahtavien leukojen välissä.

Melu oli saanut äkillisen hiljaisuuden aikaan koko kylässä. Sitte


kuului ääniä, jotka tuntuivat neuvottelevan.

Kuului kimeitä, pelokkaita huutoja ja syvällä matalalla äänellä


lausuttuja päällikön käskyjä. Tarzan ja pantteri kuulivat monien
ihmisten lähestyviä askeleita, ja sitten suuri kissaeläin nousi Tarzanin
hämmästykseksi saaliinsa päältä ja livahti äänettömästi majasta pois,
samasta aukosta, josta oli tullutkin.

Mies kuuli, kuinka Sheetan ruumis hiljaa viisti paalutusta pedon


mennessä sen yli. Sitten tuli hiljaisuus. Majan vastakkaiselta puolelta
hän kuuli villien tulevan katsomaan, mitä oli tapahtunut.

Hänellä oli hyvin vähän toivoa, että Sheeta palaisi, sillä jos tämä
olisi aikonut puolustaa häntä kaikkia tulijoita vastaan, olisi se jäänyt
hänen viereensä kuullessaan villien lähestyvän ulkoapäin.

Tarzan tiesi, kuinka omituisesti viidakon mahtavien lihansyöjien


aivot työskentelevät — kuinka villin pelottomia ne saattoivat olla
varman kuoleman edessä ja toisaalta kuinka pelokkaita
vähimmästäkin aiheesta. Hän oli varma siitä, että jokin pelontunne
lähestyvissä villeissä oli aiheuttanut vastaavan vaikutelman pantterin
hermostossa ja saanut sen hiipimään häntä koipien välissä
viidakkoon.

Tarzan kohautti hartioitaan. No, mitäpä siitä? Hän oli odottanut


kuolemaa, ja mitä olisi Sheeta voinut tehdä hänen hyväkseen muuta
kuin raastaa kappaleiksi pari hänen vihollistaan, ennenkuin jonkun
valkoisen miehen kädessä oleva pyssy olisi tuottanut lopun eläimelle
itselleen!

Jospa pantteri olisi voinut vapauttaa hänet! Silloin asia olisi


kehittynyt aivan toisin. Mutta se ei ollut Sheetan tajuttavissa, ja nyt
eläin oli mennyt ja Tarzanin täytyi lopullisesti luopua toivosta.

Alkuasukkaat olivat nyt majan ovella ja kurkistelivat pelokkaina


sisällä vallitsevaan pimeyteen. Kahdella etumaisella oli sytytetty
soihtu vasemmassa kädessään ja keihäs valmiina oikeassa. He
ponnistelivat arkoina takana olevia vastaan, jotka työnsivät heitä
eteenpäin.

Pantterin uhrin huudot, yhtyneinä suuren pedon karjuntaan, olivat


suuresti vaikuttaneet heidän pinnistettyihin hermoihinsa, ja nyt
tuntui pimeän majan hiljaisuus ennustavan vielä hirveämpää kuin
kaamea kiljunta.

Pian toinen niistä, joita väkivalloin työnnettiin sisään, keksi hyvän


keinon saada ensin tarkoin selville, minkälainen vaara uhkasi häntä
vaikenevasta pimennosta. Hän sinkautti sytytetyn soihtunsa keskelle
majaa. Heti paikalla oli koko sisusta lyhyen sekunnin ajan valoisana,
ennenkuin soihtu sammui pudotessaan multalattialle.

Majassa näkyi valkoisen vangin hahmo, samalla tavoin lujasti


sidottuna kuin he olivat viimeksi nähneet hänet, ja keskellä majaa oli
toinen olento yhtä liikkumattomana, kurkku ja rinta kauheasti
revittynä ja raadeltuna.

Näky, joka kohtasi etumaisten villien silmiä, tuotti heidän


taikauskoisessa rinnassaan suurempaa kauhua kuin Sheetan läsnäolo
olisi aiheuttanut, sillä he näkivät ainoastaan toveriaan vastaan
tehdyn rajun hyökkäyksen tulokset.

Kun he eivät nähneet syytä, oli heidän pelon lamauttama mielensä


valmis pitämään synkkää tekoa yliluonnollisten syiden aiheuttamana,
ja tässä ajatuksessa he lähtivät kiljuen majasta ja kaatoivat
ylenpalttisessa kauhussaan takana olijat kumoon.

Tunnin ajan Tarzan kuuli vain kiihtyneiden äänien sekasortoa kylän


äärimmäisestä päästä. Ilmeisesti neekerit koettivat saada
epävakaisen rohkeutensa taas nousemaan niin korkealle, että
voisivat toistamiseen hyökätä majaan, sillä silloin tällöin kuului villi
kiljaisu, jollaisia soturit päästelevät tukeakseen urheuttaan
taistelukentällä.
Mutta kaksi valkoista miestä lopulta kuitenkin ensinnä astui
majaan kantaen soihtuja ja pyssyjä. Tarzan ei hämmästynyt
huomatessaan, ettei kumpikaan heistä ollut Rokoff. Hän olisi voinut
panna sielunsa pantiksi, ettei mikään voima maan päällä olisi saanut
tuota suurta pelkuria uhmaamaan majan tuntemattomia vaaroja.

Kun alkuasukkaat näkivät, ettei valkoisia miehiä ahdistettu,


kokoontuivat hekin majaan ja katselivat kauhusta äänettöminä
toverinsa raadeltua ruumista. Valkoiset miehet koettivat turhaan
saada selitystä Tarzanilta; hän pudisti vain päätänsä heidän
kyselylleen, ja viekas hymy väikkyi hänen huulillaan.

Lopulta tuli Rokoff.

Hänen kasvonsa kävivät aivan valkoisiksi, kun hänen silmänsä


sattuivat veriseen hahmoon, joka irvisteli lattialta häntä vastaan,
kuolleilla kasvoilla kiduttavan kauhun leima.

"Tule!" sanoi hän päällikölle. "Ryhtykäämme työhömme ja


lopettakaamme tämä paholainen, ennenkuin hänen onnistuu tehdä
useammalle alamaisellesi sama temppu."

Päällikkö käski nostaa Tarzanin maasta ja viedä hänet paalun luo.


Mutta kului useita minuutteja, ennenkuin hän sai ketään miehistään
koskemaan vankiin.

Vihdoin kuitenkin neljä nuorempaa soturia raastoi Tarzanin raa'asti


ulos majasta, ja kun he kerran pääsivät hirveästä paikasta pois,
näytti kammon tunne häviävän heidän villistä sydämestään.
Parikymmentä ulvovaa neekeriä tuuppi ja sysi vankia pitkin kylätietä
sitoakseen hänet sitten paaluun pienten tulien ja kiehuvien
keittoastioiden piirin keskelle.
Kun hän vihdoin oli köytetty paaluun ja näytti olevan aivan avuton
ja ilman mitään pelastuksen toivoa, paisui Rokoffin rohkeus
tavalliseen määräänsä, koska ei ollut vaaraa uhkaamassa.

Hän astui aivan apinamiehen viereen ja ottaen keihään eräältä


villiltä pisti ensimmäisenä avutonta uhria. Pieni verivirta alkoi vuotaa
pitkin jättiläisen sileätä ihoa kyljessä olevasta haavasta, mutta hänen
huuliltaan ei kuulunut yhtäkään tuskan valitusta.

Halveksiva hymy hänen kasvoillaan näytti raivostuttavan


venäläistä. Päästäen kokonaisen tulvan kirosanoja hän syöksyi
avuttoman vangin kimppuun, iski häntä nyrkillään kasvoihin ja potki
häntä armottomasti sääriin.

Sitten hän kohotti raskaan keihäänsä syöstäkseen sen vankinsa


sydämeen.
Apinain Tarzan hymyili hänelle yhä halveksivasti.

Ennenkuin Rokoff ehti iskeä keihäällään, heittäytyi päällikkö hänen


kimppuunsa ja veti hänet pois uhrinsa luota.

"Seis, valkoinen mies!" huudahti hän. "Jos riistät meiltä tämän


vangin ja kuolemantanssimme, saat itse astua hänen sijaansa."

Uhkaus osoittautui erittäin tepsiväksi. Rokoff ei enää käynyt


vangin kimppuun, vaikka hän yhä seisoi likellä ja viskeli ivasanoja
viholliselleen. Hän sanoi Tarzanille aikovansa itse syödä apinamiehen
sydämen. Hän kuvaili seikkaperäisesti Tarzanin pojan tulevaa kolkkoa
elämää ja ilmoitti, että hänen kostonsa kohtaisi Jane Claytoniakin.

"Sinä luulet vaimosi olevan turvallisesti Englannissa", sanoi Rokoff.


"Typerä houkkio! Hän on juuri nyt sellaisen miehen käsissä, joka ei
ole kovin kunniakasta syntyperää, ja kaukana Lontoon
turvallisuudesta ja ystäviensä suojeluksesta. En aikonut sanoa tätä
sinulle, ennenkuin olisin voinut tuoda Viidakkosaarelle todisteen
hänen kohtalostaan. Nyt kun olet kärsimäisilläsi julmimman
kuoleman, mikä on tullut valkoisen miehen osaksi, olkoon tämä tieto
vaimosi kohtalosta lisänä niihin kidutuksiin, joita sinun on kärsittävä,
ennenkuin villien viimeinen keihäänisku vapauttaa sinut tuskistasi."

Tanssi oli nyt alkanut, ja ympärillä hyppivien soturien kiljaisut


hukuttivat meluunsa Rokoffin enemmät yritykset kiusata uhriansa.

Tarzanin mieleen muistui samanlainen näky: hän oli pelastanut


D'Arnotin sellaisesta tilasta viime hetkellä, ennenkuin lopullinen
keihäänpisto olisi lopettanut hänen kärsimyksensä. Kuka tulisi nyt
auttamaan häntä? Koko maailmassa ei kukaan kyennyt pelastamaan
häntä kidutukselta ja kuolemalta.

Ajatus, että nämä ihmispaholaiset söisivät hänet tanssin loputtua


suuhunsa, ei aiheuttanut hänessä ollenkaan kauhua tai inhoa. Se ei
lisännyt hänen kärsimyksiään kuten olisi ollut tavallisen valkoisen
miehen laita, sillä Tarzan oli koko elämänsä ajan nähnyt, että
viidakon asujamet söivät tappamansa saaliin lihaa.

Eikö hän itse ollut tapellut suuren apinan kauheannäköisestä


käsivarresta ammoin menneessä dum-dumjuhlassa, jolloin hän oli
voittanut rajun Tublatin ja päässyt osalliseksi Kerchakin apinain
kunnioituksesta?

Nyt tanssijat hyppelivät yhä lähempänä häntä. Keihäät alkoivat


suuntautua hänen ruumiiseensa vihlaisten kirveleviä naarmuja, jotka
olivat enteenä vakavammista pistoista.
Nyt ei tarvitsisi enää kestää kauan. Apinamies kaipasi viimeistä
villiä iskua, joka lopettaisi hänen kurjuutensa.

Ja silloin kohosi kaukaa salaperäisen viidakon sokkeloista kimeä


huuto.

Tanssijat pysähtyivät hetkeksi, ja näin syntyneen hiljaisuuden


aikana kaikui sidotun valkoisen miehen huulilta vastaukseksi huuto,
joka oli vielä pelottavampi ja kaameampi kuin viidakon asujamen
päästämä oli ollut.

Neekerit epäröivät monen minuutin ajan. Sitten he jatkoivat


Rokoffin ja päällikkönsä käskystä jälleen tanssiaan lopettaakseen sen
ja surmatakseen uhrinsa. Mutta ennenkuin yksikään keihäs kosketti
ruskeata nahkaa, vilahti keltaisenruskea, vihreäsilmäinen hahmo
vihaa ja rajuutta uhkuvana sen majan ovesta, jossa Tarzan oli ollut
vankina, ja Sheeta-pantteri seisoi muristen herransa vieressä.

Hetken ajan seisoivat mustat ja valkoiset säikyn lamauttamina.


Heidän silmänsä olivat kiintyneet metsän pedon paljaisiin
torahampaisiin.

Ainoastaan Apinain Tarzan näki, mitä muuta oli tulossa majan


pimennosta.
YHDEKSÄS LUKU

Ritarillisuuttako vai roistomaisuutta?

Jane Clayton oli hytinovestaan Kincaidilla nähnyt miestänsä


soudettavan Viidakkosaaren vihreäpeitteiselle rannalle, ja sitten laiva
oli jatkanut taas matkaansa.

Hän ei nähnyt useaan päivään muita kuin Sven Anderssonin,


Kincaidin vaiteliaan ja vastenmielisen kokin. Hän kysyi tältä sen
rannikon nimeä, jolle hänen miehensä oli viety.

"Mine luule, rupe tuulema, hyvin pian, hyvin kova", vastasi


ruotsalainen, ja siinä oli kaikki, mitä Jane sai hänestä irti.

Hän oli tullut siihen päätökseen, ettei kokki osannut hänen


kielellään muuta, ja näin ollen hän lakkasi utelemasta mieheltä
tietoja, mutta hän ei milloinkaan unohtanut tervehtiä miestä
herttaisesti tai kiittää häntä tuomastaan ellottavasta ruuasta.

Kolmen päivämatkan päässä siitä paikasta, johon Tarzan oli jätetty,


ankkuroi Kincaid suuren joen suulle, ja pian tuli Rokoff Jane
Claytonin hyttiin.
"Olemme tulleet perille, lemmikkini", sanoi hän inhoittavasti
hymyillen. "Olen tullut tarjoamaan teille turvaa, vapautta ja mukavaa
elämää. Sydämeni on heltynyt teitä kohtaan kärsimystenne takia ja
tahtoisin korvata kaikki parhaan kykyni mukaan. Miehenne oli
villieläin — te tiedätte sen paraiten, joka löysitte hänet alastomana
syntymäviidakostaan, kun hän kuljeskeli villinä toveriensa, rajujen
petojen kanssa. Minä olen herrasmies — en ole ainoastaan
jalosyntyinen, vaan olen myös saanut hienon kasvatuksen, kuten
sopii ylhäiselle miehelle. Teille, rakas Jane, minä tarjoan sivistyneen
miehen rakkauden ja sen ohessa sivistyneet ja hienostuneet
olosuhteet, joita varmaan olette kipeästi kaivannut ollessanne
tekemisissä tuon kurjan apinan kanssa, jonka kera menitte niin
ajattelemattomasti naimisiin tyttömäisessä ihastuksessanne.
Rakastan teitä, Jane. Sanokaa vain yksi sana, niin ei mitkään surut
enää rasita teitä — pienokaisennekin annetaan teille
vahingoittumattomana takaisin."

Sven Andersson oli pysähtynyt oven ulkopuolelle


päivällisaterioineen, jota hän oli tuomassa lady Greystokelle. Hänen
pieni päänsä oli pitkän, suonisen kaulan yllä toiselle sivulle
kurotettuna, likekkäiset silmät olivat puoleksi suljetut, hänen
korvansa näyttivät tosiaan vääntyneen eteenpäin — siinä määrin
hänen koko asentonsa ilmaisi hänen kuuntelevan salaa, — hänen
pitkät, keltaiset, harittavat viiksensäkin tuntuivat kiertyvän kavalaan
kaarteeseen.

Kun Rokoff lopetti puheensa ja odotti vastausta, muuttui


hämmästyksen ilme Jane Claytonin kasvoilla inhoksi. Häntä aivan
värisytti, kun hän näki roiston.
"En olisi hämmästynyt, herra Rokoff", sanoi hän, "jos olisitte
koettanut väkivalloin pakottaa minut alistumaan pahoihin haluihinne,
mutta en olisi milloinkaan voinut kuvitella teitä niin typeräksi, että
luulisitte minun, John Claytonin vaimon, tulevan teille
vapaaehtoisesti, vaikkapa henkenikin pelastamiseksi. Olen tietänyt
teidät lurjukseksi, herra Rokoff, mutta tähän mennessä en ole pitänyt
teitä houkkiona."

Rokoffin silmät supistuivat ja suuttumuksen puna karkoitti


kalpeuden hänen kasvoiltaan. Hän astui uhkaavasti askeleen nuorta
naista kohti.

"Saammepa nähdä, kuka lopulta on houkkio", sähisi hän, "kun


olen taivuttanut sinut tahtooni ja olet kehnon amerikkalaisen
itsepäisyytesi takia menettänyt kaikki, mitä pidät kalliina —
pienokaisesi hengenkin, — sillä pyhän Pietarin luiden nimessä minä
luovun kaikista entisistä suunnitelmistani kakaran suhteen ja raastan
siltä sydämen rinnasta aivan silmiesi edessä. Saat huomata, mitä
Nikolas Rokoffin herjaaminen merkitsee."

Jane Clayton kääntyi väsyneesti poispäin.

"Mitä hyödyttää", sanoi hän, "selitellä, kuinka syvälle


kostonhimoinen luonteenne voi vajota? Ette voi taivuttaa minua
uhkauksillanne ettekä teoillanne. Pienokaiseni ei voi harkita omasta
kohdastaan, mutta minä, hänen äitinsä, voin nähdä, että jos hänen
suotaisiin elää miehen ikään, nim hän uhraisi ilolla henkensä äitinsä
kunnian puolesta. Vaikka rakastankin häntä sanomattomasti, en
tahtoisi ostaa hänen elämäänsä sellaisesta hinnasta. Jos tekisin
siten, kiroisi hän muistoani kuolinpäiväänsä asti."
Rokoff oli nyt aivan suunniltaan, koska hänen ei onnistunut
saattaa nuorta naista kauhun valtaan. Hän tunsi vain vihaa Jane
Claytonia kohtaan, mutta hänen sairaloiseen mieleensä oli johtunut,
että jos hän voisi pakottaa Janen suostumaan vaatimuksiinsa
omansa ja lapsen elämän pelastamiseksi, täyttyisi hänen kostonsa
malja reunoja myöten, kun hän saattaisi Euroopan pääkaupungissa
kerskua siitä, että hänellä oli ollut loordi Greystoken puoliso
rakastajattarenaan.

Hän astui taas askeleen nuorta naista kohti. Hänen ilkeät kasvonsa
olivat vääristyneet raivosta ja kiihkosta. Hän hyppäsi villieläimen
tavoin nuoren naisen kimppuun, iski vahvat sormensa hänen
kurkkuunsa ja työnsi häntä taaksepäin makuusijaa kohti.

Samassa hetkessä hytin ovi avautui meluisasti. Rokoff hypähti


pystyyn ja näki kääntyessään ruotsalaisen kokin.

Miehen tavallisesti viekkaisiin silmiin oli tullut täydellisen


typeryyden ilme. Hänen alaleukansa lerpatti tylsästi, ollen
sopusoinnussa kasvojen muun sävyn kanssa. Hän järjesteli
toimeliaasti lady Greystoken ateriaa pienoiselle pöydälle hytin toisella
puolella.

Venäläinen tuijotti häneen raivoisana.

"Mitä tarkoitat, kun tulet tänne ilman lupaa?" huudahti hän. "Mene
ulos!"

Kokki käänsi vedensiniset silmänsä Rokoffiin päin ja hymyili


ilmeettömästi.
"Mine luule, rupe tuulema, hyvin pian, hyvin kova", sanoi hän ja
alkoi taas järjestellä harvalukuisia vatejaan pikku pöydälle.

"Ulos täältä tai heitän sinut menemään, kurja pölkkypää!" karjui


Rokoff astuen uhkaavasti askeleen ruotsalaista kohti.

Andersson hymyili hänelle yhä typerästi, mutta hänen ruskea


kouransa tarttui varovasti pitkän, kapean veitsen kahvaan, joka pisti
esiin tahraista esiliinaa kannattavan likaisen nuoran takaa.

Rokoff näki liikkeen ja pysähtyi äkkiä. Sitten hän kääntyi Jane


Claytonin puoleen.

"Annan teille huomiseen asti aikaa miettiä vastausta


kysymykseeni", sanoi hän. "Kaikki laivassaolijat lähetetään jollakin
tekosyyllä rannalle, teitä ja lasta, Paulvitshia ja minua
lukuunottamatta. Sitten voitte häiritsemättä nähdä, kuinka
pienokainen kuolee."

Hän puhui ranskaa, jotta kokki ei ymmärtäisi hänen sanojensa


synkkää sisältöä. Lopetettuaan puheensa hän meni meluisasti hytistä
luomatta enää katsettakaan mieheen, joka oli keskeyttänyt hänet
katalassa aikeessaan.

Hänen mentyään Sven Andersson kääntyi lady Greystokeen päin


— typerä ilme, joka oli salannut hänen ajatuksensa, oli kadonnut, ja
sensijaan kuvastui kasvoissa viekkautta ja kavaluutta.

"Hen luule mine oli hupsu", sanoi hän. "Hen oli itse hupsu. Mine
osa franska."

Jane Clayton katsoi häneen hämmästyneenä.


"Sitten ymmärsitte kaikki, mitä hän sanoi?"

Andersson irvisti.

"Juu, frouva", sanoi hän.

"Ja te kuulitte, mitä täällä tapahtui, ja tulitte suojelemaan minua?"

"Te oli hyve minulle", selitti ruotsalainen. "Hen kohtele minu kuin
paha koira. Mine auta teite, frouva. Teide pite odotta — mine auta
teite. Mine oli monta kerta teelle lensirannikko."

"Mutta kuinka voitte auttaa minua, Sven", kysyi Jane, "kun kaikki
nämä miehet ovat meitä vastaan?"

"Mine luule", sanoi Sven Andersson, "rupe tuulema, hyvin pian,


hyvin kova." Sitte hän kääntyi ja läksi hytistä.

Vaikka Jane epäili kokin kykyä auttaa häntä todenteolla, oli hän
tälle kuitenkin syvästi kiitollinen siitä, mitä hän jo oli tehnyt. Tunne,
että hänellä oli näiden vihollisten joukossa ystävä, toi hänelle
ensimmäisen lohdutuksen säteen ja huojensi raskaiden aavistusten
taakkaa, jotka olivat vaivanneet häntä Kincaidin pitkän matkan
aikana.

Hän ei nähnyt enää Rokoffia sinä päivänä eikä muitakaan


ennenkuin Sven tuli illallista tuomaan. Hän koetti saada kokkia
puhumaan auttamissuunnitelmistaan, mutta ei saanut häneltä muuta
tietoa kuin tavanmukaisen sääennustuksen. Kokki näkyi äkkiä
vaipuneen takaisin tavalliseen typeryyteensä.

Mutta lähtiessään hytistä vähän myöhemmin tyhjine astioineen


kuiskasi hän hyvin hiljaa: "Jetteke vaattet peelle ja kierteke filtti
koko. Mine tule hakema teite hyvin pian."

Hän olisi heti livahtanut huoneesta, mutta Jane pani kätensä


hänen käsivarrelleen.

"Pienokaiseni?" kysyi hän. "En voi lähteä ilman häntä."

"Te teke, mite mine sano", sanoi Andersson äreästi. "Jos mine
auta teite, te ei saa olla hupsu."

Hänen mentyään Jane Clayton vaipui makuusijalleen aivan


ymmällä. Mitä hänen piti tehdä? Hänen päänsä oli täynnä epäluuloja
ruotsalaisen aikeita kohtaan. Eikö hänen kävisi vielä paljon
pahemmin, jos hän antautuisi tuon miehen valtaan?

Ei, hän ei olisi paholaisenkaan seurassa pahemmassa asemassa


kuin Nikolas Rokoffin kanssa, sillä paholainen on ainakin kunnian
miehen maineessa.

Hän vannoi kymmenen kertaa, ettei lähtisi Kincaidilta ilman


pienokaistaan, ja kuitenkin hän oli täysissä pukimissa kauan
tavallisen maatamenoajan jälkeen ja hänen huopapeitteensä olivat
sievästi kokoonkäärityt ja paksulla nuoralla sidotut, kun hänen
oveltaan kuului varovaista raapimista.

Hän meni nopeasti huoneen poikki ja työnsi salvan syrjään. Ovi


avautui hiljaa, ja sisään astui ruotsalainen huolellisesti verhottuna.
Hänellä oli käsivarrellaan mytty, jossa näköjään oli hänen huopansa.
Hänen toinen kätensä oli nostettu käskevästi vaitiolon merkiksi;
likainen etusormi oli huulia vasten.

Hän tuli aivan likelle Janea.


"Ottaka teme", sanoi hän. "Te ei saa kirku, kun te neke sen. Se on
teide lapsi."

Nopeat kädet tempasivat mytyn kokilta ja innokkaat äidinkädet


puristivat nukkuvaa lasta rintaa vasten. Kuumat ilonkyyneleet
juoksivat pitkin Janen poskia, ja hänen koko ruumiinsa vapisi hetken
aiheuttamasta liikutuksesta.

"Tulka!" sanoi Andersson. "Meille ei on aika hukkaa."

Hän kaappasi Janen huopakäärön ja otti hytinoven ulkopuolelta


omansakin. Sitten hän vei Janen laivan sivulle ja tuki häntä hänen
astuessaan tikkaita alas ja kantoi lasta, kun Jane kapusi alhaalla
odottavaan veneeseen. Hetkeä myöhemmin hän oli katkaissut
köyden, joka piteli pientä venettä höyrylaivan kupeella, ja kumartuen
mitään puhumatta vaatteisiin kiedottujen airojen puoleen alkoi
soutaa mustia varjoja kohti Ugambi-jokea ylös.

Andersson souti ikäänkuin olisi ollut seudusta täysin selvillä, ja kun


kuu tuli puolen tunnin kulutta pilvistä esiin, näkyi heidän vasemmalla
puolellaan Ugambiin laskevan syrjäjoen suu. Tätä ahdasta väylää
kohti ruotsalainen käänsi pienen veneensä keulan.

Jane Clayton aprikoi, mahtoiko mies tietää, minne oli menossa.


Hän ei tiennyt, että Andersson oli kokin tehtävissä samana päivänä
kulkenut juuri tuota jokea ylös pieneen kylään, jossa hän oli
alkuasukkailta vaihtanut ruokatarpeita, ja että hän oli siellä
suunnitellut sen seikkailun yksityiskohdat, johon he nyt olivat
antautuneet.

Vaikka oli täysikuu, oli pikku joen pinta aivan musta. Jättiläispuut
kaartuivat likekkäin olevien rantojen yli, yhtyen suureksi holviksi joen
keskipalkalla. Kauniisti kaareutuvilta oksilta riippui tuuheata
sammalta, ja äärettömiä köynnöskasveja kiipeili rehevän
yltäkylläisesti maasta korkeimmille oksille saakka, laskeutuen
kiemurtelevina silmukkoina melkein veden tyyneen pintaan asti.

Silloin tällöin kookas krokotiili pani airojen loiskeen pelottamana


veden äkkiä väreilemään heidän edessään tai virtahepoperhe sukelsi
korskuen ja puuskuttaen hietasärkältä veden viileihin, turvallisiin
syvyyksiin.

Kummaltakin rannalta kuului tiheistä viidakoista petoeläinten


aaveenomaisia yöhuutoja — hyenan mieletöntä ulvontaa, pantterin
käheätä murinaa ja leijonan kauhistavaa karjuntaa. Ja niiden
joukossa kuului omituisia, hirvittäviä ääniä, — sitäkin pelottavampia,
koska nuori nainen ei voinut sanoa, mikä yöllisillä rosvoretkillään
kulkeva salaperäinen peto ne aiheutti.

Hän istui veneen perään kyyristyneenä painaen pienokaista


rintaansa vasten, ja kun hänellä oli tuo pieni, hento, avuton olento
sylissään, oli hän tänä yönä paljon onnellisempi kuin monina
suruisina päivinä.

Vaikka hän ei tiennyt, mitä kohtaloa vastaan hän oli kulkemassa


tai kuinka pian se kohtalo hänet yllättäisi, oli hän kuitenkin
onnellinen ja kiitollinen tästä hetkestä, vaikka kuinkakin lyhyestä,
jolloin sai sulkea pienokaisen syliinsä. Hän tuskin saattoi odottaa
päivän tuloa voidakseen taas katsella pienen mustasilmäisen
Jackinsa hymyileviä kasvoja.

Hän koetti yhä uudestaan ja uudestaan pinnistää silmiään viidakon


yön pimeydessä nähdäkseen edes vilaukselta nuo rakkaat piirteet,
mutta ei erottanut ponnistuksistaan huolimatta muuta kuin kasvojen
hämärät ääriviivat. Silloin hän taas puristi lämpimän pikku käärön
sykkivää sydäntään vasten.

Kello oli jo varmasti kolme aamuyöllä, kun Andersson käänsi


veneen kokan rantaa kohti erään aukeaman kohdalla, jossa näkyi
kuun vaalenevassa valossa joukko alkuasukasten majoja okaisen
aitauksen — boman — ympäröimänä.

Ruotsalainen sai huutaa monta kertaa, ennenkuin sai vastauksen


kylästä ja silloinkin vain sentakia että häntä oli odotettu; niin suuresti
pelkäävät alkuasukkaat yön pimeydestä tulevia ääniä. Hän auttoi
Jane Claytonin pienokaisineen maihin, sitoi veneen pensaaseen ja
ottaen huopapeitteet alkoi astella bomaa kohti.

Kylän portilla heidät päästi sisään muuan alkuasukasnainen, sen


päällikön vaimo, jonka Andersson oli palkannut avukseen. Hän vei
heidät päällikön majalle, mutta Andersson sanoi, että he nukkuisivat
ulkona taivasalla, ja silloin hän tehtävänsä toimittaneena jätti heidät
omiin hoteisiinsa.

Selitettyään yrmeällä tavallaan, että majat epäilemättä olivat


likaisia ja syöpäläisten vallassa, levitti ruotsalainen Janen huovat ja
maahan siitä jonkun matkan päähän omat huopansa ja kävi
nukkumaan.

Kului joku aika, ennenkuin nuori nainen sai mukavan asennon


kovalla maakamaralla, mutta lopulta hän vaipui uneen pelkästä
uupumuksesta, pienokainen käsivartensa suojassa.

Hänen herätessään oli jo täysi päivä.


Hänen ympärillään tungeskeli parikymmentä uteliasta
alkuasukasta — enimmäkseen miehiä, sillä luonnonkansojen
keskuudessa on tämä luonteenominaisuus kehittynyt miehisellä
sukupuolella suurimpaan määräänsä. Jane Clayton veti pienokaista
vaistomaisesti likemmäksi itseään, vaikka hän pian sai nähdä,
etteivät neekerit ollenkaan tarkoittaneet pahaa hänelle tai lapselle.

Vieläpä muuan heistä tarjosi hänelle kurpitsapullosta maitoa —


likaisesta, savuttuneesta kurpitsasta, jonka suulle oli muodostunut
kokonaisia kerrostumia vanhaa, hyytynyttä maitoa. Mutta antajan
ystävällisyys liikutti häntä syvästi, ja hänen kasvojaan valaisi hetkeksi
se miltei unohtunut säteilevä hymy, joka oli tehnyt hänen
kauneutensa kuuluisaksi sekä Baltimoressa että Lontoossa.

Hän otti kurpitsan ja nosti sen huulilleen ollakseen loukkaamatta


antajaa, vaikkakaan hän ei millään voinut estää kuvottavaa tunnetta,
joka valtasi hänet, kun pahalta haiseva esine tuli likelle hänen
sieraimiaan.

Andersson tuli hänen avukseen ja ottaen kurpitsan häneltä joi itse


osan maidosta ja palautti sitten astian alkuasukkaalle, antaen
hänelle samalla lahjaksi sinisiä helmiä.

Aurinko paistoi nyt kirkkaasti, ja vaikka pienokainen yhä nukkui,


saattoi Jane tuskin hillitä ääretöntä haluaan nähdä rakastetut kasvot
edes vilahdukselta. Alkuasukkaat olivat lähteneet pois päällikkönsä
käskystä, joka nyt seisoi vähän matkaa hänestä puhellen
Anderssonin kanssa.

Pohtiessaan itsekseen, oliko viisasta häiritä lapsen unta nostamalla


huopaa, joka nyt suojasi sen kasvoja auringolta, huomasi Jane, että
kokki keskusteli päällikön kanssa neekerien kielellä.
Mikä merkillinen mies kokki tosiaan oli! Vielä eilen oli Jane pitänyt
häntä tietämättömänä ja typeränä ja nyt hän oli neljänkolmatta
tunnin kuluessa saanut nähdä, ettei kokki puhunut ainoastaan
englantia, vaan myöskin ranskaa ja länsirannikon alkeellista
murretta. Jane oli pitänyt häntä viekkaana, julmana ja
epäluotettavana, ja nyt hän oli, mikäli Janella oli syytä uskoa,
osoittautunut joka suhteessa aivan toisenlaiseksi kuin päivää
aikaisemmin. Oli vaikea uskoa, että mies saattoi palvella häntä
puhtaasti ritarillisista vaikutteista. Kokin aikeitten ja suunnitelmien
pohjalla oli varmaan jotakin, mitä hän ei vielä ollut paljastanut. Jane
aprikoi tätä, ja kun hän katsoi kokkiin — hänen likekkäisiin, sinne
tänne vilkuviin silmiinsä, ja vastenmielisiin piirteisiinsä, niin häntä
värisytti, sillä hän oli varma, että niin kehnon pinnan alla ei voinut
olla yleviä luonteenominaisuuksia.

Kun hän ajatteli tätä eikä vielä tiennyt, ottaisiko huovan


pienokaisen kasvoilta, kuului hänen sylissään olevasta pikku kääröstä
hiljaista vikinää ja sitten loruilevaa jokellusta, joka täytti hänen
sydämensä ihastuksella.

Lapsi oli hereillä! Nyt hän voisi ihailla pienoistaan kylliksi.

Hän tempasi huovan nopeasti lapsen kasvoilta, Anderssonin


katsellessa silloin häntä. Kokki näki hänen nousevan horjuen pystyyn
ja pitävän pienokaista käsivarren matkan päässä itsestään, ja nuoren
naisen silmät olivat kauhistuneina kiintyneet pieniin pulleihin
kasvoihin ja räpytteleviin silmiin.

Sitten kokki kuuli hänen surkean huutonsa, kun hänen polvensa


pettivät ja hän vaipui pyörtyneenä maahan.
KYMMENES LUKU

Ruotsalainen

Kun tiheässä ryhmässä Tarzanin ja Sheetan ympärillä olevat soturit


huomasivat, että todellinen, lihaa ja verta oleva pantteri oli
keskeyttänyt heidän kuolemantanssinsa, rohkaistuivat he hieman,
sillä kaikkien noiden keihäiden keskellä oli mahtavan Sheetankin
kohtalo selvä.

Rokoff kiihoitti päällikköä antamaan käskyn, että keihäsmiehet


sinkoisivat aseensa, ja neekeri oli vähällä komentaa heidät tähän,
kun hänen silmänsä, seuraten apinamiehen katsetta, sattumalta
suuntautuivat Tarzanin toiselle puolelle.

Päällikkö kääntyi kauhusta kiljaisten ja pakeni kylän porttia kohti,


ja kun hänen alamaisensa katsoivat ympärilleen nähdäkseen hänen
pakonsa syyn, pötkivät hekin tiehensä — heitä vastaan näet
harppoivat Akutin kauheat apinat, joiden valtavat ruhot näyttivät
vieläkin suuremmilta kuunvalossa ja leiritulen hohteessa.

Samassa kun alkuasukkaat lähtivät pakoon, kaikui apinamiehen


villi huuto neekerien kiljunnan yli, ja siihen vastaten syöksyivät
Sheeta ja apinat karjuen pakolaisten jälkeen. Jotkut soturit
kääntyivät taistelemaan raivostuneiden vastustajiensa kanssa, mutta
rajujen petojen hillitön hurjuus toi heille verisen kuoleman.

Toiset surmattiin paetessaan, ja vasta sitten kun kylä oli tyhjä ja


viimeinen neekeri kadonnut pensaikkoon, saattoi Tarzan kutsua villin
joukkionsa takaisin luokseen. Silloin hän huomasi mielipahakseen,
ettei hän saanut yhtäkään heistä, ei edes verrattain älykästä Akutia
ymmärtämään, että hän halusi vapautua kahleista, jotka sitoivat
hänet paaluun.

Jonkun ajan kuluttua mahtuisi tietysti tämä ajatus heidänkin


paksuihin kalloihinsa, mutta sillä välin voisi tapahtua paljon —
neekerit voisivat palata suurin voimin valtaamaan takaisin kylänsä;
valkoiset miehet voisivat pyssyillään helposti ampua läheisistä puista
heidät kaikki; vieläpä hän voisi kuolla nälkään, ennenkuin
hidasälyiset apinat huomaisivat, että hän tahtoi heitä kalvamaan
siteet poikki.

Sheeta taasen käsitti tätä vielä vähemmän kuin apinat, mutta


kuitenkaan ei Tarzan voinut olla ihmettelemättä tuon pedon
osoittamia erikoisia ominaisuuksia, Ei voinut epäillä, että se osoitti
todellista kiintymystä häneen, sillä nyt, kun neekerit oli karkoitettu,
käveli se hitaasti edestakaisin paalun luona hieroen kylkiään
apinamiehen jalkoihin ja hyrräten kuin tyytyväinen kissa. Myöskään
ei Tarzan voinut epäillä, että se oli omasta aloitteestaan lähtenyt
hakemaan toisia hänen avukseen. Hänen Sheetansa oli tosiaan
villipetojen helmi.

Mugambin poissaolo huolestutti apinamiestä koko joukon. Hän


koetti saada Akutilta tietoa, kuinka neekerin oli käynyt, peläten että
pedot Tarzanin silmälläpidosta vapautuneina olivat käyneet miehen

You might also like