Book Reviews and DMCA – No Longer Curious, Order Cancelled

26 08 2010

August 26, 2010

In June 2010 an article appeared on another blog that identifed three blog articles appearing on a blog operated by an Oracle Certified Master (OCM) that were copied nearly verbatim from three other blogs, thus saving the OCM a considerable effort in not only typing verbage appearing in the article, but also effort in actually building useful content.  Why spent four hours developing a blog article (this is probably the average time I spend), when a simple copy, paste, find-and-replace can be accomplished in a couple of minutes?  Those copies of articles clearly violated commonly understood copyright restrictions, and a quick search showed that the copyright violations extended far beyond the initial three articles which were mentioned (yes, I have screen captures and PDF copies of all that I identified).

So, why did I write the above paragraph?  For some reason I was recently browsing through some of the information about DMCA:

“Any material that was posted without the copyright owner’s authorization must be removed or blocked promptly once the service provider has been notified that it has been removed, blocked, or ordered to be removed or blocked, at the originating site.”

I realized that a random reader of this blog could potentially send a note to WordPress stating that they are, in fact under penalty of law, the owner of the material I just spent 2 hours, 4 hours, 8 hours, 16 hours  – maybe even months writing, and demand that the article be taken offline because I clearly stated that I quoted a couple of words from one of their articles while agreeing with or disagreeing with the other article.  Is quoting another source, while clearly stating that the other source is being quoted, in an effort to critique the quoted section an example of fair use?

“Section 107 contains a list of the various purposes for which the reproduction of a particular work may be considered fair, such as criticism, comment, news reporting, teaching, scholarship, and research. Section 107 also sets out four factors to be considered in determining whether or not a particular use is fair:

  • The purpose and character of the use, including whether such use is of commercial nature or is for nonprofit educational purposes
  • The nature of the copyrighted work
  • The amount and substantiality of the portion used in relation to the copyrighted work as a whole
  • The effect of the use upon the potential market for, or value of, the copyrighted work”

Interesting… as some of you may have noticed, the Oracle Database book reviews that I wrote in the last two years attempt to be very thorough,  precise, and specific –  many times down to a page number and a quoted sentence or two.  In my view such quotes clearly fall under the embrella of fair use (specifically criticism, comment, teaching, and research).

On June 10, 2010 I posted a blog article where I mentioned having three Oracle Database books on order that I intended to review just as I had with many of the other Oracle Database books that I purchased in the past.  Two of the books that I ordered, “Oracle Performance Firefighting (fourth printing)” and “Expert Oracle Database Architecture: Oracle Database Programming 9i, 10g, and 11g Techniques and Solutions, Second Edition” arrived and were reviewed, while the book that was supposed to ship on June 1, 2010 currently shows the following status on

Let’s take a look at that order:

So, in summary Amazon reports that the book has yet to be released, and if it ships in September it will arrive three months later than originally expected.  On August 17, 2010 I received two unsolicited emails from someone at that book publishing company asking me to submit any errata that I find in the second edition of the book so that the problems may be addressed by an OCM who is also an Oracle Ace, after I write up the book review – the person also mentioned that, by the way, the book keeps selling out.  Nice, except that I now have a slight problem.  My reviews typically take between one and two hours to write and when agreeing with or disagreeing with a section of a book I try very hard not to lose the precise message of that section of the book – that often means that it is necessary to directly quote a sentence or two of the book that is being reviewed.  In theory, simply quoting a section of a copyrighted work might be grounds for a DCMA pull down of the content, thus rendering an hour or two of writing lost for a period of time.  Would the author of this book that is now three months delayed try a DCMA pull down if the review is not completely favorable?  I don’t know that answer.

In late May or early June I wrote the following about why I ordered the book that has yet to ship:

I was curious, so I spent good money on the book.  For most of the Oracle books that I have read in the last two years I have posted detailed reviews of the books on Amazon.  The reviews list what I thought was good about the book, what I thought was great about the book, errors/errata found in the book’s chapters, as well as misc. points about the book as it is read.  Some of my reviews identified a dozen or more errors in a book, which is a significant problem with some of the Oracle books on the market.  The errors must make it difficult for beginners to learn about Oracle Database.

