Contents at a Glance
PART ICore Ideas and Elements of PL/SQL Performance Tuning
1 The Role of PL/SQL in Contemporary Development . . . . . . . . . . . . . . . . . . . . . 3
2 DBA/Developer Borderline: Tools and Features . . . . . . . . . . . . . . . . . . . . . . . . 17
3 Code Instrumentation in PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
PART IILinking SQL and PL/SQL
4 Expanding the SQL Horizons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5 Thinking in Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6 Pulling the Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
PART IIITuner’s Toolkit
7 Going Beyond Scalar Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
8 Keeping the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
9 Shooting at a Moving Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0
vii
00-FM.indd 7 24/06/14 2:49 PM
Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0 Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0
viii Oracle PL/SQL Performance Tuning Tips & Techniques
PART IVPL/SQL in Daily Life
10 Tales from the Trenches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
11 Code Management in Real-World Systems . . . . . . . . . . . . . . . . . . . . . . . 251
12 Extra Tips, Tricks, and Ideas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
00-FM.indd 8 24/06/14 2:49 PM
Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0 Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0
Contents
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvAcknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xixIntroduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
PART ICore Ideas and Elements of PL/SQL Performance Tuning
1 The Role of PL/SQL in Contemporary Development . . . . . . . . . . . . . . . . . . 3Typical Web Application Process Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Web Application Performance Problem Areas . . . . . . . . . . . . . . . . . . . . . . . 5
Step 1: Client Machine Performance Problems . . . . . . . . . . . . . . . . . 5Step 2: Client Machine to Application
Server Transmission Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Step 3: Application Server Performance Problems . . . . . . . . . . . . . . . 6Step 4: Application Server to Database Transmission Problems . . . . . 6Step 5: Database Performance Problems . . . . . . . . . . . . . . . . . . . . . . 7Step 6: Database to Application
Server Transmission Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Step 7: Application Server Processing Performance Problems . . . . . . 8Step 8: Application Server to Client
Machine Transmission Problems . . . . . . . . . . . . . . . . . . . . . . . . . . 8Step 9: Client Machine Performance Problems . . . . . . . . . . . . . . . . . 8
Finding the Cause of Slowly Performing Web Applications . . . . . . . . . . . . . . 8Using Timers to Gather Data About Performance . . . . . . . . . . . . . . . . 9Measuring Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Solving Web Application Performance Problems . . . . . . . . . . . . . . . . . . . . . 13Solving Client Machine Performance Problems (Steps 1 and 9) . . . . . 13Resolving Performance Issues Between the Client Machine
and Application Server (Step 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . 13Solving Performance Problems in
the Application Server (Steps 3 and 7) . . . . . . . . . . . . . . . . . . . . . . 13
ix
00-FM.indd 9 24/06/14 2:49 PM
Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0 Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0
x Oracle PL/SQL Performance Tuning Tips & Techniques
Solving Performance Problems in the Client Machine (Step 9) . . . . . . 13Lessons Learned . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2 DBA/Developer Borderline: Tools and Features . . . . . . . . . . . . . . . . . . . . . . 17Data Dictionary Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Oracle Logging and Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Logging Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Tracing Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Logging/Tracing Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
PL/SQL Hierarchical Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27RUNSTATS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32PL/SQL Environment Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
PLSQL_OPTIMIZE_LEVEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34PLSQL_CODE_TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36PLSQL_WARNINGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38PLSQL_CCFLAGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
PL/Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3 Code Instrumentation in PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47Is the Problem Really in the Database? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Application Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Built-in Code Navigation APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50User-Driven Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Code Instrumentation Best Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58Placing Process Markers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Placing Error Markers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
PART IILinking SQL and PL/SQL
4 Expanding the SQL Horizons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Stepping Outside the SQL Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Making Life Simpler by Switching to PL/SQL . . . . . . . . . . . . . . . . . . . 69Using PL/SQL to Fill Functionality Gaps . . . . . . . . . . . . . . . . . . . . . . 73
Calling Functions Within SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Single-Table Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Multi-Table Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
PL/SQL-Related Statistics and Their Impact on Execution Plans . . . . . . . . . . 83Hardware Costs of PL/SQL Functions . . . . . . . . . . . . . . . . . . . . . . . . 84Cardinality of PL/SQL Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Selectivity of PL/SQL Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
00-FM.indd 10 24/06/14 2:49 PM
Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0 Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0
Contents xi
Oracle Database 12c–Only Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97PRAGMA UDF Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98Adding Functions Inside the WITH Clause . . . . . . . . . . . . . . . . . . . . 99
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5 Thinking in Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104Loading Sets from SQL to PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Oracle Database 12c: Implicit Pagination vs. Continuous Fetch . . . . 112Merging Sets Using PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
“…And Justice FORALL!” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119Staying Up to Date with Syntax: Sparse Collections . . . . . . . . . . . . . . 121Direct Inserts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124FORALL and Table Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
6 Pulling the Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131DML Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Data Protection: Constraints vs. Triggers . . . . . . . . . . . . . . . . . . . . . . 133Default Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Cost of Denormalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
INSTEAD OF Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Basic DML Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Dangers of Logical Primary Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146Handling UPDATE Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
PART IIITuner’s Toolkit
7 Going Beyond Scalar Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155Managing LOBs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Access to LOBs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157Storage Mechanisms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158I/O Tuning Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161SecureFile-Only Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Managing XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172Storing XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173Manipulating XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8 Keeping the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185Built-in Caching Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Deterministic Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186Scalar Subquery Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191PL/SQL Function Result Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
00-FM.indd 11 24/06/14 2:49 PM
Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0 Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0
xii Oracle PL/SQL Performance Tuning Tips & Techniques
Manual Caching Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203PL/SQL Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203Oracle Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
9 Shooting at a Moving Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209Expanding the Knowledge Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
CLOB Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211Cursor Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212PL/SQL Function Result Cache Integration . . . . . . . . . . . . . . . . . . . . . 213Support for Complex Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Digging Deeper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218More About Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218IN-LIST Trap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Challenging Dynamic SQL Myths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223Myth #1: Dynamic SQL Is Always a Security Risk . . . . . . . . . . . . . . . 224Myth #2: Dynamic SQL Is Always Slower Than Regular SQL . . . . . . . 225Myth #3: Dynamic SQL Always Causes Parsing . . . . . . . . . . . . . . . . . 226Myth #4: DDL Statements Are Only for DBAs . . . . . . . . . . . . . . . . . . 228
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
PART IVPL/SQL in Daily Life
10 Tales from the Trenches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233Third-Party Wrapped Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234Stateless Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237Unknown UNDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240The Curse of Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Recursion and Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Recursion and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
11 Code Management in Real-World Systems . . . . . . . . . . . . . . . . . . . . . . . . . 251The Problem of Code Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Versioning “Lite” for DBAs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253Homegrown Versioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Edition-Based Redefinition and Performance Tuning . . . . . . . . . . . . . . . . . . . 260Understanding Edition-Based Redefinition . . . . . . . . . . . . . . . . . . . . 261Important Changes to EBR Introduced in Oracle Database 12c . . . . . 262
System Environment Differences and Performance-Related Code Management . . . . . . . . . . . . . . . . . . . . . . . . . 266
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
00-FM.indd 12 24/06/14 2:49 PM
Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0 Oracle-Regular / Oracle PL/SQL Performance Tuning Tips & Techniques / Rosenblum / 482-0
Contents xiii
12 Extra Tips, Tricks, and Ideas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271Back to Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
VARCHAR2 Memory Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272The Cost of Current Date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274BINARY Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Text Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277Checking Text Strings for Valid Characters . . . . . . . . . . . . . . . . . . . . . 278Similarity of Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280VARCHAR2 and Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Increasing Processing Complexity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284NOCACHE Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284ACCESSIBLE BY Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286More About Pipelined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
00-FM.indd 13 24/06/14 2:49 PM