Writing a book devoted to performance troubleshooting for complex and multipurpose software such as Oracle is a daunting task; Antognini succeeds superbly with this book, through balancing theory (Oracle internals) and praxis (tuning hints, diagnosis process, and monitoring tips). In spite of the breath of subjects covered, there is a consistent three-step approach, depicted in the first chapter and rolled out subsequently, until the last chapter: Where is time spent? How is time spent? How can time spent be reduced?
The first question begins to be addressed in chapter 2, after covering basic concepts such as selectivity, cardinality, and parsing. The author then delves into performance monitoring tools provided by Oracle third parties and open source.
Chapters 4 through 7 are devoted to the Oracle Query Optimizer, fully exploring query optimizer capabilities and constraints, and covering an in-depth analysis of database statistics, optimization parameters (very useful, since this topic is not thoroughly covered in Oracle standard manuals), access path execution plans, and SQL tuning techniques. As a matter of fact, these chapters represent the key value of this book: the balance between deep descriptions of Oracle internal mechanisms and pragmatic hints and tips for Oracle performance tuning to be applied by the practitioner.
Chapter 8 begins Part 4 of the book. Through an analysis of parsing anomalies and parsing challenges of major standard Oracle interfaces, such as Oracle Call Interface (OCI), Java Database Connectivity (JDBC), and the Oracle Data Provider for .NET (ODP-NET), this chapter addresses how time spent can be reduced. Later, in chapter 9, the author explores optimization techniques based on different kinds of data partitioning provided by Oracle: range, single, range iterator, range empty, range join filter, and so on. Again, the partitioning techniques are covered with a level of detail and breadth that is rarely seen in other Oracle books. This is a key subject, particularly useful for tuning very large databases (VLDBs) in Oracle, such as mission-critical massive online transaction processing (OLTP) systems or large data warehouses. The final three chapters are devoted to join optimization, view materialization, and a brief exploration of physical design tips. The latter subject is not fully addressed in the book, but this is consistent with the fact that the root cause of most Oracle performance anomalies encountered in day-to-day operations is the application data access; this is where the book brilliantly explores the universe of data access performance troubleshooting.