How long will the review of the “Oracle Tuning: The Definitive Reference Second Edition” book stretch?  I am not sure, but it appears that I could write about a 4 page review on the first 27 pages of the first edition of this book – I sincerely hope that some/most of those issues were addressed in the second edition.  I want to make certain that I obtain a good value from the $44 that I spent on the book.  I do not think that it too much to ask for accuracy from a published book, especially when the book cost more than $40.  Some of the pages in the chapters that I co-authored in the “Expert Oracle Practices” required more than 8 hours of research, typing, verification, testing, proofing, re-testing, and formatting per page. I believe that Raldolf spent roughly the same amount of time on the pages that he wrote for the chapters.  I suspect that many of the very good books that are on the market for Oracle also required about the same amount of time per page.  Certainly, it can’t be too much to ask that other book authors put effort into testing and verification of what they publish? The author’s website states about the the “Oracle Tuning: The Definitive Reference Second Edition” book: [edit: feel free to read the book’s description on the publisher’s website].  So, I will be looking for the portions of the book’s contents that are comprehensive and targeted at the senior Oracle DBA.

After waiting three months, I am no longer curious about the book – so I just cancelled the order.  Was I serious that I could write a four page review on the first 27 pages of the first edition of the book?  I heard someone shout “show me your cards.”  In late May and early June I read the first 27 pages of the first edition using the Google books site, and I made notes as I read.  These are my notes, quoting a minimal amount of the book to fall under the embrella of “criticism, comment” of fair use:

  • Page 9 (now page 11) states “For example, if the AWR shows that the demands on the shared pool become very high between 1:00 pm and 2:00 pm, the DBA might trigger a dynamic decrease of db_cache_size and a corresponding increase of the shared_pool_size parameter during this time period.”  If Oracle’s buffer cache is using the memory specified by the DB_CACHE_SIZE, the size value specified for DB_CACHE_SIZE cannot be decreased without first manually flushing the buffer cache – flushing the buffer cache to allow the shared pool to grow for an hour is a bad idea.  It is important to keep in mind that when the SGA_TARGET parameter is specified, the values for DB_CACHE_SIZE and SHARED_POOL_SIZE specify the minimum values for the parameters.
  • Page 10 is an advertisement for the WISE package – free copy is apparently available with the book.
  • Page 11, when describing examples of poor schema design, suggests that databases using extensive data normalization to minimize data redundancy is a poor design because it forces Oracle to perform unnecessary table joins.
  • Page 11 (now page 12) states, “If poorly designed PL/SQL is encountered, users might be able to tune the database by using array processing such as bulk collect, forall and ref cursors…”  As of Oracle Database 10g, Oracle automatically array fetches 100 rows at a time in cursor FOR loops, making it much less likely/necessary that a ‘user’ will re-write the PL/SQL to take advantage of bulk collect’s performance slightly better performance.
  • By page 13 has recommended the use of AWR, various AWR tables, and the SQL Tuning Advisor without mentioning that the Diagnostic Pack must be licensed for access to AWR information, and the Diagnostic and Tuning Pack must be licensed for access to the SQL Tuning Advisor.
  • Page 14 (now page 25) states “The first tasks when tuning a database when tuning a database are to identify the external bottleneck conditions, which may include: CPU Bottleneck,… RAM Bottleneck,…  Network Bottleneck, … and Disk Bottleneck.”  While it is important to check these items, I suggest that these probably would not be the first items to check when tuning the database instance’s performance.  Yes, checking whether or not the CPUs are overloaded (or heavily loaded) is important, but maybe it would be better to determine if the overload is causing a measurable negative impact on performance by first checking the delta values of the various wait events, system statistics, and system time model statistics before deciding to check, for instance, whether there are network bottlenecks.
  • Page 14 (now page 25) states “Whenever the run queue exceeds the number of CPUs on the Oracle server in the absence of high idle times, the system is said to be CPU-bound.”  The first question with this statement is what qualifies as a “high idle time”?  Secondly, a server may become CPU bound long before the CPU run queue exceeds the number of CPUs in the server, and long before 90% CPU utilization is reached.  The author mentions that CPU consumption can be reduced by tuning SQL and reducing library cache contention – that is true, but much more could be said about the topic.  For example, would it make a difference if the database is used for OLTP rather than data warehouse activities?  The remedies listed on page 15 are just to add additional CPUs to the server or disabling a “high CPU consumer” such as parallel query.  No warning provided to indicate that adding CPUs to the server could be expensive from an Oracle licensing perspective and a system uptime perspective.
  • Page 15 (now page 25) states that “Large amounts of Oracle*Net traffic contribute to slow SQL performance.”  The book does not describe what is considered “large amounts”, nor what to do about addressing the network bottleneck.
  • Page 15 (now page 25) under the heading of disk bottlenecks the only issue identified is “using RAID5 for high update systems.”  The adjective “high” is never clarified.
  • Page 15 (now page 25) states, while discussing potential solutions for over-allocation of the server’s RAM, that the options for “excessive wrapping id to add more RAM, reduce the size of Oracle’s SGAs, or turn-on Oracle’s multi-threaded server.”  Are these the only options, or could more suggestions be recommended?  For example, “size of Oracle’s SGAs” implies that more than one instance is running on the server – would it make sense to reduce the number of instances on the server?  Are there any reasons not to implement a shared server configuration (what the author refers to as “multi-threaded server”?  What about tuning the SQL?
  • Page 15 (now page 26), the author appears to misuse the term “network latency”, or at least stretch the meaning of latency as it applies to a network.
  • Page 16 includes an advertisement for WISE.
  • Page 16 (now page 27) states “In a disk-bound database, the majority of the wait time is spent accessing data blocks.”  It is quite possible in a non-disk-bound, well performing database instance that the majority of wait time could very well be spent reading data blocks.  In fact, these events should be among the top 5 wait events, otherwise there probably is a significant performance problem.  It is also quite possible that the system could be disk-bound when the majority of wait time is spent _writing_ to the redo logs, archiving redo logs, and updating data/undo/temp files.
  • Page 16 (now page 27), the Top 5 Timed Events, demonstrating a disk constrained database, shows 44 waits for the CPU.  Waits for the CPU cannot be reported in the Top 5 Timed Events – this data in the report is bogus.  The report also shows that the average single block read time is 2.75 seconds, while the average multi-block read time is 0.127 seconds (127ms) – this data in the report is also likely bogus.  The report also shows that 1,363 seconds were lost in 673 waits (average of 2.03 seconds) to the “library cache load lock” wait – if that wait appeared in the top 5 report, even in a report showing the single block read time is 2.75 seconds, I think it would be a good idea to start with the “library cache load lock” wait since that is one of the waits that indicates a severe problem if it appears in the top 5 wait events.
  • Page 17 (now page 28) states “CPU enqueues can be observed when the CPU run queue exceeds the number of CPUs on the database server, and this can be seen by…”  The effects of CPU enqueues may be observed long before the CPU run queue exceeds the number of CPUs in the server, whether it be longer average waits for the log file sync wait event, increased waits for latches, increased wait time for single block or multi-block reads, or any number of statistics in the system time model (V$SYS_TIME_MODEL, V$SESS_TIME_MODEL).
  • Page 17 (now page 28) states “High CPU usage will be reported as a top 5 timed even (sic) in any AWR report as shown below”  First, the Top 5 Timed Events report shows that there were 4,851 waits for CPU time – a Top 5 report cannot show the number of waits for the CPU – this data in the report is bogus.  Second, the CPU is a limited “wait” resource with an upper utilization limit equal to the number of CPUs in the server multiplied by the elapsed number of seconds, while the other foreground wait events, for the most part, have an upper limit of the average number of sessions (plus parallel related additional processes) connected to the instance multiplied by the elapsed number of seconds.  It is quite possible that a server experiencing excessive CPU usage may not cause the “CPU time” to appear in the top 5 timed events.  Third, we do not know how many CPUs are in the server – would it make a difference if there was only a single CPU compared to 96 CPUs?  Fourth, we have not concept of the elapsed time represented by the report – what if the elapsed time for the report is eight hours?  Fifth, if the single block read time averages more than a second, shouldn’t the investigation start with the IO system?  Sixth, the most that can be determined from the top 5 timed events is the average utilization, number of waits, and number of timeouts – why are the number of timeouts not shown?  From the top 5 timed events it is difficult, if not impossible, to determine if there wasn’t a brief period of intensive activity, followed by a long period of almost no activity – or if the average activity levels were fairly constant in the time period.
  • Page 18 (now page 28), the Top 5 Wait Events (why the switch from Top 5 Timed Events) is labeled as a mockup – probably a good idea that this is labeled because the report shows 94,754 seconds where the server was waiting to send data across the network while single block and multi-block reads totaled only 85.75 seconds.  That is why you do not use a satellite link for the network backbone.
  • Page 19, several grammar errors to this point in the book “It not elegant, or even correct, but it’s a common choice by managers who need quick, low-risk performance improvements…  Individual Program Global Areas (PGA’s for each session) are a set of running programs that do work for the instance and are referred to as processes.”
  • Page 20 (now page 30), describes db_cache_size as “the number of data buffers to allocate for the instance.”  The parameter does not specify the number of data buffers (blocks?), it specifies the amount of memory to allocate to the buffer cache (or the minimum amount in the event the SGA_TARGET is specified).
  • Page 21, the DB_FILE_MULTIBLOCK_READ_COUNT parameter is listed among the parameters that cannot be changed without bouncing the instance – that is not correct.
  • Page 21 (now page 30), states “parallel_automatic_tuning:… since parallel full-table scans are very fast, the CBO will give a higher cost to index access and be friendlier to full-table scans.”  This is simply incorrect.  The optimizer does not increase the cost of index access when costing parallel access paths that use full table scans – it lowers the cost of the full table scan relative to the parallel degree.  Second, parallel full table scans are not automatically very fast, especially if the IO subsystem is bottlenecked.
  • Page 21 (now page 30), the description of the OPTIMIZER_INDEX_COST_ADJ parameter is very weak, “this parameter controls the relative costs of full-table scans versus index scans.”  It would be much better to state that the parameter specifies the percentage of the index access cost to be retained.  Setting the value to a very low value could cause the optimizer to select not only an index access path rather than a full table scan, but to select the wrong index due to cost rounding problems as the value of the OPTIMIZER_INDEX_COST_ADJ parameter approaches 1.  Ideally, since at least Oracle Database 10.1 this parameter should be left at the default value of 100 due to the Oracle optimizer’s use of system statistics by default.
  • Page 21 (now page 30), the description of the OPTIMIZER_INDEX_CACHING parameter is vague – the book doesn’t indicate when the value of the parameter is used in cost calculations, and when it is not used.
  • Page 22 (now page 34) states “In Oracle 10g, statistics collections are automated, but users may still need to selectively add histograms and other specialized optimizer statistics.”  The book does not state what triggers the statistics collection for a specific object, at what time the statistics are collected, that histograms (maybe excessively) are automatically generated, nor the potential problems that might be encountered after the statistics collection.
  • Page 23 (now page 35) states “SQL will run fastest when the first table joins deliver the smallest result set.”  This is stated as an absolute, which absolutely will not be correct all of the time.
  • Page 23 states “the new Oracle10g SQL profile utility will allow changes to execution plans without adding hints.”  This is untrue – a SQL profile is a series of hints that are automatically generated.
  • Page 25 shows operating with OPTIMIZER_MODE set to CHOOSE and deleting a table’s statistics to immediately return the system to acceptable performance.  No warning that this caused the optimizer to switch to the RULE based optimizer, and no demonstration of how statistics should be collected.
  • Page 25 “there was a serious degradation in SQL performance immediately after the implementation of partitioned _tablespaces_ in a 16-CPU Solaris 64-bit Oracle 9i database.”
  • Page 26 shows a grammar error “Note that is the full-table scans are parallelized with 15 parallel query processes to speed up the statistics collection”
  • Page 26 – amazing performance improvements “tripled the performance” “400 percent performance improvement” – no real suggestion of how the silver bullet corrected a problem to cause such a significant increase in performance, so that readers can experience similar performance improvements in their database instances.
  • Page 26 – assumes a data warehouse was set up without a PGA_AGGREGATE_TARGET parameter value and an unspecified value for SORT_AREA_SIZE, resulting in a SORT_AREA_SIZE that was the default value, and only a 50% overall improvement was experienced by setting the parameter to 1MB.  The book did not state that the default value of SORT_AREA_SIZE, when not specified, and PGA_AGGREGATE_TARGET is not used, that the SORT_AREA_SIZE defaults to 64KB.  The book also did not describe how the 1MB value was determined to be the best value, nor what impact changing the parameter’s value has on memory availability in the server.
  • Page 27 – code section shows single quotes around what is apparently a bind variable defined as VARCHAR2.  The single quotes should not appear around that bind variable.  Author states that a concatenated index on the CUSTOMER_STATUS and CUSTOMER_AGE columns resulted in a 50 fold performance improvement and 6 fold reduction in disk IO.  The book does not state how or why, so I wonder how that could happen when the CUSTOMER_STATUS column likely has few unique values and an inequality is used on the CUSTOMER_AGE column.  Was a bitmap or B*tree index used, was the CUSTOMER_STATUS or CUSTOMER_AGE specified as the leading column in the index?
  • Page 27 “While it was not clear why the CBO was not choosing the index, the query with the index hint ran almost 20x faster.  After acting fast and running a script against v$bh and user_indexes, the DBA discovered that approximately 65 percent of the indexes were currently inside the buffer cache.”  There are a couple of problems with this statement.  The statement is not clear whether the DBA found that at least one block from roughly 65% of the indexes found in USER_INDEXES was in the buffer cache, or if the DBA found that roughly 65% of all blocks belonging to the indexes found in USER_INDEXES were in the buffer cache.  The second problem is why did the DBA check USER_INDEXES and not DBA_INDEXES – if the DBA checked USER_INDEXES, he would only see the indexes that belong to the user account that the DBA used to connect to the database (unless he used ALTER SESSION SET CURRENT_SCHEMA to change to another schema).  The third problem is that there may be multiple, possibly many consistent read versions of an individual block in the buffer cache – how did the DBA factor out the multiple copies of blocks when he performed his calculations?  The fourth problem is that the DBA did not consult a 10053 trace for a hard parse of the SQL statement to understand why the expected index was not selected.
  • Page 28 “Based on similar systems, the next step was to lower optimizer_index_cost_adj to a value of 20 in the hopes of forcing the CBO to lower the relative costs of index access.”  At the same time the OPTIMIZER_INDEX_CACHING parameter was set to 65.  What are the problems with this approach?  According to the Oracle documentation, the “OPTIMIZER_INDEX_CACHING parameter lets you adjust the behavior of cost-based optimization to favor nested loops joins and IN-list iterators.  The cost of executing an index using an IN-list iterator or of executing a nested loops join when an index is used to access the inner table depends on the caching of that index in the buffer cache. The amount of caching depends on factors that the optimizer cannot predict, such as the load on the system and the block access patterns of different users.  You can modify the optimizer’s assumptions about index caching for nested loops joins and IN-list iterators by setting this parameter to a value between 0 and 100 to indicate the percentage of the index blocks the optimizer should assume are in the cache. Setting this parameter to a higher value makes nested loops joins and IN-list iterators look less expensive to the optimizer.”  The parameter change is global, and does not apply to all index type accesses, it primarily makes nested loop joins appear to be more favorable than hash joins.  What criteria determined that 20 was the best value for OPTIMIZER_INDEX_COST_ADJ, and why didn’t the DBA correct or even check the system statistics, rather than experimenting with a parameter that should rarely be changed from its default value since the introduction of system statistics in Oracle 9i.
  • Page 28 shows “alter system set optimizer_index_cost_adj=20 scope = pfile;”  Issuing that command will result in an “ORA-00922: missing or invalid option” error.  The pfile cannot be altered using an ALTER SYSTEM command, except of course if the spfile is modified, and then the spfile is written over the top of the existing pfile (init.ora file).
  • Page 28 indicates that the Statspack report shown was from Oracle 9i, yet the report indicates that the wait time is in centiseconds, while an Oracle 9i Statspack report indicates time in seconds.  It is a bit alarming to see 4,796.54 seconds of wait on enqueue (46.71% of total implies total wait time of 10,268.76 seconds), while the 10,579,442 multi-block reads required 1,972.05 seconds (report shows that this is 29.20% of the total, but a calculator shows that it is 19.20%).  Something is wrong with this Top 5 Wait Events report – it is showing that the average multi-block read completed in 0.0001864 seconds, while the average single block read time required 0.002714 seconds.
  • Page 29 – the silver bullet tip to change the CURSOR_SHARING parameter to FORCE did not warn of any of the possible side-effects, which may include poor performance when cursors that should not be shared because of uneven data distributions generate execution plans that are inappropriate for other literal values, or bugs related to CURSOR_SHARING that either result in wrong data being returned, or instance stability problems.  It would be interesting to see how the 75% performance improvement was achieved by changing this parameter.

I guess that if the above mentioned problems are still present in the second edition of the book, it might have taken me significantly longer than the typical one to two hours to write the book review on the remaining 1000+ pages.  Best of luck for anyone ordering the second edition of the book.



12 responses

27 08 2010
Charles Hooper

Where is the Way Back machine when you need it?

The author of the third book, the one that never arrived after three months, left a comment on August 24, 2010 on my review of the book “Oracle Performance Firefighting (fourth printing)” – I saw this comment today, roughly 18 hours after posting this blog article. I have a screen capture of his comments, and provided a lengthy reply to those comments. Do you think comments like this should go unnoticed, or be ignored?
“Slamming a competitor’s book without mentioning that you compete is unethical, by any standard …”
“The simple fact that Charles Hooper does not mention that he is a competing author makes one wonder if this review is a cheap shot ‘smear job’ against an agile competitor?”

I do believe that comments like the above meet the qualifications for something, if only I knew the word… li… something. I do believe that I was just called unethical.

Feel free to read the review and attached comments here:

28 08 2010
Charles Hooper

Because Mr. B… felt the need to publicly question my ethics to the point that is borderline of libel, I have decided to reproduce his comments regarding my review on below. I have a strong feeling that his comments are in fact strongly related to this blog article, as he could then use the comments from as a circular reference (had I not replied to his comments) in response to a review that I intended to post about his book that is mentioned above. In his comments you may notice that he was careful not to state that he was a book author, nor significantly involved in a book publishing company.

Initial post: Aug. 24, 2010 7:25 AM PDT
Last edited by the author on Aug. 24, 2010 7:46 AM PDT
D. B… says:
“Please note that this reviewer does not mention that he is the author of a competing Oracle book ‘Expert Oracle Practices: Oracle Database Administration from the Oak Table’.

Slamming a competitor’s book without mentioning that you compete is unethical, by any standard . . .

His questionable ‘errors’ also make me wonder whether this review should be considered credible, or if this competing author has an unsavory ulterior motive.

For example, he notes as an ‘error’: ‘The book makes a claim that is difficult to verify’.

Evidently, this reviewer thinks the author’s act of describing his real-world experiences are a problem unless he can reproduce them! Really?

The simple fact that Charles Hooper does not mention that he is a competing author makes one wonder if this review is a cheap shot ‘smear job’ against an agile competitor?”

(Note that I edited the comment to shorten all employee/company names:
Your post, in reply to an earlier post on Aug. 27, 2010 4:53 PM PDT
Charles Hooper says:
Hello Mr. B…,

Sorry for the delay in seeing your comment and replying, regarding my review of the “Oracle Performance Firefighting” book. I wish that I saw your comment before cancelling my three month old Amazon order for your “Oracle Tuning: The Definitive Reference, Second Edition” book – I cancelled the order last night. J.S. from R.T., the publishing company for which your wife is President and you are listed as the Series Editor, offered to me on August 17, 2010 a review copy of your book – however both copies of her email ended up in my spam folder, and were thus ignored (I will not seek a review copy).

Your comments regarding my review are a fantastic attempt, but lack sufficient accuracy. For full disclosure, you and I have had several entertaining discussions on Oracle’s OTN forums. Why do I state that your comments lack sufficient accuracy?
* I was not “the author” of the “Expert Oracle Practices: Oracle Database Administration from the Oak Table” book, as you stated. I am one of the sixteen co-authors of that book. I had the opportunity to co-write for that book with a gentleman from Germany a chapter titled “Understanding Performance Optimization Methods” and a second chapter titled “Choosing a Performance Optimization Method”.
* The “Expert Oracle Practices: Oracle Database Administration from the Oak Table” book covers many topics including security considerations, implementing Oracle Database on Windows and Amazon’s cloud, battling against guesses, getting along with developers, avoiding common and uncommon SQL coding mistakes, and of course a couple of chapters related to Oracle Database performance. The fact of the matter is that the “Expert Oracle Practices” book is no more of a competitor of the “Oracle Performance Firefighting” book than it is of just about any book on the topic of Oracle Database’s SQL language. In fact, since there is so little overlap between the topics of the two books, the books should be considered complimentary of each other. Likewise, the “Expert Oracle Practices” book is no more of a competitor of your “Oracle Tuning: The Definitive Reference, Second Edition” book than it is of the Firefighting book. One would think that by the title of your book, it just might be a direct competitor of the Firefighting book.
* Specifically, which errors that I mentioned do you find to be “questionable”? Was it the repeated misspelling of “V$SESS_TIME_MODEL” throughout the book, the incorrect definition of the “db file scattered read wait” wait event, the correlation of the “log file sync” wait event to a user “Save” operation, or something else? Please Mr. B…, be specific. Detailed explorations of some of the problems mentioned in my review are described on my blog, and linked to the review on my blog. (I believe that you and I had a discussion on the OTN forums regarding the term “unsavory” – are you sure that is the word you would like to use?)
* You have managed to quote a portion of my review out of context – I believe that we had a discussion about quoting out of context on the OTN forums. “The book makes a claim that is difficult to verify” is part of a larger description of a specific problem found in the book regarding the use of temporary tables potentially reducing redo generation by 50% and potentially solving log file parallel write wait event problems. This portion of my review falls under a heading of “Specific errors, omissions, and distractions in order” and does not identify this specific item as an “error”, as you stated. The conclusion that you attempted to draw from this out of context quote seems to be a bit misleading.

I find your suggestion that my review is unethical to be very disturbing. Why? First, your facts are incorrect. Second, you have attempted to turn what was a highly technical review into what appears to be a personal attack (haven’t we had a discussion about turning technical discussions into personal attacks on the OTN forums?). Third, I have read a couple of the reviews that you previously posted on Amazon, for instance:
* “Oracle Shell Scripting: Linux and UNIX Programming for Oracle”
* “Easy Oracle PHP: Create Dynamic Web Pages with Oracle Data”
* “High Performance SQL Server DBA: Tuning & Optimization Secrets”
* “Easy HTML-DB Oracle Application Express: Create Dynamic Web Pages with OAE”
* “Oracle Job Scheduling: Creating Robust Task Management with dbms_job and Oracle 10g dbms_scheduler”
* “Easy Oracle SQL: Get Started Fast Writing SQL Reports with SQL*Plus”
* “Oracle Dataguard: Standby Database Failover Handbook”
* “Oracle Streams: High Speed Replication and Data Sharing”
* “Conducting the Webmaster Job Interview: IT Manager Guide with Javascript, Java Applets, Front Page, Flash, Perl, PHP+, and DreamWeaver Interview Questions”
* “Conducting the Web Designer Job Interview: IT Manager Guide with Web Design Interview Questions”
* “Easy Oracle Automation: Oracle10g Automatic Storage, Memory and Diagnostic Features”
* “Oracle Wait Event Tuning: High Performance with Wait Event Interface Analysis”
* “Oracle Disk I/O Tuning: Disk I/O Performance & Optimization for Oracle Databases”
* “Oracle 10g Grid & Real Application Clusters: Oracle 10g Grid Computing with RAC”
* “Oracle SQL Tuning & CBO Internals”
* “Conducting the UNIX Job Interview: IT Manager Guide with UNIX Interview Questions”
* “Conducting the Network Administrator Job Interview: IT Manager Guide with Cisco CCNA Interview Questions”
* “Conducting the Java Job Interview: IT Manager Guide for Java with Interview Questions”
* “Oracle Database 10g New Features: Oracle10g Reference for Advanced Tuning & Administration”
* “Oracle Utilities: Using Hidden Programs, Import/Export, SQL*Loader, Oradebug, Dbverify, Tkprof and More”
* “Oracle Performance Troubleshooting: With Dictionary Internals SQL & Tuning Scripts”

While not the entire list of books you supplied reviews for, every one of the above books is published by R.T., a company for which your wife is president, you are series editor, and either you are your wife are significant stakeholders. In some of the reviews you identified yourself as the series editor, while in other cases you did not. Mr. B…, exactly where is the bar for ethical behavior. Is it unethical to find a number of “specific errors, omissions, and distractions” in a book that shares very little in common with a book that was co-authored, or is it unethical to post more than twenty reviews for which you have a monetary interest? Are you sure you want to turn a technical review into a personal attack?

My review of the “Oracle Performance Firefighting” book was written with the same standards and expectations in mind as was the case for the other twelve Oracle Database related book reviews that I posted to Amazon. Feel free to add a comment to one of my other book reviews and I would be happy to continue this discussion.

This is the review that caused Mr. B… to suggest was a “cheap shot ‘smear job’ against an agile competitor”:

The term “soap opera” comes to mind, especially when you consider a blog article with a similar name (DMCA) on Jonathan Lewis’ blog. I have yet to figure out why so much contention (and drama) exists when conveying facts about a piece of software.

30 08 2010

Hi Charles,

I’ve read your review of Mr B’s book on Amazon. Personally, I think you have given that book a bit too much credit ( 3 stars? You are too generous!), and probably wasted too much time reviewing that sort of crap.

He will forever be the I-have-100-years-of-experience-and-I-don’t-have-to-prove-what-I-say guy, and there will be tons of people buying into his marketing trick, and there’s nothing you ( or anybody) can do about it.


30 08 2010
Charles Hooper

Hi Andy,

The Amazon book review was actually for a book written by Craig Shallahamer. There were a number items from that book which qualified as “Specific errors, omissions, and distractions” – that author might be able to address those issues in the fifth printing of the book. Those corrections should improve the three star rating. I am not sure why Mr. B. decided to comment on that review other than as a way of setting precedent so that when I posted an equally thorough review of his book he would be able to create a circular reference – “Charles Hooper, wide-spread misconduct”.

As you might be able to tell from the notes that I posted about the first 29 pages of Mr. B.’s book, the number of items that would have fallen under the heading of “Specific errors, omissions, and distractions” would have been significantly greater than was the case for Mr. Shallahamer’s book, if those problems remained in the second edition of the book, and there were roughly the same number of “Specific errors, omissions, and distractions” per page for the rest of the book [edit: the font size difference allowed Mr. Shallahamer’s book to have twice as much content per page as Mr. B.’s book].

Waste of my time was one of the reasons why I cancelled the order. Mr. B’s DMCA antics were another reason. The order being 3 months late was another reason. And, the list might go on for a couple more items.

30 08 2010

Sadly, Mr. B is a god among newbies ( his books have really catchy titles, admittedly). The first thing I did when I took charge of my department’s training was threw away all Rampant books :D, and recently , made those engineers use the ‘safe search’ engine.

I think you are ranked #2 on Mr B’s hit list. Jonathan Lewis has got to be Mr B’s #1 true love :p

30 08 2010
Charles Hooper

Andy, that is an interesting observation regarding a list, but I certainly hope that no such list exists.

Personally, I just want to know the correct (best for the situation) answer to a problem, why that answer is correct, and what conditions need to exist for the answer to not be correct. In order to reach that point I need to understand the steps involved in deciding what is the correct (best for the situation) answer. If someone just tells me “this is what you do, because I have done it 1,000 times over the last 25 years”, I am left wondering if nothing has changed in the last 25 years. If somone just tells me “this is what you do because I wrote it in three books”, I am left wondering if the author ever consulted any other sources, or if the author bothered to verify that the results are due to the proposed changes, or if the results are related to something entirely unrelated to what was changed. If someone just tells me “this is what you do because an OCM told me to do this”, I am left wondering if that person did not read the opening paragraph of this blog article. I don’t want someone to just tell me that something is right, I want (demand?) that person to show me how the person arrived at that answer. Jonathan Lewis is extremely skilled at showing the steps toward the “correct” answer, and also quite willing to show what might cause the “correct” answer to become the wrong answer. I am still trying to work toward that ability – it is not always easy to anticipate everything that could go wrong to cause the “best” solution to become the “worst” solution.

The search on the site is great for quickly locating information.

14 02 2011

Hi Andy,

I guess you missed Tom Kyte from this top-hit-list

1 09 2010
joel garry

The “complimentary” homonym error is humorous in this context, if indeed it is an error.

1 09 2010
Charles Hooper


That was not a typing mistake – I looked the word up before submitting the comment. 🙂

Actually, after typing the word I thought that it appeared to be a bit odd, so I performed a Google search:

I thought to myself, “Well that’s odd – hasn’t Google ever heard of two separate angles of attack (that are nice to each other and) add up to become something that is exactly the right angle of attack?” Take a look at the last couple of definitions offered by Google:
“•Serving to complement or complete. Supplying mutual needs or offsetting mutual lacks”
“•Complementary medicine refers to alternative treatments that are used alongside (‘complementary to’) conventional medicine, especially as palliative care”

That’s almost what was intended. There was an old saying from grade school related to spelling: “i before e except after c,” therefore, I had no choice but to spell the word “complementary” as “complimentary”. Everything written here is true, except apparently about the “i before e” story. 🙂

By the way, nice catch.

9 09 2010
marcia wilbur

This isn’t Charlie Hooper from CT is it? I know, it may be a common name. If so, Charlie? Is it you? Could this world be this small? If this is you, let me send you a copy of my new book – A Decade of the DMCA.

(the Unix web guru from Three Rivers)

10 09 2010
Charles Hooper


As much as I would like to visit Connecticut (and several other states), I have not had that opportunity yet. Sorry, I am an unrelated Charles Hooper.

22 09 2010
Charles Hooper

Someone mentioned to me that the new version of the book that I had on order, but cancelled, is now on the Google books site. The old version of the book is found here:

The new version is found here:

How many errors that I pointed out above are still in the new version of the book? Do the included report outputs still show the number of waits on the CPU (compare page 17 in the old version of the book with page 28 in the new version)” I, as well as a couple other people, brought that problem to the author’s attention roughly a year ago.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: