<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-518481768015386858</id><updated>2012-01-21T14:01:00.352-05:00</updated><category term='anonymous posts'/><category term='Chris Date'/><category term='avocation'/><category term='listagg'/><category term='books'/><category term='right stuff'/><category term='MacBook Pro'/><category term='NoCOUG interview'/><category term='Oracle optimizer statistics'/><category term='CJ Date'/><category term='dynamic where clause'/><category term='NOWORKLOAD statistics'/><category term='sql tuning'/><category term='code formatting'/><category term='Duarte'/><category term='BITMAP AND'/><category term='typo'/><category term='WTF'/><category term='Oracle analytic functions'/><category term='bad SQL'/><category term='cnn'/><category term='rowsource execution statistics'/><category term='Oracle 11R2'/><category term='SyntaxHighligher'/><category term='cursor: pin S wait on X'/><category term='expensify'/><category term='vocation'/><category term='SQL WITH'/><category term='advice'/><category term='statistics_level'/><category term='oracle performance problem'/><category term='Hotsos Symposium'/><category term='mistakes'/><category term='audience'/><category term='customer service'/><category term='Grand Poobah'/><category term='Presentations'/><category term='Tagged'/><category term='manners'/><category term='bug free code'/><category term='Learning'/><category term='Oracle vs Fisher Price'/><category term='Word of the day'/><category term='persistence'/><category term='MOOW'/><category term='Amazon Kindle'/><category term='fun'/><category term='Teachers day'/><category term='Wordle'/><category term='holographic conferencing'/><category term='Charles Schultz'/><category term='Oracle 11.2.0.2'/><category term='technology'/><category term='Index fast full scan'/><category term='Oracle 11'/><category term='tkprof'/><category term='Denmark'/><category term='AND-EQUAL'/><category term='Thanksgiving'/><category term='cool code'/><category term='pivot'/><category term='Method R'/><category term='INDEX FULL SCAN (MIN/MAX)'/><category term='Oracle'/><category term='dynamic sql'/><category term='OOW2009'/><category term='survey'/><category term='Oracle optimizer'/><category term='trillion dollars'/><category term='Motto'/><category term='STAT lines'/><category term='scripts'/><category term='Oracle ACE'/><category term='bad code'/><category term='making your case'/><category term='over 40'/><category term='Parallelism'/><category term='unsubscribe'/><category term='Oracle BITMAP AND'/><category term='Kipling'/><category term='root canal'/><category term='games'/><category term='PowerPoint'/><category term='SQL*Plus'/><category term='odd notes'/><category term='database independence'/><category term='PX Deq: Parse Reply'/><category term='slide:ology'/><category term='Presentation Zen'/><category term='wisdom'/><category term='Groundhog Day'/><category term='Oracle parallel query'/><category term='index use'/><category term='indexed'/><category term='Tanel Poder'/><category term='SlideRocket'/><category term='health'/><category term='optimizer statistics'/><category term='brand'/><title type='text'>Karen Morton</title><subtitle type='html'>Meanderings of one who is lucky enough to have her avocation be her vocation.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default?start-index=101&amp;max-results=100'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>113</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2415008703569693279</id><published>2012-01-21T13:57:00.001-05:00</published><updated>2012-01-21T14:01:00.361-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hotsos Symposium'/><title type='text'>Hotsos Symposium</title><content type='html'>My favorite conference of the year is just around the corner. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YaNuId98kkw/TxsKN9G2KMI/AAAAAAAAAPw/8Cm_fgKjaR4/s1600/sym_logo_2012.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="114" width="203" src="http://3.bp.blogspot.com/-YaNuId98kkw/TxsKN9G2KMI/AAAAAAAAAPw/8Cm_fgKjaR4/s400/sym_logo_2012.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The Hotsos Symposium will be held March 4-8 and will be celebrating its tenth anniversary. I'll be &lt;a href="http://www.hotsos.com/sym12/sym_speakers_morton.html" target="new"&gt;speaking&lt;/a&gt; again this year and, as always, am eagerly looking forward to the week. Every year the speakers, topics and opportunities for networking continue to excel and I'm sure this year will be no different. This year's Training Day event will be conducted by Jonathan Lewis so make sure to stay the extra day to take advantage of spending a day with him as he discusses "&lt;a href="http://www.hotsos.com/sym12/sym_training.html" target="new"&gt;Designing Optimal SQL&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;If you haven't &lt;a href="http://www.hotsos.com/sym12/sym_reg.html" target="new"&gt;signed up&lt;/a&gt; yet, there's still time. I'll look forward to seeing you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2415008703569693279?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2415008703569693279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2415008703569693279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2415008703569693279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2415008703569693279'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2012/01/hotsos-symposium.html' title='Hotsos Symposium'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-YaNuId98kkw/TxsKN9G2KMI/AAAAAAAAAPw/8Cm_fgKjaR4/s72-c/sym_logo_2012.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4010865771110219089</id><published>2011-07-13T18:56:00.003-04:00</published><updated>2011-07-13T19:00:14.974-04:00</updated><title type='text'>Bug update</title><content type='html'>We received notice of a patch to correct the bug I discussed with gathering stats on tables with virtual columns/function-based indexes in parallel in my &lt;a href="http://karenmorton.blogspot.com/2011/06/bug-alert.html"&gt;previous post&lt;/a&gt;. The patch is number 10013177 and can be found at &lt;a href="https://updates.oracle.com/download/10013177.html"&gt;https://updates.oracle.com/download/10013177.html&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;After applying the patch, all stats collections worked without error. Whew!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4010865771110219089?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4010865771110219089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4010865771110219089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4010865771110219089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4010865771110219089'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2011/07/bug-update.html' title='Bug update'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5725981618696395192</id><published>2011-06-30T10:19:00.004-04:00</published><updated>2011-06-30T13:12:21.222-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle 11.2.0.2'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle optimizer statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallelism'/><title type='text'>Bug alert!</title><content type='html'>While testing Oracle 11.2.0.2 (on Red Hat Enterprise Linux), I recently bumped up against a problem with stats collections using DEGREE &gt; 1 that results in an ORA-600.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;20:56:41 SQL&gt; BEGIN DBMS_STATS.GATHER_TABLE_STATS('TR_OWNER','TR_POL', Estimate_Percent=&gt;dbms_stats.AUTO_SAMPLE_SIZE, method_opt=&gt;'FOR ALL INDEXED COLUMNS SIZE AUTO',cascade=&gt;FALSE, Degree=&gt;dbms_stats.AUTO_DEGREE); END;&lt;br /&gt;20:56:41   2  /&lt;br /&gt;BEGIN DBMS_STATS.GATHER_TABLE_STATS('TR_OWNER','TR_POL', Estimate_Percent=&gt;dbms_stats.AUTO_SAMPLE_SIZE, method_opt=&gt;'FOR ALL INDEXED COLUMNS SIZE AUTO',cascade=&gt;FALSE, Degree=&gt;dbms_stats.AUTO_DEGREE); END;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-20011: Approximate NDV failed: ORA-12801: error signaled in parallel query&lt;br /&gt;server P024, instance db100.srv.com:TRXTPLT2 (2)&lt;br /&gt;ORA-00039: error during periodic action&lt;br /&gt;ORA-00600: internal error code, arguments: [17114], [0x2AE3C33489B8], [], [],&lt;br /&gt;[], [], [], [], [], [], [], []&lt;br /&gt;ORA-06512: at "SYS.DBMS_STATS", line 23112&lt;br /&gt;ORA-06512: at "SYS.DBMS_STATS", line 23205&lt;br /&gt;ORA-06512: at line 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If I execute with an estimate_percent of anything other than auto_sample_size, the ORA-20011 goes away, but the ORA-600 remains. Interestingly enough, if I execute with Degree=&gt;1, everything is fine. &lt;br /&gt;&lt;br /&gt;After doing more research and finding that I could execute a stats collection on other objects without any problems, I narrowed down the problem to the existence of certain types of function-based indexes. In particular, if the table has an index that uses either a DECODE or a CASE expression or a user-defined function, the problem occurs. As long as the table doesn't have one of these, everything works fine.&lt;br /&gt;&lt;br /&gt;The contact to Oracle Support in regard to this issue replied as follows:&lt;br /&gt;&lt;br /&gt;It possible you're getting the problem described in Bug:11774077 which is closed as a duplicate of Bug:10013177. For more information please read Note:10013177.8. Functional index causes max decode group by sql to truncate values / can cause dump.&lt;br /&gt;Please check if one of the workarounds will solve your problem:&lt;br /&gt;- Set _replace_virtual_columns=false&lt;br /&gt;OR&lt;br /&gt;- Set _disable_function_based_index=true&lt;br /&gt;OR&lt;br /&gt;- Gathering table stats using degree 1.&lt;br /&gt;&lt;br /&gt;Ouch! Turning off the use of virtual columns and function-based indexes is *not* an option. We rely quite heavily on them in our application. And, for the tables that have this problem, gathering stats without doing it in parallel (degree 1) is doable, but not desirable as we have a limited window of time to collect stats and have relied on being able to collect in parallel to reduce the total time it takes to complete the collections.&lt;br /&gt;&lt;br /&gt;We're still researching other options or workarounds and pushing on Oracle Support for a fix for this problem, but are not making much progress on either front at this point.&lt;br /&gt;&lt;br /&gt;I'll update again soon with more information as I have it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5725981618696395192?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5725981618696395192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5725981618696395192' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5725981618696395192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5725981618696395192'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2011/06/bug-alert.html' title='Bug alert!'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2829429800151362280</id><published>2011-01-26T19:27:00.004-05:00</published><updated>2011-01-26T20:19:32.435-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hotsos Symposium'/><title type='text'>Hotsos Symposium 2011</title><content type='html'>The &lt;a href="http://www.hotsos.com/sym11.html"&gt;2011 Hotsos Symposium&lt;/a&gt; begins in just a little over a month (March 6) and I can't wait! I've been fortunate to have attended every Symposium except one (last year) since these events began. When I was asked to conduct the &lt;a href="http://www.hotsos.com/sym11/sym_training.html"&gt;Training Day&lt;/a&gt; following this year's main Symposium (the Training Day is on March 10) I was honored to accept and thrilled that I would be back in attendance this year. &lt;br /&gt;&lt;br /&gt;I believe the Symposium is unique in many ways. It is the one and only conference that I know of focused specifically on Oracle performance. Over the span of just a few days, attendees are privileged to hear the best speakers from all over the globe. This year's event is overflowing once again with a stellar line-up of presenters on topics such as "Database I/O Performance" (Alex Gorbachev), "Contemporary Latch Internals" (Andrey Nikolaev), and "Five Things Every Programmer (and DBA) Should Know about Oracle" (Andrew Zitelli). Cary Millsap will be delivering his award-winning presentation "Thinking Clearly about Performance" and Kerry Osborne will be delivering the Keynote address as well as presenting on "Tuning Exadata". The week will end up with Tom Kyte's birds-eye view of the week's sessions as he provides his representation of those topics in the insightful and engaging way only Tom can. &lt;br /&gt;&lt;br /&gt;I have the privilege of following this great line-up of speakers by presenting the Training Day. My topic (albeit a very wordy title) is "Managing SQL Performance - Practical Information and Tools for Writing and Maintaining Optimally Performing SQL". I'm looking forward to sharing many of the things I do every day that help me to take poorly performing SQL and making it hum! Don't you just love it when you can get a win like reducing a query's response time from nearly an hour down to a few seconds?! I know I do. The thing is, it isn't magic. Admittedly, it's fun to have people shake their heads in wonderment when I'm able to accomplish such "miracles", but I'll share my secrets for how I go about doing it. Well, OK...they're not really secrets. What I do is simply the application of a systematic, repeatable approach that anyone can learn and utilize. Like anything, the more you practice, the better (and faster) you get at the process. &lt;br /&gt;&lt;br /&gt;I think one of the most fun things about becoming more and more proficient at optimizing SQL is that you appear to have abilities that seem almost magical. I thought I'd share this video where Penn &amp; Teller demonstrate how what seems like magic can be uncovered and shown to be just well-timed execution of known and practiced actions.&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" class="youtube-player" type="text/html" width="480" height="390" src="http://www.youtube.com/embed/2H81A3bU68k?rel=0" frameborder="0" allowFullScreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;I hope the Training Day will allow me to show you what lurks under the covers and make the magic seem practical for you! See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2829429800151362280?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2829429800151362280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2829429800151362280' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2829429800151362280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2829429800151362280'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2011/01/hotsos-symposium-2011.html' title='Hotsos Symposium 2011'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/2H81A3bU68k/default.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6863786008728595797</id><published>2010-10-25T09:43:00.003-04:00</published><updated>2010-10-25T10:25:34.104-04:00</updated><title type='text'>Left outer join equivalence - Oracle vs ANSI syntax</title><content type='html'>I was reminded last week while visiting on customer site that it's easy to confuse the syntax you should use if you switch between Oracle's syntax and ANSI syntax for outer joins.  Here's an example using the good old standby SCOTT schema to show what I mean. First, I'll show the data from both tables we'll use (emp and dept) so the rest of the examples will be easier to follow.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SCOTT@ORA11R2&gt; select * from emp ;&lt;br /&gt;&lt;br /&gt;     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO&lt;br /&gt;---------- ---------- --------- ---------- --------- ---------- ---------- ----------&lt;br /&gt;      7369 SMITH      CLERK           7902 17-DEC-80        800                    20&lt;br /&gt;      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30&lt;br /&gt;      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30&lt;br /&gt;      7566 JONES      MANAGER         7839 02-APR-81       2975                    20&lt;br /&gt;      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30&lt;br /&gt;      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30&lt;br /&gt;      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10&lt;br /&gt;      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20&lt;br /&gt;      7839 KING       PRESIDENT            17-NOV-81       5000&lt;br /&gt;      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30&lt;br /&gt;      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20&lt;br /&gt;      7900 JAMES      CLERK           7698 03-DEC-81        950                    30&lt;br /&gt;      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20&lt;br /&gt;      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10&lt;br /&gt;&lt;br /&gt;14 rows selected.&lt;br /&gt;&lt;br /&gt;SCOTT@ORA11R2&gt; select * from dept ;&lt;br /&gt;&lt;br /&gt;    DEPTNO DNAME          LOC&lt;br /&gt;---------- -------------- -------------&lt;br /&gt;        10 ACCOUNTING     NEW YORK&lt;br /&gt;        20 RESEARCH       DALLAS&lt;br /&gt;        30 SALES          CHICAGO&lt;br /&gt;        40 OPERATIONS     BOSTON&lt;br /&gt;&lt;br /&gt;4 rows selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, let's join the tables to produce a result set that includes all rows from emp but limits the dept table info to only be included if the deptno = 20.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SCOTT@ORA11R2&gt; select e.empno, e.ename, d.deptno, d.dname&lt;br /&gt;  2  from emp e, dept d&lt;br /&gt;  3  where e.deptno = d.deptno(+) and d.deptno(+) = 20;&lt;br /&gt;&lt;br /&gt;     EMPNO ENAME          DEPTNO DNAME&lt;br /&gt;---------- ---------- ---------- --------------&lt;br /&gt;      7902 FORD               20 RESEARCH&lt;br /&gt;      7876 ADAMS              20 RESEARCH&lt;br /&gt;      7788 SCOTT              20 RESEARCH&lt;br /&gt;      7566 JONES              20 RESEARCH&lt;br /&gt;      7369 SMITH              20 RESEARCH&lt;br /&gt;      7839 KING&lt;br /&gt;      7934 MILLER&lt;br /&gt;      7782 CLARK&lt;br /&gt;      7900 JAMES&lt;br /&gt;      7844 TURNER&lt;br /&gt;      7698 BLAKE&lt;br /&gt;      7654 MARTIN&lt;br /&gt;      7521 WARD&lt;br /&gt;      7499 ALLEN&lt;br /&gt;&lt;br /&gt;14 rows selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that we get back the entire set of 14 rows from emp, but only 5 rows have the deptno and dname column values populated.  This is because the filter on deptno(+) = 20 is written so that it is applied before the join between emp and dept occurs.  Therefore, only rows with deptno = 20 will be joined to their matching emp rows. The remaining rows for employees who are in the other departments will be returned due to the outer join as no rows from dept will be available to match to.&lt;br /&gt;&lt;br /&gt;If we wrote the join without including the (+) on the filter, we'd have gotten back only rows for deptno 20 employees as follows:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SCOTT@ORA11R2&gt; select e.empno, e.ename, d.deptno, d.dname&lt;br /&gt;  2  from emp e, dept d&lt;br /&gt;  3  where e.deptno = d.deptno(+) and d.deptno = 20;&lt;br /&gt;&lt;br /&gt;     EMPNO ENAME          DEPTNO DNAME&lt;br /&gt;---------- ---------- ---------- --------------&lt;br /&gt;      7369 SMITH              20 RESEARCH&lt;br /&gt;      7566 JONES              20 RESEARCH&lt;br /&gt;      7788 SCOTT              20 RESEARCH&lt;br /&gt;      7876 ADAMS              20 RESEARCH&lt;br /&gt;      7902 FORD               20 RESEARCH&lt;br /&gt;&lt;br /&gt;5 rows selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However, if we want to return rows only for deptno 20, then we shouldn't use an outer join at all.  If the filter is applied after the join, then the rows for other departments will have null values in the deptno and dname columns (as shown earlier) and therefore will not match the filter condition and be eliminated from the result set. You can see that the result is the same if you remove the outer join operator.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SCOTT@ORA11R2&gt; select e.empno, e.ename, d.deptno, d.dname&lt;br /&gt;  2  from emp e, dept d&lt;br /&gt;  3  where e.deptno = d.deptno&lt;br /&gt;  4  and d.deptno = 20;&lt;br /&gt;&lt;br /&gt;     EMPNO ENAME          DEPTNO DNAME&lt;br /&gt;---------- ---------- ---------- --------------&lt;br /&gt;      7369 SMITH              20 RESEARCH&lt;br /&gt;      7566 JONES              20 RESEARCH&lt;br /&gt;      7788 SCOTT              20 RESEARCH&lt;br /&gt;      7876 ADAMS              20 RESEARCH&lt;br /&gt;      7902 FORD               20 RESEARCH&lt;br /&gt;&lt;br /&gt;5 rows selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When using ANSI join syntax, you need to make sure to use the filter condition properly as well.  With ANSI syntax, the difference is in where you place the condition.  In order for the filter to be applied before the join, you must place the filter inside the join condition.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SCOTT@ORA11R2&gt; select e.empno, e.ename, d.deptno, d.dname&lt;br /&gt;  2  from emp e left outer join dept d&lt;br /&gt;  3  on (e.deptno = d.deptno and d.deptno = 20);&lt;br /&gt;&lt;br /&gt;     EMPNO ENAME          DEPTNO DNAME&lt;br /&gt;---------- ---------- ---------- --------------&lt;br /&gt;      7902 FORD               20 RESEARCH&lt;br /&gt;      7876 ADAMS              20 RESEARCH&lt;br /&gt;      7788 SCOTT              20 RESEARCH&lt;br /&gt;      7566 JONES              20 RESEARCH&lt;br /&gt;      7369 SMITH              20 RESEARCH&lt;br /&gt;      7839 KING&lt;br /&gt;      7934 MILLER&lt;br /&gt;      7782 CLARK&lt;br /&gt;      7900 JAMES&lt;br /&gt;      7844 TURNER&lt;br /&gt;      7698 BLAKE&lt;br /&gt;      7654 MARTIN&lt;br /&gt;      7521 WARD&lt;br /&gt;      7499 ALLEN&lt;br /&gt;&lt;br /&gt;14 rows selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you place the filter in the WHERE clause, the filter is applied after the join.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SCOTT@ORA11R2&gt; select e.empno, e.ename, d.deptno, d.dname&lt;br /&gt;  2  from emp e left outer join dept d&lt;br /&gt;  3  on (e.deptno = d.deptno)&lt;br /&gt;  4  where d.deptno = 20;&lt;br /&gt;&lt;br /&gt;     EMPNO ENAME          DEPTNO DNAME&lt;br /&gt;---------- ---------- ---------- --------------&lt;br /&gt;      7369 SMITH              20 RESEARCH&lt;br /&gt;      7566 JONES              20 RESEARCH&lt;br /&gt;      7788 SCOTT              20 RESEARCH&lt;br /&gt;      7876 ADAMS              20 RESEARCH&lt;br /&gt;      7902 FORD               20 RESEARCH&lt;br /&gt;&lt;br /&gt;5 rows selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I tend to use the Oracle syntax most often and am so used to it that when I was shown the ANSI syntax, it took a minute to recall the difference in placement of the filter condition (thanks for the nudge Karl!).  It's fairly obvious when looking at a simple example like this as to where the condition belongs, but when you've got a much more complex SQL statement with multiple joins, the effects of placing the filter in the wrong spot may be overlooked.  &lt;br /&gt;&lt;br /&gt;Hope this little reminder helps!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6863786008728595797?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6863786008728595797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6863786008728595797' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6863786008728595797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6863786008728595797'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/10/left-outer-join-equivalence-oracle-vs.html' title='Left outer join equivalence - Oracle vs ANSI syntax'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-1389822061997354373</id><published>2010-10-01T19:56:00.006-04:00</published><updated>2010-10-01T20:45:05.885-04:00</updated><title type='text'>You know you're a true gadget geek when...</title><content type='html'>...the power goes off in your home during a major thunder/lightning/rain storm and instead of going to the junk drawer to pull out the flashlight you reach for your iPhone and turn it on so that the soft glow illuminates your surroundings. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.apple.com/webapps/images/featured_iphone20100729.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 184px; height: 356px;" src="http://images.apple.com/webapps/images/featured_iphone20100729.png" border="0" alt="" /&gt;&lt;/a&gt; &lt;br /&gt;I even went so far as to go to the App Store and download a free flashlight app that I then played with until the power came back on.  I used my nifty new little app to light my way to the water cooler to refill my water bottle and then returned to the comfort of my couch to play with all the different flashlight choices in the app until the power came back on several minutes later.&lt;br /&gt;&lt;br /&gt;Actually it's kinda scary to think that I've crossed some line that makes my iPhone the "go to" solution in almost any situation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-1389822061997354373?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/1389822061997354373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=1389822061997354373' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1389822061997354373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1389822061997354373'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/10/you-know-youre-true-gadget-geek-when.html' title='You know you&apos;re a true gadget geek when...'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6511426309881546874</id><published>2010-07-21T20:17:00.003-04:00</published><updated>2010-07-21T20:28:46.040-04:00</updated><title type='text'>Do not feed...</title><content type='html'>What exactly am I supposed to think when the park near our house has this sign posted in numerous places:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/TEeOcdt6hBI/AAAAAAAAANI/cgBymUqm-7Y/s1600/do-not-feed.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/TEeOcdt6hBI/AAAAAAAAANI/cgBymUqm-7Y/s400/do-not-feed.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5496518489893667858" /&gt;&lt;/a&gt;&lt;br /&gt;This cracks me up for at least two reasons:&lt;br /&gt;1) because it doesn't say "Beware of alligators" or anything like that, it simply tells you to not feed alligators or other dangerous critters like cats, raccoons and possums, and&lt;br /&gt;2) because there are enough of all of those animals hanging around the park that a warning (and actually a legal ordinance) is needed!&lt;br /&gt;&lt;br /&gt;As I was pondering the sign further (while my daughter played in this danger zone), I was thinking that if all these animals happened to be around at the same time, and the alligator looked hungry, I'd grab one of the others and toss it over to the gator, grab my kiddo and run.  So, I wonder if it's OK to do that?  I mean, since they're all on the sign is it OK for them to eat each other?  &lt;br /&gt;&lt;br /&gt;Geesh...I think of weird things.  Oh well, eat or be eaten I say!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6511426309881546874?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6511426309881546874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6511426309881546874' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6511426309881546874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6511426309881546874'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/07/do-not-feed.html' title='Do not feed...'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/TEeOcdt6hBI/AAAAAAAAANI/cgBymUqm-7Y/s72-c/do-not-feed.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-1147915143700854412</id><published>2010-06-24T20:16:00.004-04:00</published><updated>2010-06-24T20:21:01.438-04:00</updated><title type='text'>My favorite parts of today</title><content type='html'>Every night over dinner my daughter asks me "what was your favorite part of the day Momma"?  Well, tonight I had several favorite things to share.  My first favorite was that I found an Oracle bug that has to do with subquery factoring (I'm going to blog about this one soon).  And my second favorite (well, it's really my *most* favorite) was spending some fun time at the beach with my kiddo.  Looks like we had fun doesn't it?!?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/TCP2ILelAII/AAAAAAAAAMg/c4y60dYuLV8/s1600/kylie-at-the-beach.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/TCP2ILelAII/AAAAAAAAAMg/c4y60dYuLV8/s400/kylie-at-the-beach.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5486499391447826562" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-1147915143700854412?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/1147915143700854412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=1147915143700854412' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1147915143700854412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1147915143700854412'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/06/my-favorite-parts-of-today.html' title='My favorite parts of today'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCP2ILelAII/AAAAAAAAAMg/c4y60dYuLV8/s72-c/kylie-at-the-beach.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7276982396030136839</id><published>2010-06-20T21:55:00.003-04:00</published><updated>2010-06-20T22:02:58.782-04:00</updated><title type='text'>I should've been in movies...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/TB7GpGzwYaI/AAAAAAAAAMY/QVQcl8Su5Ck/s1600/karen_navi.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 311px; height: 400px;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/TB7GpGzwYaI/AAAAAAAAAMY/QVQcl8Su5Ck/s400/karen_navi.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5485039805688471970" /&gt;&lt;/a&gt;&lt;br /&gt;Have you seen the movie Avatar? If not, this will just look like a crazily distorted blue photo of me.  But, if you saw the movie, you'll see me as a Na'vi.  Cool, huh?!?&lt;br /&gt;&lt;br /&gt;I loved the movie (it was fabulous in 3D!) and if you haven't seen it yet, check out the trailer.  &lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cRdxXPV9GNQ&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/cRdxXPV9GNQ&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7276982396030136839?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7276982396030136839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7276982396030136839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7276982396030136839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7276982396030136839'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/06/i-shouldve-been-in-movies.html' title='I should&apos;ve been in movies...'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/TB7GpGzwYaI/AAAAAAAAAMY/QVQcl8Su5Ck/s72-c/karen_navi.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5874479031333538506</id><published>2010-04-27T19:20:00.003-04:00</published><updated>2010-04-27T20:28:51.591-04:00</updated><title type='text'>PowerPoint is the Enemy</title><content type='html'>I went to Starbucks about an hour ago to treat myself to a mocha (even though it was nonfat). And while waiting for my coffee to arrive I noticed the front page of The New York Times.  Right smack in the middle of the page was a horrendous PowerPoint slide and the title of the article underneath read "We Have Met the Enemy and He Is PowerPoint".  &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/S9dygbNAg7I/AAAAAAAAAMQ/rDfsUEWU6LE/s1600/ppt-enemy.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 227px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/S9dygbNAg7I/AAAAAAAAAMQ/rDfsUEWU6LE/s400/ppt-enemy.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5464962574221083570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Even though I knew I could get the &lt;a href="http://www.nytimes.com/2010/04/27/world/27powerpoint.html?src=me&amp;ref=homepage"&gt;story online&lt;/a&gt; when I got home, I just had to buy the paper and read it immediately.   &lt;br /&gt;&lt;br /&gt;I'm a huge believer in the concept of "death by PowerPoint".  There certainly have been a multitude of presentations that I have suffered through that nearly killed me!  I follow and attempt to learn from the presentation methods of &lt;a href="http://presentationzen.blogs.com/"&gt;Garr Reynolds&lt;/a&gt;, &lt;a href="http://blog.duarte.com/"&gt;Nancy Duarte&lt;/a&gt;, &lt;a href="http://sethgodin.typepad.com/seths_blog/"&gt;Seth Godin&lt;/a&gt; and others who are out there promoting more effective ways to deliver presentations.  While this article's title may paint with broader strokes than I would by saying "PowerPoint is the enemy", I mostly agree with the sentiment.  PowerPoint itself may not the enemy, but surely the way it is commonly used is close to a criminal act.&lt;br /&gt;&lt;br /&gt;Just look at that slide the article displays!  Could you ever make any sense of that thing?  It was shown to the General leading the American and NATO forces in Afghanistan last summer and he was quoted as saying, "When we understand that slide, we'll have won the war."  Other high ranking military officers said things like "PowerPoint makes us stupid" and "It's dangerous because it can create the illusion of understanding and the illusion of control."  One General even went so far as to ban the use of PowerPoint presentations!&lt;br /&gt;&lt;br /&gt;In my experience, PowerPoint presentations have replaced meaningful documents (like white papers) and are used in an attempt to distill all the knowledge deemed pertinent on a topic into a few bullet points.  The hope is that a busy person (i.e. usually an executive) can "get the idea" of what is being conveyed without having to spend much time reading something more detailed.  But, the supposedly concise presentations I see most often have entire slides filled with sentences (all preceded by the infamous bullet point) that are so busily annoying that I can barely stand to look at them.  A presenter is really not even a necessary component of the presentation anymore as most people intend for their slide decks to stand alone and tell the story without need for a person to deliver the message verbally.  When these presentations are delivered, they are (more often than not) simply read by the presenter.  On top of that, many presentations are not verbally delivered by those directly responsible for the content, but instead are delivered by a high level manager who only shows up on the day of the big presentation to lead the show.  I don't know...that just seems odd to me.  I'm not going to say there are no merits at all to this use of the tool and this particular approach, but I do find that what is delivered is rarely what I personally want to see/hear.&lt;br /&gt;&lt;br /&gt;The article states that military commanders say that "slides impart less information than a five-page paper can hold, and that they relieve the briefer of the need to polish writing to convey an analytic, persuasive point."  The technical presentations I see suffer from this in that they are not very polished nor persuasive.  But even a "bad paper" that makes an attempt to provide detailed information on a topic is better than being bored to death with a slide presentation that either puts too much or too little meaningful content in front of me.  But, the fact that the use of PowerPoint has become so commonplace, it is rare to ever get a detailed paper...you only get the slides.  And even if you do get a paper, it is often full of grammatical issues and seems to have been written after the slides such that the paper doesn't offer that much more information but only slightly lengthens the bullet points from the slides.&lt;br /&gt;&lt;br /&gt;There are a lot of people out there trying to change the way PowerPoint is used.  They work to show that presentations can be used to support the speaker and the topic effectively.  I think that most of these advocates separate presentation design and use from documents providing detailed information.  I just wish there was a faster way to affect change in this area!&lt;br /&gt;&lt;br /&gt;What happened to the days of speakers standing alone in front of the crowd?  When was the last time you attended a session that didn't use PowerPoint?  Maybe we all need to ban the use of PowerPoint (and all presentation software) for a while and return to a more simple way of sharing our message.  Perhaps instead of propagating the use of PowerPoint, organizations could start hosting &lt;a href="http://toastmasters.org/MainMenuCategories/WhatisToastmasters.aspx"&gt;Toastmasters&lt;/a&gt; meetings and teach people how to become more effective speakers.  &lt;br /&gt;&lt;br /&gt;As I said earlier, I don't think it's necessarily the software that's the problem. But, it's sure an easy target on which to place the blame for the sad situation we find ourselves in every time we are forced to sit through another agonizingly boring presentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5874479031333538506?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5874479031333538506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5874479031333538506' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5874479031333538506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5874479031333538506'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/04/powerpoint-is-enemy.html' title='PowerPoint is the Enemy'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/S9dygbNAg7I/AAAAAAAAAMQ/rDfsUEWU6LE/s72-c/ppt-enemy.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6019518826247617831</id><published>2010-03-16T18:53:00.004-04:00</published><updated>2010-05-08T15:17:15.556-04:00</updated><title type='text'>Oh, the places you'll go!</title><content type='html'>How do you feel about the place you're in, the places you've been, and the places you hope to go?  As I was reading "Oh, the Places You'll Go" by Dr. Seuss to my daughter this evening, I was struck by how much wisdom was held in that simple children's story.  So, I did a quick search and found &lt;a href="http://answers.yahoo.com/question/index?qid=20080731221319AA4le7Z"&gt;the words of the story&lt;/a&gt; for you. &lt;br /&gt;&lt;br /&gt;For those sports buffs out there, check out this cool video using this story that aired as an opener for the 2006 SuperBowl. &lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/t3_R2eCiazk&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/t3_R2eCiazk&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Note (5/8/2010): This post originally included a video link that is no longer available so I removed the reference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6019518826247617831?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6019518826247617831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6019518826247617831' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6019518826247617831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6019518826247617831'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/03/oh-places-youll-go.html' title='Oh, the places you&apos;ll go!'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7151331274385731911</id><published>2010-02-19T19:37:00.002-05:00</published><updated>2010-02-19T20:25:45.899-05:00</updated><title type='text'>Yes, I'm still here</title><content type='html'>I admit it. I'm a binge blogger (I borrowed this term from a friend of mine who posted on the same topic). I make several blog entries over the course of a week or so and then it may be a month or two before I show up again. I suppose my good intentions of blogging regularly just get swept under the rug of day-to-day reality and how/where I choose to spend my time. But, regardless of frequency, I suppose it's fairly obvious from this post that I'm still here.&lt;br /&gt;&lt;br /&gt;I was doing a bit of blog surfing tonight to catch up on a long list of blogs I enjoy reading and came across the following from a &lt;a href="http://sethgodin.typepad.com/seths_blog/2010/02/more-more-more.html"&gt;recent Seth Godin post&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;"Firing the customers you can't possibly please gives you the bandwidth and resources to coddle the ones that truly deserve your attention and repay you with referrals, applause and loyalty."&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Amen! This reminded me a a time early in my days as a self-employed consultant back in the mid-90's. I took on a client that turned out to be a royal pain-in-the-backside. They'd call me to complain about their fax not working (among other odd things) and even though the services I had contracted with them to provide had nothing to do with most of the things they called to rant about, they expected me to address and fix them all. I ended up giving them back the initial fee they'd paid and canceled the contract. I felt better immediately and the time I was spending dealing with them was quickly filled with several new (and much nicer and "normal") customers.&lt;br /&gt;&lt;br /&gt;So, I can relate to this quote. I also think it just makes good sense across the board. Whatever you give your time and attention to (careers, relationships, etc) should yield positive (whatever positive means to you) results. If you find that you're always unhappy when dealing with certain aspects of life, then I think it's entirely reasonable to look for ways to eliminate/reduce whatever it is and replace it with something that brings more happiness and positiveness to you. It may seem difficult and a bit scary to do so, but I think in the long run it's the way to go.&lt;br /&gt;&lt;br /&gt;On a different note, I spoke today at the &lt;a href="http://maop.org/"&gt;MAOP (Mid Atlantic Association of Oracle Professionals) Conference&lt;/a&gt; held today in Reston VA. I really enjoyed being there and got some good feedback and questions after speaking. In my current work I don't get the opportunity to speak in front of folks like I used to when I taught classes at least a couple of weeks a month. So, I'm really grateful to MAOP for asking me to speak and for having the opportunity to get a "fix" from presenting to a great audience!&lt;br /&gt;&lt;br /&gt;And speaking of conferences, the annual &lt;a href="http://www.hotsos.com/sym10.html"&gt;Hotsos Symposium&lt;/a&gt; is coming up March 7-11 in Dallas. This will be the first one I've missed since they started having them 8 years ago (bummer!). But, if you want to attend one of the best conferences anywhere, and the only one focused specifically on Oracle performance, there's still seats available. I highly recommend it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7151331274385731911?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7151331274385731911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7151331274385731911' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7151331274385731911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7151331274385731911'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/02/yes-im-still-here.html' title='Yes, I&apos;m still here'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7831901689775409296</id><published>2010-01-05T16:39:00.004-05:00</published><updated>2010-01-05T20:50:48.594-05:00</updated><title type='text'>2000 columns - take 2</title><content type='html'>Thanks to everyone who commented on yesterday's post.  After Randolf's comment about the 1000 column limit, I realized that so far, I've not attempted to create the full table in one go.  Instead, I've been building 20-ish separate tables that contain the needed raw data plus the computed/aggregated columns.  This speaks to Noons comment about having separate tables that access and group data up that can be executed in multiple streams&lt;br /&gt;&lt;br /&gt;The SAS guys want to be able to access a single row that represents all the information they need for one type of data (for example, a shipment).  So far, as I build the separate tables, I've been using a couple of views that combine several of the tables.  The SAS guys then use the view to build a SAS dataset and merge multiple datasets together.&lt;br /&gt;&lt;br /&gt;Yesterday's post was prompted by the prospect of having to build a single table in Oracle that does what they're currently doing via SAS.  And to Joel's point, SAS is certainly not Oracle!  One of the original goals was to ultimately have a table built and maintained in Oracle and only accessed by SAS, not multiple objects in Oracle that have to be merged into SAS datasets.&lt;br /&gt;&lt;br /&gt;I've been so busy and focused on getting the data formulated/aggregated, and doing so as efficiently as possible, that I hadn't even made the attempt to build out a full table with all the columns of all the tables included in that one table.  When I started thinking about it yesterday, I got all freaked out about doing it and that's what prompted my post. I hadn't even thought about the Oracle imposed limits on the number of columns!  I've been told more than once that the team had delivered 1000s of columns before, so I just hadn't given it much thought.  But, given there is an Oracle limit, I'm guessing they've never delivered a final Oracle table like they want to do this time...so, it's either been done in SAS previously or the Oracle tables didn't exceed the 1000 column limit.&lt;br /&gt;&lt;br /&gt;So, I've got lots to figure out over the next few weeks.  This just may be more fun than I can stand!  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7831901689775409296?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7831901689775409296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7831901689775409296' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7831901689775409296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7831901689775409296'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/01/2000-columns-take-2.html' title='2000 columns - take 2'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-1043747293245962818</id><published>2010-01-04T19:57:00.003-05:00</published><updated>2010-01-04T20:08:38.581-05:00</updated><title type='text'>2000 columns</title><content type='html'>How many columns does the largest table you've ever worked with contain?  The current project I'm working on has 1 table with almost 2000 columns (and it's likely to add more!).  This is the most highly denormalized design I've ever encountered and there's something about it that makes the performance optimizer in me cringe.  But, the statisticians that have to munch and crunch this data in SAS tell me this format best suits their needs (based on similar designs used successfully in previous projects).&lt;br /&gt;&lt;br /&gt;I think I'm really more concerned about the work that has to be done to populate these columns as most of the columns contain aggregations or formulations of some sort or another.  So, perhaps it's not the number of columns that really is niggling at me as it is everything that must occur to produce the values contained in a single row (it's a lot).&lt;br /&gt;&lt;br /&gt;What's your experience? Did the number of columns help, hinder or make no difference in the design and performance of the application that used such wide tables? This phase of the project is a proof of concept so it'll be a while before I get hard data on how well (or not) this design really works, but it has certainly made me curious about what other folks have experienced.&lt;br /&gt;&lt;br /&gt;Let me hear from you if you have any comments or insights!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-1043747293245962818?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/1043747293245962818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=1043747293245962818' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1043747293245962818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1043747293245962818'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2010/01/2000-columns.html' title='2000 columns'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6281095465928857441</id><published>2009-11-30T20:48:00.008-05:00</published><updated>2009-12-21T12:10:22.800-05:00</updated><title type='text'>Compression to the rescue</title><content type='html'>We've had issues getting enough storage space allocated on the development server our project is intended to use. For this project, our team doesn't have full DBA rights on the box and have very limited privileges. Even before I joined the team, a request had been made for a little over 3.5 TB of space to be used for the development of a proof of concept datamart. The first project deliverable is due this week and we've only been allocated 200 GB so far.  As you can imagine, it's difficult to get needed data loaded when there is less than 10% of the space we need available. &lt;br /&gt;&lt;br /&gt;The data is supposed to span a 2 year period. A set of base transaction tables have to be extracted from various sources and loaded, then that data will be flattened out into a model that will represent the final design. With only 200 GB currently available, my initial loads for 5 (out of 50) tables took nearly all of what we had available.  So, I had to do something to try and fit as much data as possible into the space we had available.  Compression to the rescue!&lt;br /&gt;&lt;br /&gt;I decided to compress the tables I had extracted using basic compression (just add COMPRESS to the table definition). But first, in order to try and get the most optimal compression possible, I collected statistics on the tables I wanted to compress and reviewed the num_distinct column statistic. Using this statistic, I sorted the data into my new compressed table using a column order from lowest to highest number of distinct column values. &lt;br /&gt;&lt;br /&gt;When the new compressed tables were ready, I had achieved 86% compression! Using this method, I was able to load the majority of the key tables I needed to allow progress to continue for our initial project deliverable.  I still haven't been able to get everything, but at least I got enough to allow our statisticians to produce some initial findings (the project is intended to create a predictive analytical model).&lt;br /&gt;&lt;br /&gt;An additional 2 TB was allocated to us on Friday but of course it was on a different server so the initial data has to be exported and imported into the new location (sigh...).  But the lack of available space gave me an opportunity to effectively use a feature I probably wouldn't have used if I had all the space I needed to start with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6281095465928857441?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6281095465928857441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6281095465928857441' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6281095465928857441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6281095465928857441'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/11/compression-to-rescue.html' title='Compression to the rescue'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2990724512213867685</id><published>2009-10-28T18:46:00.005-04:00</published><updated>2009-10-28T19:31:53.066-04:00</updated><title type='text'>Book Adverts</title><content type='html'>I'm very pleased to announce two Oracle related books I have co-authored are to be published shortly by Apress.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SujUMRU9KlI/AAAAAAAAALs/QzM8IBxbeiE/s1600-h/two-books.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 260px; height: 170px;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SujUMRU9KlI/AAAAAAAAALs/QzM8IBxbeiE/s400/two-books.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5397797460678355538" /&gt;&lt;/a&gt;&lt;br /&gt;The first book is entitled &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.apress.com/book/view/1430226684"&gt;Expert Oracle Practices: Oracle Database Administration from the Oak Table&lt;/a&gt;&lt;/span&gt; and it will be officially published in December. There are 9 chapters currently available for eBook download via the Apress Alpha program. The Alpha program allows you to purchase (at a substantial discount from the full publish price) an unedited, unfinished pre-release format. The full book isn't available yet, but when it becomes available, you will be able to download the full eBook at no additional cost. It's a good option if you want to get a jump on what's to come! I wrote the chapter on Managing SQL Performance. I'm really excited about the book and am very proud to be among the group of Oak Table folks who are co-authoring it together. &lt;br /&gt;&lt;br /&gt;Not far behind the Oak Table book will be &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.apress.com/book/view/1430271970"&gt;Beginning Oracle SQL&lt;/a&gt;&lt;/span&gt;. The book is a revision of the classic &lt;span style="font-style:italic;"&gt;Mastering Oracle SQL and SQL*Plus&lt;/span&gt; by Lex de Haan originally published in 2004. Again, I was fortunate to be able to work with a fantastic group of co-authors to revise Lex's work to include many of Oracle's latest developments to the SQL query language. I knew Lex for only a very short time before his passing in 2006 but I knew him to be a brilliant and wonderful man and I'm very honored to be able to contribute to revising his original work.&lt;br /&gt;&lt;br /&gt;These books represent my first time as a published author. I've written many whitepapers and articles for various Oracle user group periodicals and such in the past but never attempted the process of writing a book. After having this experience, I'm grateful that my first time was as a co-author. It's comforting to know there are other folks out there sweating the process with you!  &lt;br /&gt;&lt;br /&gt;The folks at Apress have been awesome and I hope that my first experience as an author won't be my last!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2990724512213867685?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2990724512213867685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2990724512213867685' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2990724512213867685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2990724512213867685'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/10/book-adverts.html' title='Book Adverts'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SujUMRU9KlI/AAAAAAAAALs/QzM8IBxbeiE/s72-c/two-books.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4947338729187071726</id><published>2009-10-20T08:29:00.002-04:00</published><updated>2009-10-20T09:08:39.195-04:00</updated><title type='text'>Things that make you go "hmmmmm"</title><content type='html'>I was reading a blog post entitled &lt;a href="http://www.typotheque.com/articles/how_good_is_good.html"&gt;How Good is Good?&lt;/a&gt;. It was written 8 years ago by a graphic designer by the name of Stefan Sagmeister. The post was speaking about creating designs that were meaningful and make an impact on the world (or the part of the world each design is directed toward). While the post was interesting, it was one of the comments that caught my eye. Most of the commenters were inspired by the post but one commenter, in reference to the idea of making a match between good causes and good design a priority vs the more mundane every day marketing stuff, said:&lt;br /&gt;&lt;blockquote&gt;Simple, don't go into graphic design, Choose something else. Cause if you don't do "that" work, other designers will. Do people really think that everybody enjoys their job?&lt;/blockquote&gt;&lt;br /&gt;It was the commenter's question that made me thoughtful: &lt;span style="font-style:italic;"&gt;Do people really think that everybody enjoys their job?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've always felt very fortunate to be able to do work that I really love doing. There may be times when I get frustrated with some of the particulars, but overall I know I'm doing "the thing" I'm supposed to be doing. &lt;br /&gt;&lt;br /&gt;My choice of career path came to me in college. I started out as an accounting major but after my first computer-related course, I switched majors and knew that working in the information technology field was for me. So, I got my degree and have worked in the field ever since.&lt;br /&gt;&lt;br /&gt;I honestly can't imagine working in a job that I didn't like. So, it was just a bit of an "ah-ha" moment to consider the idea that not everyone enjoys their job. What would that be like? What would it be like to wake up every morning and go do something that you don't enjoy for 8 or more hours? That would seem like torture to me.&lt;br /&gt;&lt;br /&gt;But, I suppose it may be more likely that more people don't enjoy their jobs than do. Have you ever seen the TV show "&lt;a href="http://discovery.com/dirtyjobs "&gt;Dirty Jobs&lt;/a&gt;"? Some of those jobs are (in my opinion) just horrid. I can't imagine having to do some of those tasks every day. But, there are a lot of jobs out there that I can't imagine doing that many people love.&lt;br /&gt;&lt;br /&gt;However, I think that it may be more about "doing what you gotta do" many times vs actually choosing a job you want/enjoy/love. I just find it sad, and somewhat humbling, to think about all the people who do things they don't enjoy just to make enough money to maintain a life for themselves and their families. To think of spending such a large portion of my life doing something I found no enjoyment in really makes my heart ache.&lt;br /&gt;&lt;br /&gt;Are you doing what you really enjoy?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4947338729187071726?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4947338729187071726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4947338729187071726' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4947338729187071726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4947338729187071726'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/10/things-that-make-you-go-hmmmmm.html' title='Things that make you go &quot;hmmmmm&quot;'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6986665416046576325</id><published>2009-10-15T16:55:00.000-04:00</published><updated>2009-10-15T16:56:07.166-04:00</updated><title type='text'>OOW09 and my favorite 11gR2 feature</title><content type='html'>I decided to wait until the end of Oracle Open World 2009 before I posted anything. So many people have been tweeting and blogging and shooting video of this year's event, I figured I'd put in my two cents worth at the end.&lt;br /&gt;&lt;br /&gt;Man...it's been a l-o-n-g week. I don't know if it's my increasing age or what, but being in a herd of this size for an entire week has left me feeling somewhat bruised (both physically and mentally). I started at 9am on Sunday morning by attending Tom Kyte's keynote for Oracle Develop and have made it through Thursday - which seems like a minor miracle somehow. But I have survived! &lt;br /&gt;&lt;br /&gt;So much goes on here, it's hard to keep moving through it given the mass of people and multiple session locations (not to mention the after hours opportunities for fun and frolic). Add a bit of rain (some kind of monsoon as it seemed to me) and, at times, it was like being in an undersized kennel filled with wet dogs. :)&lt;br /&gt;&lt;br /&gt;The sessions I attended, and there were many, were all quite excellent. I sat in on most all of the 11gR2 sessions and am really amazed at many of the new features and options 11gR2 offers. My favorite is edition-based redefinition (also referred to as "online application upgrades"). This feature isn't getting nearly as much press time as some of the other more sexy things (for instance, you couldn't move 10 feet without seeing or hearing about Exadata) but as far as I'm concerned, editioning is a hugely beneficial new feature.&lt;br /&gt;&lt;br /&gt;By the way, it is a &lt;span style="font-style:italic;"&gt;feature&lt;/span&gt;, not an option. Wow...for once it's something you don't have to pay extra for! I loved that when Tom Kyte did his "10 - no 11 - top things about 11gR2" session, that he gave editioning two spots on the list. So what is editioning?&lt;br /&gt;&lt;br /&gt;1. You can create a new edition to contain any new code changes.&lt;br /&gt;2. Data changes can be made (add new columns or new tables) and the new code can safely write to the new stuff without any of it being seen by the old edition.&lt;br /&gt;3. Different projections of tables are exposed via editioning views so that each edition is allowed to see only its own columns.&lt;br /&gt;4. If the old edition makes data changes those changes are propogated using cross-edition triggers into the new edition's columns (or vice-versa).&lt;br /&gt;&lt;br /&gt;The bottom-line is that now with 11gR2, if you want to make changes to procedures, packages, views, synonyms, etc, you can do it using editioning and maintain both the old (original) version as well as the new. It also means a lot less headache. Have you ever tried to CREATE OR REPLACE PACKAGE in production while the instance is in use? What happens? Well, if the package is in use, Oracle has to wait until it is no longer in use in order to replace it. So, Oracle waits. But, if new requests to use the package come in during this time, those sessions must wait also. That doesn't even begin to touch what happens if the new package causes other objects to be invalidated and thus they need recompilation also. It can be a pretty long, arduous and resource-intensive process to get something seemingly so simple done.&lt;br /&gt;&lt;br /&gt;With editioning, a new edition is created and the modified package is compiled into that edition. No muss, no fuss...and no waiting! This is just a bit about this great feature, but I recommend you look on OTN for more info and several whitepapers Oracle has available on the topic.&lt;br /&gt;&lt;br /&gt;There's so much more I could blabber on about, but I'll save other thoughts for other posts. All in all, it's been a good week, my presentation on Tuesday was well attended and I got great feedback, and I've got lots of great material to take back home for further review and sharing with colleagues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6986665416046576325?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6986665416046576325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6986665416046576325' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6986665416046576325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6986665416046576325'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/10/oow09-and-my-favorite-11gr2-feature.html' title='OOW09 and my favorite 11gR2 feature'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6245951823660391191</id><published>2009-10-09T15:12:00.003-04:00</published><updated>2009-10-09T15:43:39.439-04:00</updated><title type='text'>Memorization vs. Understanding</title><content type='html'>This graphic was recently pointed out to me (thanks Jared!) and I loved it...so I thought I'd share.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://headrush.typepad.com/photos/uncategorized/understandvsmemorize_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 434px; height: 448px;" src="http://headrush.typepad.com/photos/uncategorized/understandvsmemorize_1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;The key point (as noted in the upper right) is:&lt;br /&gt;&lt;blockquote&gt;Understanding how something works can drastically reduce the need to memorize a bunch of seemingly arbitrary facts.&lt;/blockquote&gt;&lt;br /&gt;I believe this is an accurate statement. I've been around many people who seemed to be able to spout out the most arcane command syntax or provide the "textbook" definition of virtually any topic. But, if there was a problem where something more than knowing the definition of something or being able to quote the documentation on a topic was required, they quickly got lost and didn't know what to do or how to proceed.&lt;br /&gt;&lt;br /&gt;Certification exams, for instance, ask questions that can be answered correctly if you've memorized a lot of facts. I've always jokingly said that if I gave my mother (sweet southern homemaker that she is) enough material to memorize, that she could likely pass the Oracle certification exams in 1 or 2 tries. And although she'd never indulge me to see if I could prove that theory, I suspect it's close to the truth. She's a bright woman with a great memory so I think she could memorize and do pretty well on the tests.&lt;br /&gt;&lt;br /&gt;I once met a kid that had just graduated college and had started his first real job with a client I was doing some work for several years ago. The company paid for him to take a two week "boot camp" course and take the certification exams. So, with about 2 months of on-the-job experience, he went to the two week class, took all of the exams at the end of it, passed them all and returned back to work a "certified expert". Of course there was a big production flame-out right after he got back and he got razzed pretty good about "not knowing" what to do since he was now an "expert". &lt;br /&gt;&lt;br /&gt;The bottom-line, as I see it, is that memorized knowledge can (and likely should) be part of your foundation. But, it will only get you so far. It's the ability to really understand something and how it works that will help you solve issues that just aren't solvable with memorized facts alone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6245951823660391191?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6245951823660391191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6245951823660391191' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6245951823660391191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6245951823660391191'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/10/memorization-vs-understanding.html' title='Memorization vs. Understanding'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3164922799424364542</id><published>2009-10-01T08:52:00.002-04:00</published><updated>2009-10-01T10:18:16.971-04:00</updated><title type='text'>Cost and value</title><content type='html'>I just read a post by Seth Godin entitled "&lt;a href="http://sethgodin.typepad.com/seths_blog/2009/09/if-craigslist-cost-1.html"&gt;If Craigslist cost $1&lt;/a&gt;". I've used Craigslist and I agree with him that even a small charge for the service would likely clean it up a whole lot. At $1 per listing, most people with a legitimate need would still choose to use the service. But, for scammers and those with not so virtuous purposes, the small charge and thus the requirement for verifiable identification for the money exchange, would push them out of the game. Plus, the money coming in for using the service could go towards making the service better or making the owners richer or be used for philanthropic purposes or whatever. &lt;br /&gt;&lt;br /&gt;The post made me think about cost and value. What if the cost to use the service was higher ($5, $10, $20)? At what point would the cost outweigh the value? Well, certainly the higher the cost to use the service is, the higher the cost of the items sold on the service will be, right? I mean, I don't think I'd want to pay $10 to use the service if I'm going to sell my item for $10. Maybe if I'm selling my item for $20, I'd be willing to pay half of that to get it sold. &lt;br /&gt;&lt;br /&gt;My actual, real-life use of Craigslist has typically been for a few basic reasons: &lt;br /&gt;&lt;blockquote&gt;1) I no longer use the item(s) but they are in good enough shape that I think someone else would/could use them.&lt;br /&gt;2) Having someone come pick up the item and take it away is much easier than trying to figure out how to get it to my local Goodwill (stuff like furniture and larger items).&lt;br /&gt;3) I bought something on a whim and either never used it or only used it once or twice before realizing that I really didn't want or need it.&lt;/blockquote&gt;&lt;br /&gt;The real bottom-line for me has typically been that I just wanted to get rid of something that I was no longer using but believed the item to be in good enough condition that it "shouldn't" be thrown away. (Waste not, want not!) So, in most every case, even if I only asked a few dollars, the point was that I was able to get the items out of my house and off to someone else who wanted them. I didn't have to do anything except put up an ad, answer a few calls and then exchange the item(s) for cash when a buyer appeared.&lt;br /&gt;&lt;br /&gt;It wasn't about the money that I received for the item. Even if I hadn't sold the item, I would have gotten rid of it somehow, so the money was just a "nice to have" benefit. The value of the service was that it was easy for me and I believed it was a win-win for both me and the buyer. I'd have been willing to pay a fee to use the service. &lt;br /&gt;&lt;br /&gt;But really, this isn't about Craigslist. It's about the cost (price you're willing to pay) of something versus the value having or using that something has to you. Another example is software. Some of my favorite software tools have cost me little to nothing to obtain. I use them constantly and have been very happy to pay for them (most everything I'm thinking of has cost less than $30 each). But there are other products that cost *a lot* ($1,000 or more) and while I really might like to have them, I'm not willing to pay that cost. I'm particularly not willing to pay when there is a comparable product that is available for free or at a very low cost. The first example that comes to mind is TOAD vs SQL Developer. [sidebar] I am not advocating either product nor am I comparing features or virtues of either. [/sidebar] Since SQL Developer is free, I'd very likely choose it instead of the costed product and use it until I found that it didn't meet my needs to such a degree that the cost of buying TOAD would be outweighed by the benefit of having it. Even then, I'd hesitate unless the feature I needed was so key/critical that I could easily identify how having that feature would save me money in the long haul.&lt;br /&gt;&lt;br /&gt;But, if TOAD was priced much lower, say under $300 (instead of the base edition being nearly $900), I don't think I'd hesitate to buy it. This is where I wonder how companies decide to price their products. Is it truly a "what the market will bear" pricing strategy or what? I likely have a poor way of looking at it, but if I had a software product that I think everyone should use, then I'd be willing to sell it at a lower cost in hopes that I'd sell more and thus make up the difference. In other words, I'd rather sell 1000 copies at $300 each than 100 copies at $3000 each. I'd say there is an excellent reason why pricing isn't done this way and there's also a reason why I'm not in sales and marketing. ;) &lt;br /&gt;&lt;br /&gt;How about you? How does cost and value fit into your personal buying decisions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3164922799424364542?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3164922799424364542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3164922799424364542' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3164922799424364542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3164922799424364542'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/10/cost-and-value.html' title='Cost and value'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2108065740686210631</id><published>2009-09-30T12:21:00.005-04:00</published><updated>2009-09-30T13:41:19.582-04:00</updated><title type='text'>SMART goals</title><content type='html'>I was just reviewing the written goals for a project I've started working on and after looking at a few of them, I was reminded of how important it is to make sure your goals are "SMART".&lt;br /&gt;&lt;br /&gt;For example, one of the project goals is: &lt;span style="font-style:italic;"&gt;To create a standard framework that supports high levels of service&lt;/span&gt;. Hmmm... When I read that goal, I found myself thinking of the concept of SMART goals that I learned a long time ago. Somehow this goal doesn't seem to fit the SMART paradigm.&lt;br /&gt;&lt;br /&gt;So, what is a SMART goal?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SsOHBEbGHCI/AAAAAAAAALU/1k6158Ij9Tc/s1600-h/SMART+goal.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 152px; height: 205px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SsOHBEbGHCI/AAAAAAAAALU/1k6158Ij9Tc/s400/SMART+goal.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5387298031702252578" /&gt;&lt;/a&gt;&lt;br /&gt;SMART  is just a mnemonic that can help you remember how to effectively formulate a goal. Here's a brief description:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;&lt;font size="+3"&gt;S&lt;/font&gt;pecific&lt;/span&gt; - The What, Why, and How. &lt;br /&gt;What are you going to do? What do you want to accomplish?&lt;br /&gt;Why is it important (reasons, purpose, benefits)?&lt;br /&gt;How will you accomplish the goal?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;font size="+3"&gt;M&lt;/font&gt;easurable&lt;/span&gt; - Concrete criteria for measuring progress.&lt;br /&gt;If you can measure properly, you can see change occur as you progress toward the goal. Ask questions like "how much?" or "how many?".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;font size="+3"&gt;A&lt;/font&gt;ttainable&lt;/span&gt; - Takes enough effort to be a bit of a stretch, but not so far out of reach that is nearly impossible to complete.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;font size="+3"&gt;R&lt;/font&gt;elevant&lt;/span&gt; - "Do-able"...not "easy". The skills are available, the learning curve is not vertical and the goal is within bounds of the overall plan.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;font size="+3"&gt;T&lt;/font&gt;ime-Bound&lt;/span&gt; - A clear target date or time period to work towards. Without the time element, the commitment to begin action is often too vague.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I think the project goals I've been reviewing have most of the details that would cover the SMART elements elsewhere in the project docs, but I'm glad for the opportunity to review this method for stating goals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2108065740686210631?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2108065740686210631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2108065740686210631' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2108065740686210631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2108065740686210631'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/smart-goals.html' title='SMART goals'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gB2tAQrrKSw/SsOHBEbGHCI/AAAAAAAAALU/1k6158Ij9Tc/s72-c/SMART+goal.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7676537804554761602</id><published>2009-09-24T08:22:00.001-04:00</published><updated>2009-09-24T08:29:48.860-04:00</updated><title type='text'>The best flowchart ever</title><content type='html'>This was forwarded to me and I totally laughed out loud. I've seen a lot of flow charts (mostly of the boring technical sort), but this is my absolute all-time favorite! Zoom in on it or visit the originating site to see it better.&lt;br /&gt;&lt;br /&gt;It's a flow chart of the song &lt;a href="http://jeannr.tumblr.com/post/165291081/i-made-a-flow-chart-that-we-might-better"&gt;"Total Eclipse of the Heart"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/Srtk4bZHHvI/AAAAAAAAAK8/EfQB6t1U6u0/s1600-h/total-eclipse.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 309px;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/Srtk4bZHHvI/AAAAAAAAAK8/EfQB6t1U6u0/s400/total-eclipse.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385008700040093426" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7676537804554761602?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7676537804554761602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7676537804554761602' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7676537804554761602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7676537804554761602'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/best-flowchart-ever.html' title='The best flowchart ever'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gB2tAQrrKSw/Srtk4bZHHvI/AAAAAAAAAK8/EfQB6t1U6u0/s72-c/total-eclipse.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2486179326422597861</id><published>2009-09-22T20:18:00.000-04:00</published><updated>2009-09-22T20:43:45.059-04:00</updated><title type='text'>Resumes, interviews and truth in advertising</title><content type='html'>OK...what's the deal with resumes that say one thing (so that a candidate looks nearly perfect) and then you interview them and find out they can barely spell Oracle?  I'd think that if your resume says you've been working with Oracle since 1988 and have worked extensively with PL/SQL, you'd know what a REF CURSOR is or maybe even know a bit about collections or something, right?  I asked one candidate these questions and they said they'd never ran into those 'features'. So finally, just for fun, I asked "On a scale of 1-10, with 10 being expert, where would you rank yourself in terms of your PL/SQL proficiency?" The answer: "Well, I suppose it's a bit conceited to give yourself a 10, so I'll just be humble and say 9."&lt;br /&gt;&lt;br /&gt;Are you kidding me? Really?&lt;br /&gt;&lt;br /&gt;Personally, I think my resume is lacking overall. I seem to have a hard time distilling over 20 years of experience into a couple of pages and making the "real me" show up on paper. But, if you get me into the ballpark (i.e. an interview), I'll hit most every pitch you throw at me. But, I'd be terrified to try to over-sell myself and get caught unable to deliver the goods. So, it's just a bit scary for me to look at resumes and think "Wow!" and then talk to the person for 3 minutes and think "Yuck!"&lt;br /&gt;&lt;br /&gt;At what point did this become the norm and not the exception? Or, am I just in the midst of some weirdly skewed tilt of the interview universe? It almost reminds me of my reaction when reading an ad that claims "World's Best" or "Indescribably Perfect" or some other line and knowing it's just a ploy. I'm not a fan of those that skirt the edges of "truth in advertising". But when it comes to selling yourself, I'd really hope the claims you make could be backed up. Sigh...&lt;br /&gt;&lt;br /&gt;Here's hoping that the rest of this week's interviews are with folks who match their advertising.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2486179326422597861?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2486179326422597861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2486179326422597861' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2486179326422597861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2486179326422597861'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/resumes-interviews-and-truth-in.html' title='Resumes, interviews and truth in advertising'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5917897844221190929</id><published>2009-09-18T13:47:00.000-04:00</published><updated>2009-09-18T14:35:27.929-04:00</updated><title type='text'>Brain Rules, multitasking and cubicles</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SrPIelpNQWI/AAAAAAAAAK0/yuTMXIAnRYI/s1600-h/brain-rules.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 215px; height: 320px;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SrPIelpNQWI/AAAAAAAAAK0/yuTMXIAnRYI/s320/brain-rules.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382866407464452450" /&gt;&lt;/a&gt;&lt;br /&gt;One of my favorite books is &lt;a href="http://www.brainrules.net/"&gt;Brain Rules by John Medina&lt;/a&gt;. The following passage is from the book's introduction:&lt;br /&gt;&lt;blockquote&gt;Most of us have no idea how our brain works.&lt;br /&gt;&lt;br /&gt;This has strange consequences. We try to talk on our cell phones and drive at the same time, even though it is literally impossible for our brains to multitask when it comes to paying attention. We have created high-stress office environments, even though a stressed brain is significantly less productive. Our schools are designed so that most real learning has to occur at home. This would be funny if it weren’t so harmful. Blame it on the fact that brain scientists rarely have a conversation with teachers and business professionals, education majors and accountants, superintendents and CEOs. Unless you have the Journal of Neuroscience sitting on your coffee table, you’re out of the loop.&lt;br /&gt;&lt;br /&gt;This book is meant to get you into the loop.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I've had this book for a while and recently picked it back up to re-read it. Today, this bit of the intro seemed appropriate to discuss here. Brain researchers have proven that it is (as stated above) nearly impossible for our brains to multitask. However, given the way most of us attempt to operate every day, we don't believe or accept this is true. &lt;br /&gt;&lt;br /&gt;I was thinking about how I am constantly doing what I believe to be multitasking. For example, I listen to an audiobook during my drive to and from work. Since the book is on my iPhone, I may be interrupted by a call that comes in, so I often talk on the phone while driving. When I get to work, I switch from my audiobook to a playlist of light jazz or something else with few words (I admit that I can't quite handle music with lyrics while trying to work as I always end up singing along and forget what I am doing). I work in a "cubicle village" with about a dozen of my colleagues where we each occupy about a 5x7 foot area with a half height divider wall in between. Every sound is clearly audible  throughout the village so I constantly find myself vicariously sucked into other conversations and phone calls. [That's precisely the reason why I tell myself I wear earbuds so I can drown out some of the noise.] Then, at the end of the day, I switch back to my audiobook and drive home.&lt;br /&gt;&lt;br /&gt;What I noticed this morning was that when I got to work, I couldn't really remember the drive to get there. I did remember the predicament my audiobook's main character was in when I stopped listening, but the drive was a blur. :)&lt;br /&gt;&lt;br /&gt;I then started thinking about my work day. There have been several times when I'll be working on something and a song or a nearby conversation pulls my attention away from what I'm doing and I end up struggling to get back on track after a few seconds (or minutes) of distraction.&lt;br /&gt;&lt;br /&gt;In Medina's book introduction he says that we've created high-stress environments and in so doing have made ourselves less productive. I think that's true. How many of you actually have a real office...you know, one with a door and 4 real walls? How many times a day are you distracted or completely interrupted from what you're working on because of your environment? I understand the economics behind cubicles vs offices, but I think it would be fascinating to know what the real cost is in terms of lost productivity.&lt;br /&gt;&lt;br /&gt;I don't know that I'll give up my audiobook during my drive (and I may regret it one day if listening to it results in me being unable to avoid an accident), and I'm confident that I'll not rate an office with a door for a long while. But knowing that my brain can't multitask is apparently not going to stop me from trying to emulate the effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5917897844221190929?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5917897844221190929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5917897844221190929' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5917897844221190929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5917897844221190929'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/brain-rules-multitasking-and-cubicles.html' title='Brain Rules, multitasking and cubicles'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SrPIelpNQWI/AAAAAAAAAK0/yuTMXIAnRYI/s72-c/brain-rules.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5550815328714124344</id><published>2009-09-15T13:59:00.000-04:00</published><updated>2009-09-15T14:22:17.126-04:00</updated><title type='text'>A rude morning wake-up</title><content type='html'>I've been just a bit muddle-headed the past few days. I've been fighting a nasty cold with nasty symptoms. I am not reluctant to medicate to alleviate the worst of my symptoms. My mom was a public health nurse and dosed my siblings and I well whenever we got sick. So, if my nose starts to close and my throat burn, I head straight to the pharmacy and stock up. My current round of over-the-counter goodies includes DayQuil, NyQuil, and Afrin nose spray (extra moisturizing, of course). On top of that, I've already been through about 10 boxes of Puffs (plus Lotion) tissue and think I'll go through another 10 before this is over.&lt;br /&gt;&lt;br /&gt;When you wake up in the morning, after having pumped your system full of the aforementioned drugs, it's not so much that you wake up as it is that you move out of a state of total unconsciousness to one of mobile unconsciousness.  &lt;br /&gt;&lt;br /&gt;It was in that state that I entered the bathroom this morning to take my shower. I think I had one eye half open (the other still felt glued shut) as I stepped into the shower. I reached down, turned on the water and... holy crap! Cold water sprayed me and I jumped back about 3 feet. Both eyes open now, I tried to squeeze between the shower wall and the cold stream to reach down and turn it off. After a few brutal seconds, I finally got the water turned off and laid my head against the wall to try and recover. I got out of the shower, reached back in, turned the water on to let it heat up and stood there on the rug, cold and dripping while I waited. This is where you say "awwwww...poor baby".&lt;br /&gt;&lt;br /&gt;I really don't think it matters that this happened while I'm fighting a cold. I'd have hated it and had the same reaction even if I'd been healthy and well. It just seemed worse this morning because I was so fuzzy-headed. &lt;br /&gt;&lt;br /&gt;Now that I've bored you with all that, let me get to the thought I had, after the water heated and I climbed back into the shower, that prompted this insipid post...&lt;br /&gt;&lt;br /&gt;Are there actually people out there who get in the shower first and &lt;span style="font-weight:bold;"&gt;THEN &lt;/span&gt;turn on the water?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5550815328714124344?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5550815328714124344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5550815328714124344' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5550815328714124344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5550815328714124344'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/rude-morning-wake-up.html' title='A rude morning wake-up'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4517555845068159703</id><published>2009-09-14T09:42:00.000-04:00</published><updated>2009-09-14T10:10:17.148-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='typo'/><title type='text'>Typos</title><content type='html'>I've had a problem recently with typographical errors. I've often been guilty of using "its" when I should have used "it's", typing "teh" instead of "the" or making other errors that are spelled wrong or are grammatically incorrect. But with word processing software being what it is these days, I usually am made aware of the error and can fix it before I send an email out and get totally embarrassed.&lt;br /&gt;&lt;br /&gt;However, it is not always the case that the spelling or grammar checker catches my mistakes.  Here are two recent whoppers that have served to make me a bit more conscientious.&lt;br /&gt;&lt;br /&gt;Email 1&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Ric: Do you know of any docs that talk to the use of Regular expressions in Oracle SQL other than the docs? &lt;br /&gt;&lt;br /&gt;Me: Jonathan Gennick wrote a small O'Reilly book on Regular Expressions.  I &lt;span style="font-weight:bold;"&gt;hate &lt;/span&gt;it and it does a good job.&lt;br /&gt;&lt;br /&gt;...Click Send and then look at what I just typed and realize "Oops!"...&lt;br /&gt;&lt;br /&gt;Me (again about 2 seconds later): That last response should have read "I &lt;span style="font-weight:bold;"&gt;haVe&lt;/span&gt; it and it does a good job", not "I haTe it".  :)&lt;br /&gt;&lt;br /&gt;Ric: Well that made me laugh this morning!! LOL!! &lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;OK...that wasn't too bad, but still!  What if I hadn't caught that and had sent it out to a large distribution?!?!?  Yeesh...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Email 2&lt;br /&gt;&lt;br /&gt;I had written a fairly lengthy response to explain something to a group of folks that had attended a meeting with me. After several paragraphs of explanation, I ended the email as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I hope this helps clear things up. Let me know if you need any further information.&lt;br /&gt;&lt;br /&gt;Retards,&lt;br /&gt;Karen&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A few minutes later I received this response:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Your detailed explanation was very helpful. However, I'd suggest you remember that the letters T and G are very close to each other on a keyboard.&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;It seriously took me a minute to get what he meant. But when I noticed the error, I was horrified! How embarrassing! I've now added an auto-signature option and will never end an email using the phrase "Regards" again.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4517555845068159703?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4517555845068159703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4517555845068159703' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4517555845068159703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4517555845068159703'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/typos.html' title='Typos'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3454502731564567431</id><published>2009-09-09T08:43:00.000-04:00</published><updated>2009-09-09T09:22:13.210-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle parallel query'/><title type='text'>Parallel Query question</title><content type='html'>I received a question in the comment section on an older post from Arun that I wanted to address directly. Here's his question: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I have one query regarding parallel execution. I have seen one of your post related to parallel execution of queries involving unions.&lt;br /&gt;&lt;br /&gt;My question is: If you have query something like this&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select appln_jrnl_id, sum(payment_count) &lt;br /&gt;from fihub.tbl_voucher_acct_line d&lt;br /&gt;where appln_jrnl_id = 'AP_PAYMENT'&lt;br /&gt;and fiscal_year_num = 2008&lt;br /&gt;and acct_period_cd = 5&lt;br /&gt;group by appln_jrnl_id&lt;br /&gt;union&lt;br /&gt;select 'AP_PAYMENT', sum(payment_count) from fihub.tbl_voucher_acct_line d&lt;br /&gt;where appln_jrnl_id = 'AP_PAYMENT'&lt;br /&gt;and fiscal_year_num = 2008&lt;br /&gt;and acct_period_cd = 5;&lt;/pre&gt;&lt;br /&gt;How you will make this query to work in parallel mode? Do you prefer me to include parallel hint in that Query? If so, union queries may have different tables lists in the from clauses right?&lt;br /&gt;&lt;br /&gt;Please throw some light on this!!&lt;br /&gt;&lt;br /&gt;-Arun&lt;/blockquote&gt;&lt;br /&gt;Well, first let me point you to &lt;a href="http://oracledoug.com/papers.html"&gt;Doug Burns site&lt;/a&gt; for access to great paper he wrote on tuning parallel execution. There's so much excellent info in that paper that I'll defer the in-depth coverage of the topic to him rather than try to review it here.&lt;br /&gt;&lt;br /&gt;However, I'll add a couple of things for you to think about.  &lt;br /&gt;&lt;br /&gt;First, why do you want to force the query to execute in parallel? If the optimizer isn't already choosing parallel operations for the execution plan, it must think it is unnecessary. Have you executed the query in both a serial and parallel manner and compared the results to prove which is better? From your question about using a hint to get parallel behavior, I'm thinking that you likely have not been able to get the query to run in parallel yet. So, if the optimizer doesn't choose to use parallel execution on it's own and you want to test the parallel version, the answer is yes, you can use a hint to attempt to force the optimizer towards parallel execution. At least as of v9.2 (and perhaps prior, but I'm not sure), Oracle supports parallel execution of UNION queries (and bunches of other stuff). So, as long as the proper instance parameters are set to allow parallel execution to occur, the optimizer should either choose a parallel plan (if it's "the best") or you can use the PARALLEL hint to force it.&lt;br /&gt;&lt;br /&gt;Second, I'm having a hard time understanding your query. The way it reads to me is that both sides of the UNION are giving you the same answer. Therefore, the final answer to the query would be 1 row like:  AP_PAYMENT    12345.  The answer to each query will be the same. Since the query is using UNION, the duplicate will be removed and you'll end up with just the one row. So, you could remove the UNION and just execute&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select 'AP_PAYMENT', sum(payment_count) &lt;br /&gt;from fihub.tbl_voucher_acct_line d&lt;br /&gt;where appln_jrnl_id = 'AP_PAYMENT'&lt;br /&gt;and fiscal_year_num = 2008&lt;br /&gt;and acct_period_cd = 5; &lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Unless &lt;/span&gt;you've got a boatload of data that matches your conditions and due to that the query runs for several seconds or minutes or more, it looks to me like the query should not need parallel execution. If you have a decent index in place, say on appln_jrnl_id, fiscal_year_num, acct_period_cd (and you could even throw in payment_count to keep you from having to do any table accesses at all), your query should execute quite well.&lt;br /&gt;&lt;br /&gt;But, as I see it, if you want to test this particular query for how it would perform using parallel execution, rewrite it as I discussed above and then, if needed, add a PARALLEL hint.  And do make sure to read through Doug's paper and also check out the links he provides at the end to other great resources on the topic.&lt;br /&gt;&lt;br /&gt;Hope that helps!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3454502731564567431?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3454502731564567431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3454502731564567431' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3454502731564567431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3454502731564567431'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/parallel-query-question.html' title='Parallel Query question'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3698277910135030906</id><published>2009-09-03T12:38:00.000-04:00</published><updated>2009-09-03T13:18:33.622-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><title type='text'>10 seconds - use 'em or lose 'em (lose your audience, I mean)</title><content type='html'>I just read a post by Geoffrey James entitled "&lt;a href="http://blogs.bnet.com/salesmachine/?p=5091"&gt;Presentation? You've got 10 seconds!&lt;/a&gt;" and this statement caught my attention: &lt;br /&gt;&lt;blockquote&gt;"When you’re presenting, you’ve got 10 seconds (more or less) to capture the attention of the decision-makers.  If you don’t… out come the Blackberries and the iPhones, and you can basically kiss the meeting goodbye. They won’t be listening."&lt;/blockquote&gt;&lt;br /&gt;10 seconds...really?  I've heard before that you've got between 3-7 minutes to grab your audience, but has it really gotten so bad as to drop to 10 seconds?  He says that the best way to grab your audience's attention in that short time span is to quote a statistic or something "credible and factual that surprises and (probably) frightens them a little bit."  &lt;br /&gt;&lt;br /&gt;I agree that you have to grab your audience from the outset. But, if we're now down to a 10 second time window, I fear we're all doomed. So, I'm not willing to buy in totally to that time estimate. What I'm willing to agree to is that you need to give your audience something worth listening to and deliver it in a way that enables them to hear the message clearly. It's about presentation skills as well as content. No matter how good your content is, it's just as much about the delivery. &lt;br /&gt;&lt;br /&gt;I also agree that today's technology allows us to exhibit &lt;a href="http://en.wikipedia.org/wiki/Attention-deficit_hyperactivity_disorder"&gt;ADHD&lt;/a&gt; behavior in a multitude of ways. From my iPhone, I can check email, send text messages, surf the web, &lt;a href="http://www.twitter.com"&gt;tweet&lt;/a&gt;, play games, read books, and so much more. If I'm sitting in your audience and you don't keep my attention, I can easily (and, for the most part, unobtrusively) find a way to entertain myself and ignore you. I don't have to get up and leave. I simply tune you out and give my attention to my friendly, and oh so fun, iPhone.&lt;br /&gt;&lt;br /&gt;As a presenter, I hate looking out and seeing the tops of people's heads as they stare down at their mobile devices (or worse yet, their laptops). Even if 99% of the audience is staring at me in rapt attention, the other 1% disturb me beyond measure. I do understand that when you are away from the office, you aren't free from responsibility. You may still have to respond to problems if/when they arise. But, if you've booked time in your schedule to attend a presentation or conference, would it be fair to ask the folks back at the office to expect some delay in your responses? How about establishing a "check in" schedule? Maybe every 1-2 hours or whatever time frame is reasonable for your situation. Then, instead of feeling like you have to look at and respond to every call, text or email, you can just silence your little electronic friend and pick it up after the presentation is over. If you end up getting bored with the presentation and don't feel like it's worth your time, get up and leave. Hmmm...now wouldn't that be a novel approach?&lt;br /&gt;&lt;br /&gt;In the end, I do think that a 10 second "grab 'em or lose 'em" time frame is too short. But, I think the time to capture and hold your audience's attention is short in proportion to the amount of time a person is willing to limit their access to every imaginable distraction that is available at their finger tips.&lt;br /&gt;&lt;br /&gt;Maybe in the end, it's not just the presenter's job to capture the audience's attention. Maybe it's also the job of the audience to limit the distractions they will allow themselves and to give the speaker their full attention. Like the old song says "it takes two baby, it takes two".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3698277910135030906?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3698277910135030906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3698277910135030906' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3698277910135030906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3698277910135030906'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/10-seconds-use-em-or-lose-em-lose-your.html' title='10 seconds - use &apos;em or lose &apos;em (lose your audience, I mean)'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2525800728197043921</id><published>2009-09-02T13:46:00.000-04:00</published><updated>2009-09-02T14:04:41.744-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle 11R2'/><category scheme='http://www.blogger.com/atom/ns#' term='listagg'/><title type='text'>11gR2 - LISTAGG</title><content type='html'>I was looking at the Oracle 11gR2 New Features guide and came across the new LISTAGG analytic function.  Oh boy, oh boy!  I've used &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2196162600402"&gt;Tom Kyte's stragg function&lt;/a&gt; for ages to do string concatenation of multiple row values.  I'm way happy that that function is now "built in".&lt;br /&gt;&lt;br /&gt;The syntax is:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;LISTAGG (measure_expression [, 'delimiter_expression'])&lt;br /&gt;WITHIN GROUP (order_by_clause) [OVER query_partition_clause]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here are two examples from the docs:&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SELECT LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name) "Emp_list",&lt;br /&gt;    MIN(hire_date) "Earliest"&lt;br /&gt;    FROM employees&lt;br /&gt;    WHERE department_id = 30;&lt;br /&gt;&lt;br /&gt;Emp_list                                                     Earliest&lt;br /&gt;------------------------------------------------------------ ---------&lt;br /&gt;Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares            07-DEC-02&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT department_id "Dept.",&lt;br /&gt;  LISTAGG(last_name, '; ')&lt;br /&gt;   WITHIN GROUP (ORDER BY hire_date) "Employees"&lt;br /&gt;   FROM employees&lt;br /&gt;   GROUP BY department_id;&lt;br /&gt;&lt;br /&gt;Dept. Employees&lt;br /&gt;------ ------------------------------------------------------------&lt;br /&gt;    10 Whalen&lt;br /&gt;    20 Hartstein; Fay&lt;br /&gt;    30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares&lt;br /&gt;    40 Mavris&lt;br /&gt;    50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davie&lt;br /&gt;       s; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot&lt;br /&gt;       ; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; Matos; Pat&lt;br /&gt;       el; Walsh; Feeney; Dellinger; McCain; Vargas; Gates; Rogers;&lt;br /&gt;        Mikkilineni; Landry; Cabrio; Jones; Olson; OConnell; Sulliv&lt;br /&gt;       an; Mourgos; Gee; Perkins; Grant; Geoni; Philtanker; Markle&lt;br /&gt;    60 Austin; Pataballa; Lorentz; Ernst; Hunold&lt;br /&gt;    70 Baer&lt;br /&gt;... &lt;/pre&gt;&lt;br /&gt;After I read it in the NF guide, I Googled and found lots more folks talking about it.  &lt;br /&gt;&lt;br /&gt;Cool stuff!  No telling what else I'll find...better keep reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2525800728197043921?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2525800728197043921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2525800728197043921' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2525800728197043921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2525800728197043921'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/09/11gr2-listagg.html' title='11gR2 - LISTAGG'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-962615490994469048</id><published>2009-08-30T13:55:00.000-04:00</published><updated>2009-08-30T14:13:29.294-04:00</updated><title type='text'>The Power of the Pause</title><content type='html'>I was just reading an article in O Magazine entitled "The O Power List" and I read something that I thought was excellent.  In this article, 20 women from many different disciplines are recognized for their contributions in everything from business to the arts.  One of these women is 73 year old Pema Chödrön, a former elementary school teacher who was the first American woman to be ordained in the Tibetan tradition.  The portion of the article about her is entitled "&lt;a href="http://www.oprah.com/slideshow/omagazine/200909-omag-power-list/6"&gt;The Power of the Pause&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;You can read the full text if you follow the link to the article, but this portion really touched something in me:&lt;br /&gt;&lt;blockquote&gt;"In the next moment, in the next hour, we could choose to stop, to slow down, to be still for a few seconds. We could experiment with interrupting the usual chain reaction, and not spin off in the usual way. We don't need to blame someone else, and we don't need to blame ourselves.&lt;br /&gt;&lt;br /&gt;Pausing is very helpful in this process. It creates a momentary contrast between being completely self-absorbed and being awake and present. You just stop for a few seconds, breathe deeply, and move on."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That truly is a powerful touchstone for me.  It's so easy to react and lash out in the old, usual ways when I feel wronged or misunderstood or under-appreciated or whatever.  I think it's true that it's easy to seek to place blame somewhere, whether it's on another individual or on myself.  &lt;br /&gt;&lt;br /&gt;But, what would happen if we all just paused?  What if we did short circuit our ingrained behavior to react?  I think to do so would mean a truly powerful transformation would occur in the relationships we have (both personally and professionally).&lt;br /&gt;&lt;br /&gt;I will strive to integrate &lt;span style="font-style:italic;"&gt;the power of the pause&lt;/span&gt; in my daily life. A few deep breaths each day are bound to be good for me (and for those around me too)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-962615490994469048?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/962615490994469048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=962615490994469048' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/962615490994469048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/962615490994469048'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/08/power-of-pause.html' title='The Power of the Pause'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5096996596751879871</id><published>2009-08-26T18:34:00.000-04:00</published><updated>2009-08-26T19:00:37.795-04:00</updated><title type='text'>A long road to hoe...</title><content type='html'>That's what it's been...a long road.  While mid-April isn't really that far in the past as far as calendar time, it seems like an eternity.  I've once again been remiss in my blogging...oh well.  Perhaps if I give you the "short version" of my long road, you'll forgive me for my neglect.&lt;br /&gt;&lt;br /&gt;April 22 - I was officially laid off from my position at Method R.  It sucked, but it was a necessity for the company.  I get it, but it sucked.&lt;br /&gt;&lt;br /&gt;Panic stricken and thinking I would soon be bankrupt and on the streets, I began to look for new work.  The good folks at my old employer, Hotsos, were able to provide me with 5 weeks of sub-contract work that got me through till almost the end of June.  Whew!  &lt;br /&gt;&lt;br /&gt;I applied for a gazillion jobs between April and July but only one opportunity really looked promising.  Around the first of July, I got a formal offer from &lt;a href="http://www.agilex.com"&gt;Agilex Technologies&lt;/a&gt; based in Chantilly, Virginia.  I accepted.  But, the offer was contingent on me passing a government security clearance and also on the client I would be working for approving the funding.  So, I had to decide if I should take the risk that everything would work out and go ahead and move (all the way from Oregon to Virginia) in anticipation of everything falling into place, or if I should just stay put and wait and see.&lt;br /&gt;&lt;br /&gt;Well, I'm not very good at wait and see.  And, since I don't have a checkered past (polka-dot maybe, but not checkered) and figured I'd pass the clearance, I decided to assume the risk and move.  Now moving 3000 miles across country is not fun.  The last week of July, everything got packed up and big burly boys were hired to load our U-Haul.  My brother flew out from TN and he and I drove across country (in under 5 days!) with a 27 foot truck and my family mini-van.  At the end of that road were more burly boys waiting to unload the U-Haul.  It was a whirlwind and quite tiring, but it's over and Virginia is now home sweet home.&lt;br /&gt;&lt;br /&gt;One of the 2 best pieces of news I needed to have came while I was somewhere in Nebraska.  My job offer was finalized (as funding and limited security clearance was approved) and a start date of August 24 was set.  The other piece of good news happened 4 days after arriving in Virginia.  That news was that my house in Oregon had sold!  &lt;br /&gt;&lt;br /&gt;R-E-L-I-E-F!  &lt;br /&gt;&lt;br /&gt;So, here I am just a few short weeks later and I've been on the job at Agilex for 3 whole days.  So far I'm just getting my feet wet and doing a lot of reading about the project I'll be working on.  This new job means that my travel days are over.  I will get to do what I love (Oracle performance optimization, particularly on the application side) and pile on a broader range of other stuff as well.    But, I will be home every night and will get up every morning and go to work at the same place.  After all these years of being on the road, that sounds pretty darn great to me!  My 2-year old daughter confirmed that the job decision was the right thing when I walked in the door after my first day.  She said "You came back Momma!  You came back!  I love you Momma!"  and "Did you have a good day at your new office?"    'Nuff said!&lt;br /&gt;&lt;br /&gt;I'm looking forward to new challenges and a new day-to-day routine.  I'm also looking forward to having many new adventures to blog about.  As soon as I catch my breath and settle in, I'll be back in the saddle.  Until then, thanks for hanging with me and wish me luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5096996596751879871?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5096996596751879871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5096996596751879871' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5096996596751879871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5096996596751879871'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/08/long-road-to-hoe.html' title='A long road to hoe...'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4812041532656202322</id><published>2009-08-16T18:37:00.000-04:00</published><updated>2009-08-16T18:49:59.153-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NoCOUG interview'/><title type='text'>Quoted</title><content type='html'>Iggy Fernandez, editor of the NoCOUG Journal, blogs at &lt;a href="http://iggyfernandez.wordpress.com"&gt;http://iggyfernandez.wordpress.com&lt;/a&gt; and has republished an interview with me from several months ago that was originally published in the Journal.  If you're interested, you can read the &lt;a href="http://iggyfernandez.wordpress.com/2009/08/16/fresh-perspectives-an-interview-with-karen-morton/"&gt;full interview&lt;/a&gt; or a small excerpt of the interview with a &lt;a href="http://iggyfernandez.wordpress.com/2009/08/15/where-have-all-the-jobs-gone-part-ii/"&gt;question on out-sourcing&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4812041532656202322?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4812041532656202322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4812041532656202322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4812041532656202322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4812041532656202322'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/08/quoted.html' title='Quoted'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7274094525181513533</id><published>2009-08-09T13:02:00.000-04:00</published><updated>2009-08-09T13:04:10.107-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OOW2009'/><title type='text'>See you at Oracle OpenWorld</title><content type='html'>I'm looking forward to attending Oracle OpenWorld in October.  Here's my session info:&lt;br /&gt;&lt;br /&gt;ID#: S307360&lt;br /&gt;Title: Managing Statistics for Optimal Query Performance&lt;br /&gt;Track: Database&lt;br /&gt;Date: 13-OCT-09&lt;br /&gt;Time: 13:00 - 14:00&lt;br /&gt;Venue: Moscone South&lt;br /&gt;Room: Room 236 &lt;br /&gt;&lt;br /&gt;I hope to see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7274094525181513533?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7274094525181513533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7274094525181513533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7274094525181513533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7274094525181513533'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/08/see-you-at-oracle-openworld.html' title='See you at Oracle OpenWorld'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-617590301332855871</id><published>2009-07-14T12:41:00.000-04:00</published><updated>2009-07-14T13:55:18.298-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>What you say isn't "exactly" what you mean</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/Sly1fFx0j8I/AAAAAAAAAKs/GpdrZG2gZOI/s1600-h/cake.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/Sly1fFx0j8I/AAAAAAAAAKs/GpdrZG2gZOI/s400/cake.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5358357202395762626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is real.  This cake was picked up after a call in order was made to a bakery to order a cake for a going away party (changing jobs).  But, what the heck is "Under Neat That"?&lt;br /&gt;&lt;br /&gt;OK, so this is how I imagine this conversation went:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Bakery Employee:   'Hello, how can I help you?'&lt;br /&gt;&lt;br /&gt;Customer: ' I would like to order a cake for a going away party this week.'&lt;br /&gt;&lt;br /&gt;Bakery Employee:  'What do you want on the cake?' &lt;br /&gt;&lt;br /&gt;Customer: 'Best Wishes Suzanne' and underneath that 'We will miss you'.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You just have to laugh!&lt;br /&gt;&lt;br /&gt;(By the way...a friend sent this to me so it may or may not be "real", but the thought is funny anyway!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-617590301332855871?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/617590301332855871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=617590301332855871' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/617590301332855871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/617590301332855871'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/07/what-you-say-isnt-exactly-what-you-mean.html' title='What you say isn&apos;t &quot;exactly&quot; what you mean'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/Sly1fFx0j8I/AAAAAAAAAKs/GpdrZG2gZOI/s72-c/cake.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5134952625920238361</id><published>2009-06-18T11:55:00.000-04:00</published><updated>2009-06-18T13:23:20.917-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='index use'/><category scheme='http://www.blogger.com/atom/ns#' term='sql tuning'/><title type='text'>You don't really need that index (or that SQL)</title><content type='html'>I was given this simple looking piece of code to review.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;&lt;br /&gt;select audit_rec_updt_dts, mod(rownm,4) as rownm, pol_seq_nbr &lt;br /&gt;from&lt;br /&gt; (select  a.AUDIT_REC_UPDT_DTS, a.POL_SEQ_NBR, rownum as rownm  &lt;br /&gt; from TR_POLICY_REGISTER a, TB_TRANSACTION b&lt;br /&gt; where a.POL_STAT_CD = 'REPORTED' and a.JACKET_SOURCE_CD = 'LAT'and&lt;br /&gt;  a.AUDIT_REC_UPDT_DTS &gt; b.EXTRACT_START_DTS and&lt;br /&gt;  a.AUDIT_REC_UPDT_DTS &lt; b.EXTRACT_END_DTS  and&lt;br /&gt;  b.TRANS_SYS_ID in (select max(trans_sys_id) from tb_transaction)) dt&lt;br /&gt;where mod(rownm,4) = 0;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I was also given 3 other almost identical statements except that the where clause changed the 0 to 1, 2, and 3.  Danger Will Robinson!  (Yes, that reference dates me.  How about you?  Remember "Lost in Space"?)  It looks like somebody is thinking the result set is so big they need to break it up into chunks.  More on this later...&lt;br /&gt;&lt;br /&gt;Anyway, in order to get the query to complete in a reasonable time (my test without the index didn't come back within 30 minutes so I killed it), a "temporary" index was being created just before this statement was executed.  By "temporary", I mean that they created the index just prior to running the SQL and then dropped it immediately after the SQL completed.  Creating the index (parallel nologging) took several minutes to complete.&lt;br /&gt;&lt;br /&gt;Here's execution plan for the query with the index in place:&lt;pre name="code" class="sql"&gt;&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                       | Name                      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |&lt;br /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;|*  1 |  VIEW                           |                           |      1 |    995 |   2627 |00:00:00.11 |    9815 |&lt;br /&gt;|   2 |   COUNT                         |                           |      1 |        |  10508 |00:00:00.08 |    9815 |&lt;br /&gt;|   3 |    NESTED LOOPS                 |                           |      1 |    995 |  10508 |00:00:00.07 |    9815 |&lt;br /&gt;|   4 |     TABLE ACCESS BY INDEX ROWID | TB_TRANSACTION            |      1 |      1 |      1 |00:00:00.01 |       3 |&lt;br /&gt;|*  5 |      INDEX UNIQUE SCAN          | TB_TRANSACTION_PK         |      1 |      1 |      1 |00:00:00.01 |       2 |&lt;br /&gt;|   6 |       SORT AGGREGATE            |                           |      1 |      1 |      1 |00:00:00.01 |       1 |&lt;br /&gt;|   7 |        INDEX FULL SCAN (MIN/MAX)| TB_TRANSACTION_PK         |      1 |    289 |      1 |00:00:00.01 |       1 |&lt;br /&gt;|   8 |     TABLE ACCESS BY INDEX ROWID | TR_POLICY_REGISTER        |      1 |    995 |  10508 |00:00:00.07 |    9812 |&lt;br /&gt;|*  9 |      INDEX RANGE SCAN           | TR_POLICY_REGISTER_DMIDX1 |      1 |      2 |  10508 |00:00:00.01 |      73 |&lt;br /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   1 - filter(MOD("ROWNM",4)=0)&lt;br /&gt;   5 - access("B"."TRANS_SYS_ID"=)&lt;br /&gt;   9 - access("A"."JACKET_SOURCE_CD"='LAT' AND "A"."POL_STAT_CD"='REPORTED' AND&lt;br /&gt;              "A"."SYS_NC00029$"&gt;SYS_OP_DESCEND("B"."EXTRACT_END_DTS") AND&lt;br /&gt;              "A"."SYS_NC00029$"&lt;SYS_OP_DESCEND("B"."EXTRACT_START_DTS"))&lt;br /&gt;       filter((SYS_OP_UNDESCEND("A"."SYS_NC00029$")&gt;"B"."EXTRACT_START_DTS" AND&lt;br /&gt;              SYS_OP_UNDESCEND("A"."SYS_NC00029$")&lt;"B"."EXTRACT_END_DTS"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Looks good, right?  The query executed in less than 1 second (.11 secs) and returned 2627 rows.  Remember the predicate?  There were 4 queries.  Each one retrieved 1/4 of the data (2627 x 4 = 10508).  That's a pretty small result set.  Why run the query 4 times when once will do?  And, it's not doing what the developer thought.  I think the developer thought it would only access 1/4 of the rows each time and that somehow that would be faster than accessing all of them at once.  Nope.  Even though running this query 4 times in a row is still a fairly insignificant amount of resources used, it's not necessary.  Each execution is getting all the rows and then throwing out 75% of them.  Why not just run it once?  &lt;br /&gt;&lt;br /&gt;The next question is why is an index created just before and dropped just after this?  Does having it be permanent cause a problem somewhere?  Plus, there's already a persistent index that would/should work although it does not include all the columns used in the temp index.  But, obviously something went wrong with the query that it didn't use that index properly or they wouldn't have created the temp index and attempted to break up the query into 4 parts, right?&lt;br /&gt;&lt;br /&gt;OK.  So, how about just rewriting the query to see if the current index can be used efficiently enough to meet their needs?  I tried this:&lt;pre name="code" class="sql"&gt;&lt;br /&gt;&lt;br /&gt;select  a.AUDIT_REC_UPDT_DTS, a.POL_SEQ_NBR&lt;br /&gt; from TR_POLICY_REGISTER a&lt;br /&gt;where a.POL_STAT_CD = 'REPORTED'&lt;br /&gt;  and a.JACKET_SOURCE_CD = 'LAT'&lt;br /&gt;  and a.AUDIT_REC_UPDT_DTS &gt; (select EXTRACT_START_DTS from tb_transaction where  trans_sys_id = (select max(trans_sys_id) from tb_transaction))&lt;br /&gt;  and a.AUDIT_REC_UPDT_DTS &lt; (select EXTRACT_END_DTS from tb_transaction where  trans_sys_id = (select max(trans_sys_id) from tb_transaction))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And here's the execution plan:&lt;pre name="code" class="sql"&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      | Name                  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |&lt;br /&gt;------------------------------------------------------------------------------------------------------------------&lt;br /&gt;|*  1 |  TABLE ACCESS BY INDEX ROWID   | TR_POLICY_REGISTER    |      1 |    995 |  10508 |00:00:00.07 |   14259 |&lt;br /&gt;|*  2 |   INDEX RANGE SCAN             | TR_POLICY_REGISTER_N6 |      1 |    269K|  23576 |00:00:00.01 |     138 |&lt;br /&gt;|   3 |    TABLE ACCESS BY INDEX ROWID | TB_TRANSACTION        |      1 |      1 |      1 |00:00:00.01 |       3 |&lt;br /&gt;|*  4 |     INDEX UNIQUE SCAN          | TB_TRANSACTION_PK     |      1 |      1 |      1 |00:00:00.01 |       2 |&lt;br /&gt;|   5 |      SORT AGGREGATE            |                       |      1 |      1 |      1 |00:00:00.01 |       1 |&lt;br /&gt;|   6 |       INDEX FULL SCAN (MIN/MAX)| TB_TRANSACTION_PK     |      1 |    289 |      1 |00:00:00.01 |       1 |&lt;br /&gt;|   7 |    TABLE ACCESS BY INDEX ROWID | TB_TRANSACTION        |      1 |      1 |      1 |00:00:00.01 |       3 |&lt;br /&gt;|*  8 |     INDEX UNIQUE SCAN          | TB_TRANSACTION_PK     |      1 |      1 |      1 |00:00:00.01 |       2 |&lt;br /&gt;|   9 |      SORT AGGREGATE            |                       |      1 |      1 |      1 |00:00:00.01 |       1 |&lt;br /&gt;|  10 |       INDEX FULL SCAN (MIN/MAX)| TB_TRANSACTION_PK     |      1 |    289 |      1 |00:00:00.01 |       1 |&lt;br /&gt;------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   1 - filter(("A"."JACKET_SOURCE_CD"='LAT' AND "A"."POL_STAT_CD"='REPORTED'))&lt;br /&gt;   2 - access("A"."AUDIT_REC_UPDT_DTS"&gt; AND "A"."AUDIT_REC_UPDT_DTS"&lt;)&lt;br /&gt;   4 - access("TRANS_SYS_ID"=)&lt;br /&gt;   8 - access("TRANS_SYS_ID"=)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I can live with that.  &lt;br /&gt;&lt;br /&gt;It took me a lot longer to type this than to rewrite the SQL and test it!  Now, the query doesn't need to be "chunked up" nor does the index need to be temporarily created.  Maybe there's another way to do it but this was my first thought and it worked as desired, so all is well!&lt;br /&gt;&lt;br /&gt;Good deal...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5134952625920238361?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5134952625920238361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5134952625920238361' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5134952625920238361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5134952625920238361'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/06/you-dont-really-need-that-index-or-that.html' title='You don&apos;t really need that index (or that SQL)'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-73747542227852512</id><published>2009-06-08T18:23:00.001-04:00</published><updated>2009-06-08T18:23:05.799-04:00</updated><title type='text'>Photo of my favorite kid...mine!</title><content type='html'>&lt;a href='http://posterous.com/getfile/files.posterous.com/karenmorton/BWPwWbWQB9zzvG95Spb2982SR4gY4L6p5EMjcgPtzmTcKit97a9vqjl3EwN3/kylie-lip.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/karenmorton/LYRVs7ZvEHP9UssKN0gt4uU53JodeZ0Y1utAkY9KVuKRfQ2jSvMOV4kMSxHM/kylie-lip.jpg.scaled.500.jpg" width="500" height="667"/&gt;&lt;/a&gt; &lt;p&gt;She fell and busted her upper lip yesterday but seems to be none to worse for the wear.  Nothing like a ride in the car while watching a DVD and eating Teddy Grahams!  &lt;/p&gt;&lt;p style="font-size: 10px;"&gt;  &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;   from &lt;a href="http://karenmorton.posterous.com/photo-of-my-favorite-kidmine"&gt;Karen Morton's posterous&lt;/a&gt;  &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-73747542227852512?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/73747542227852512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=73747542227852512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/73747542227852512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/73747542227852512'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/06/photo-of-my-favorite-kidmine.html' title='Photo of my favorite kid...mine!'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7175461025698306848</id><published>2009-05-27T22:04:00.001-04:00</published><updated>2009-05-27T22:35:47.761-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bug free code'/><category scheme='http://www.blogger.com/atom/ns#' term='right stuff'/><title type='text'>The Right Stuff</title><content type='html'>Now this is seriously cool.  I was sent a link to an article called "&lt;a href="http://www.fastcompany.com/magazine/06/writestuff.html"&gt;They Write the Right Stuff&lt;/a&gt;."  It's about the software that powers the US space program and the team of developers that write it.  Here's a paragraph from the article:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;But how much work the software does is not what makes it remarkable. What makes it remarkable is how well the software works. This software never crashes. It never needs to be re-booted. This software is bug-free. It is perfect, as perfect as human beings have achieved. Consider these stats : the last three versions of the program -- each 420,000 lines long-had just one error each. The last 11 versions of this software had a total of 17 errors. Commercial programs of equivalent complexity would have 5,000 errors.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The article goes on to discuss what the team does to ensure the software is this good and why it's so absolutely critical that it is flawless.  The answer to "why" is fairly obvious.  Think of a multi-ton spacecraft lifting off and shooting into space.  Think of a spacecraft moving at 17,500 miles per hour and needing to adjust course precisely to hit a re-entry point.  Think of the crew sitting inside.  Wow!  It gives you a whole new perspective on what it could mean if you have bugs in your code.&lt;br /&gt;&lt;br /&gt;I agree with the article that software development seems to be in the "cave man" phase of evolution.  I see a lot (and I mean a lot) of buggy code and bad SQL.  And the prevailing attitude is usually "log a defect...we'll prioritize it and get it fixed when we can".  What if the code that controls the space shuttle was treated that way?  &lt;br /&gt;&lt;br /&gt;I get it that having bugs in the software that runs our businesses doesn't mean life or death.  I also understand that often the speed with which new features in software are delivered is more critical than delivering that feature "bug free" or, for that matter, delivering it knowing it will perform well!  But knowing that the ability to create code of this quality is possible makes me wish (even more so than I already do) that the software development process was approached with greater care by everyone.  Not just by the developers of code that must be bug free or people could die.  &lt;br /&gt;&lt;br /&gt;What if the code you wrote would mean someone died if it had a bug?  What would you do differently?  While I know it may be a poor analogy, this makes me think of the "2 minute offense" in football.  The team has been playing poorly until the last 2 minutes of the game.  Then, they go into this hurry up offense and really push themselves to score.  My question has always been why don't they just play all out the rest of the game?&lt;br /&gt;&lt;br /&gt;It seems to me to be similar to how software development is approached.  The job gets done, often not very well, but everybody goes into 2 minute mode when the code goes into production and people start screaming about bugs and performance.  If the screams are loud enough, things get fixed.  It just seems that it could be done so much better to start with.&lt;br /&gt;&lt;br /&gt;I understand the arguments for why it doesn't happen "the right way" first.  But after reading this article, it makes me marvel at how cool it would be to be part of a team that looks at their code as being something that MUST NOT have bugs...ever.  And, they create the processes that support achieving &lt;span style="font-style:italic;"&gt;perfect&lt;/span&gt; code.  I'd think those folks really like what they do and take great pride in what they develop knowing that their diligence and good work keep people alive and keep our space program running.&lt;br /&gt;&lt;br /&gt;Cool.  Very, very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7175461025698306848?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7175461025698306848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7175461025698306848' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7175461025698306848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7175461025698306848'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/05/right-stuff.html' title='The Right Stuff'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-9089723107104320778</id><published>2009-05-16T22:04:00.001-04:00</published><updated>2009-05-16T22:46:16.898-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bad SQL'/><title type='text'>Once again:  why guess when you can know?</title><content type='html'>I recently was asked to review a bit of SQL that was performing poorly.  By poorly I mean that a single execution of the query may take hours to complete (that's pretty poor).  The SQL was quite simple:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;&lt;br /&gt;SELECT ph.cust_bus_nm&lt;br /&gt;     , ph.clup_fmt1&lt;br /&gt;     , ph.batch_period_month_yr_dt&lt;br /&gt;     , ph.batch_sys_id&lt;br /&gt;     , ph.our_prem_amt&lt;br /&gt;     , ph.liab_amt&lt;br /&gt;     , ph.code&lt;br /&gt;     , ph.pol_effect_dt&lt;br /&gt;     , ph.pol_nbr&lt;br /&gt;     , ph.agent_prem_amt&lt;br /&gt;     , ph.uw_sys_id&lt;br /&gt;     , ph.cost_cntr_sys_id&lt;br /&gt;     , ph.state_cd&lt;br /&gt;     , ph.loc_rep_sys_id&lt;br /&gt;     , ph.cust_sys_id&lt;br /&gt;     , ph.clup_sys_id&lt;br /&gt;     , ph.item_type&lt;br /&gt;     , NVL(ph.pol_type_cd, p.pol_type_cd) AS pol_type_cd&lt;br /&gt;     , ph.acct_period_month_yr_dt&lt;br /&gt;     , ph.hist_rev_ind&lt;br /&gt;     , ph.validation_dts&lt;br /&gt;  FROM tr_pol_h_endr_h_v ph &lt;br /&gt;             INNER JOIN tr_policy p ON ph.pol_sys_id = p.pol_sys_id&lt;br /&gt; WHERE ph.liab_amt &gt;= 2500000&lt;br /&gt;   AND TRUNC(ph.acct_period_month_yr_dt) BETWEEN TO_DATE ('200902', 'YYYYMM') AND TO_DATE ('200902', 'YYYYMM')                                    &lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.uw_sys_id&lt;br /&gt;             , 0) = ph.uw_sys_id&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.cost_cntr_sys_id&lt;br /&gt;             , 0) = ph.cost_cntr_sys_id&lt;br /&gt;   AND DECODE ('ALL'&lt;br /&gt;             , 'ALL', ph.state_cd&lt;br /&gt;             , 'ALL') = ph.state_cd&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, NVL (ph.loc_rep_sys_id, 0)&lt;br /&gt;             , 0) = NVL (ph.loc_rep_sys_id, 0)&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.cust_sys_id&lt;br /&gt;             , 0) = ph.cust_sys_id&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.clup_sys_id&lt;br /&gt;             , 0) = ph.clup_sys_id&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note that the DECODEs look a bit odd but are there to accommodate how Crystal Reports has to handle (or doesn't handle well) variables.  That wasn't really part of the problem.&lt;br /&gt;&lt;br /&gt;The query used a view (tr_pol_h_endr_h_v) so I started by reviewing the view source.  In the view source I found a few things that were suspect.&lt;br /&gt;1)  The view source included a join between tr_policy_history (alias pol_hist) and  tr_policy (note that these tables are both 70 million+ rows each and are growing in size).  This is the table being joined to the view in the offending SQL.  As a matter of fact, the view source join was identical to the join in the SQL (INNER JOIN tr_policy p ON (pol_hist.pol_sys_id = p.pol_sys_id).&lt;br /&gt;2)  The view source defined the acct_period_month_yr_dt column as TRUNC(pol_hist.acct_period_month_yr_dt).  There was a function-based index on TRUNC(pol_hist.acct_period_month_yr_dt).&lt;br /&gt;3)  The execution plan indicated a full scan using a filter on acct_period_month_yr_dt was occurring on the pol_hist table even though the FBI was in place.&lt;br /&gt;&lt;br /&gt;Here's where I question whether this was an oversight or just a lack of understanding.  &lt;br /&gt;&lt;br /&gt;First, since the view source accesses the tr_policy table, why not perform the NVL check on pol_hist.pol_type_cd in the view source?  Why join back to tr_policy again in the SQL that uses the view to make the NVL check?  &lt;br /&gt;&lt;br /&gt;Next, the view source uses TRUNC(pol_hist.acct_period_month_yr_dt) to create the column acct_period_month_yr_dt.  But, in the SQL statement, the coder used TRUNC again.  Why?  By using it again, the effect is like writing TRUNC(TRUNC(acct_period_month_yr_dt).  Since the function-based index is based on the expression using a single TRUNC() function, the index is ignored for use since the expressions don't match.&lt;br /&gt;&lt;br /&gt;So, what to do?&lt;br /&gt;&lt;br /&gt;Change the view source to execute NVL(pol_hist.pol_type_cd, p.pol_type_cd) AS pol_type_cd.  Then, change the SQL as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;&lt;br /&gt;SELECT ph.cust_bus_nm&lt;br /&gt;     , ph.clup_fmt1&lt;br /&gt;     , ph.batch_period_month_yr_dt&lt;br /&gt;     , ph.batch_sys_id&lt;br /&gt;     , ph.our_prem_amt&lt;br /&gt;     , ph.liab_amt&lt;br /&gt;     , ph.code&lt;br /&gt;     , ph.pol_effect_dt&lt;br /&gt;     , ph.pol_nbr&lt;br /&gt;     , ph.agent_prem_amt&lt;br /&gt;     , ph.uw_sys_id&lt;br /&gt;     , ph.cost_cntr_sys_id&lt;br /&gt;     , ph.state_cd&lt;br /&gt;     , ph.loc_rep_sys_id&lt;br /&gt;     , ph.cust_sys_id&lt;br /&gt;     , ph.clup_sys_id&lt;br /&gt;     , ph.item_type&lt;br /&gt;     , ph.pol_type_cd&lt;br /&gt;     , ph.acct_period_month_yr_dt&lt;br /&gt;     , ph.hist_rev_ind&lt;br /&gt;     , ph.validation_dts&lt;br /&gt;  FROM tr_pol_h_endr_h_v ph &lt;br /&gt; WHERE ph.liab_amt &gt;= 2500000&lt;br /&gt;   AND ph.acct_period_month_yr_dt BETWEEN TO_DATE ('200902', 'YYYYMM') AND TO_DATE ('200902', 'YYYYMM')                                    &lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.uw_sys_id&lt;br /&gt;             , 0) = ph.uw_sys_id&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.cost_cntr_sys_id&lt;br /&gt;             , 0) = ph.cost_cntr_sys_id&lt;br /&gt;   AND DECODE ('ALL'&lt;br /&gt;             , 'ALL', ph.state_cd&lt;br /&gt;             , 'ALL') = ph.state_cd&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, NVL (ph.loc_rep_sys_id, 0)&lt;br /&gt;             , 0) = NVL (ph.loc_rep_sys_id, 0)&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.cust_sys_id&lt;br /&gt;             , 0) = ph.cust_sys_id&lt;br /&gt;   AND DECODE (0&lt;br /&gt;             , 0, ph.clup_sys_id&lt;br /&gt;             , 0) = ph.clup_sys_id&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I also added the liab_amt column to the FBI so that both conditions could be satisfied/matched in the index to eliminate a TABLE ACCESS to filter on liab_amt.&lt;br /&gt;&lt;br /&gt;The result was execution times that fell into the 4-6 second range.  From hours to seconds.  Not bad.&lt;br /&gt;&lt;br /&gt;But, I really wonder how something so simple was overlooked for so long.  Apparently, this query had been on the top of the "bad SQL" list for ages and multiple attempts had been made to optimize it.  But, within just a few minutes, I noted the issues and was able to recommend the fix.  I don't think the fix was that hard but it seemed to be a stumper for some time.  Why?&lt;br /&gt;&lt;br /&gt;I think it may have been both a bit of oversight and a bit of lack of understanding.  The oversight was in accessing a table (tr_policy) twice.  Mantra =&gt; Never do anything more than absolutely necessary.  &lt;br /&gt;&lt;br /&gt;It &lt;span style="font-style:italic;"&gt;may&lt;/span&gt; have also been oversight that the FBI wasn't getting used.  But for that one, I'm going to point the finger at lack of understanding.  The expression in the index definition must match the expression in the SQL.  I don't think the coder realized that when the view source used TRUNC, that was all that was needed.  And, I think that the reason nobody caught it was that nobody was looking at an actual execution plan for the query.  They may have either only been looking at an explain plan (which may have shown an index use???) or they didn't look at a plan at all and just assumed the index was in use (this is what I think is most likely).&lt;br /&gt;&lt;br /&gt;So, the moral of the story once again is:  why guess when you can know?  I haven't included the tests I conducted here for the sake of brevity (well OK... this post is not short, but it could've been a lot longer!), but with the test data and actual execution plan information in front of me, this one seemed quite easy.  Guessing at the problem and possible solutions had allowed an easy fix to be overlooked for months.  With good data, the problem was quite obvious and the solution easy to implement.&lt;br /&gt;&lt;br /&gt;Repeat after me:  why guess when you can know?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-9089723107104320778?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/9089723107104320778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=9089723107104320778' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9089723107104320778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9089723107104320778'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/05/once-again-why-guess-when-you-can-know.html' title='Once again:  why guess when you can know?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4167812505283566867</id><published>2009-05-08T10:44:00.000-04:00</published><updated>2009-05-08T10:47:16.642-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Wizard</title><content type='html'>I love magic tricks and have even recently included a couple of card tricks in my "Managing Statistics" presentation.  So, as I walked around Downtown Disney yesterday, I found this hat and couldn't resist trying it on!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SgRFofnjATI/AAAAAAAAAKk/asAq6VrpmOU/s1600-h/wizard-karen.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SgRFofnjATI/AAAAAAAAAKk/asAq6VrpmOU/s400/wizard-karen.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5333464420697964850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I may still go back and buy it...and maybe a wand too!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4167812505283566867?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4167812505283566867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4167812505283566867' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4167812505283566867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4167812505283566867'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/05/wizard.html' title='Wizard'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SgRFofnjATI/AAAAAAAAAKk/asAq6VrpmOU/s72-c/wizard-karen.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-9006598042146869631</id><published>2009-05-06T17:39:00.000-04:00</published><updated>2009-05-06T17:52:03.437-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Strange road sign</title><content type='html'>I flew into the Sanford airport in Orlando this week for the Collaborate conference.  It's about 20 miles from the main Orlando airport.  As I drove to my hotel, I passed a road sign unlike any I've ever seen before.  It was located just before I crossed a bridge and it read:  &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SgIFxxWrPqI/AAAAAAAAAKc/afOwC4VWMgs/s1600-h/sign.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 273px; height: 286px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SgIFxxWrPqI/AAAAAAAAAKc/afOwC4VWMgs/s400/sign.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5332831261380263586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had visions of hoards of mosquitos or killer bees attacking my moving vehicle so I made sure the windows were rolled up tight, turned the vent to recirculate and sped up until I felt I would be out of the danger zone.&lt;br /&gt;&lt;br /&gt;Only in Florida....   :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-9006598042146869631?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/9006598042146869631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=9006598042146869631' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9006598042146869631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9006598042146869631'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/05/strange-road-sign.html' title='Strange road sign'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SgIFxxWrPqI/AAAAAAAAAKc/afOwC4VWMgs/s72-c/sign.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3591769608872562215</id><published>2009-04-23T21:36:00.000-04:00</published><updated>2009-04-23T21:56:32.832-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='advice'/><title type='text'>Things are usually never as bad as they seem at first</title><content type='html'>Have you ever just had one of those weeks?  Well, what started out about a week ago as what I thought was the end of the world is looking pretty bright now.&lt;br /&gt;&lt;br /&gt;Anyway, all my personal drama of the past week made me think of a time about 3 years ago when I had my wisdom teeth removed.  I had it done in my dentist's office with local anesthetic and a good dose of "I don't care about anything" drugs.  Afterward, I thought I was going to die from the swelling and pain.  So, I basically crashed and had to be woken up every so often to change the ice (uh...bags of frozen veggies) that I used to keep me iced down to prevent swelling.  [By the way, if you ever need ice for an injury, and haven't tried it, bags of frozen vegetables, particularly corn and peas, are fantastic for that purpose.]  Anyway, at one point my sweet caretaker put a bag of blueberries on me as we’d run out of other veggies.  While I slept, the juice leaked out all over the towel we had wrapped around my head.  When the next wake up time came and she saw it, she thought I’d been bleeding profusely and we both about had a panic attack!  &lt;br /&gt;&lt;br /&gt;It didn't take long to figure out it was just blueberry juice, but the point is that it sure looked like I was in bad shape initially.  In the end, it turned out fine.  In that case, we switched back to frozen corn and I eventually stopped swelling and hurting and got over the ordeal pretty quickly.&lt;br /&gt;&lt;br /&gt;Winston Churchill once said, "If you're going through hell, keep going."  Even if your experience doesn't necessarily qualify as hell, I think it's good advice.  It's sometimes hard to remember when you're in the midst of a stretch of bumpy road, but I was reminded this past week that a bumpy road doesn't last long and there are turn-offs and other roads much less bumpy ahead.  (And big thanks to friends who gave my shock absorbers a boost this week!)&lt;br /&gt;&lt;br /&gt;Sorry for the lengthy absence from posting, but I'll get back to posting more regularly in the days to come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3591769608872562215?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3591769608872562215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3591769608872562215' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3591769608872562215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3591769608872562215'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/04/things-are-usually-never-as-bad-as-they.html' title='Things are usually never as bad as they seem at first'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5679693973875374050</id><published>2009-04-05T16:13:00.000-04:00</published><updated>2009-04-05T16:19:56.252-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kipling'/><title type='text'>If</title><content type='html'>I stumbled across this poem by Rudyard Kipling today and it struck a chord with me so I thought I'd share it.  It speaks of character and persistence and so much more.  &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you can keep your head when all about you&lt;br /&gt;Are losing theirs and blaming it on you,&lt;br /&gt;If you can trust yourself when all men doubt you&lt;br /&gt;But make allowance for their doubting too,&lt;br /&gt;If you can wait and not be tired by waiting,&lt;br /&gt;Or being lied about, don't deal in lies,&lt;br /&gt;Or being hated, don't give way to hating,&lt;br /&gt;And yet don't look too good, nor talk too wise:&lt;br /&gt;If you can dream--and not make dreams your master,&lt;br /&gt;If you can think--and not make thoughts your aim;&lt;br /&gt;If you can meet with Triumph and Disaster&lt;br /&gt;And treat those two impostors just the same;&lt;br /&gt;If you can bear to hear the truth you've spoken&lt;br /&gt;Twisted by knaves to make a trap for fools,&lt;br /&gt;Or watch the things you gave your life to, broken,&lt;br /&gt;And stoop and build 'em up with worn-out tools:&lt;br /&gt;If you can make one heap of all your winnings&lt;br /&gt;And risk it all on one turn of pitch-and-toss,&lt;br /&gt;And lose, and start again at your beginnings&lt;br /&gt;And never breath a word about your loss;&lt;br /&gt;If you can force your heart and nerve and sinew&lt;br /&gt;To serve your turn long after they are gone,&lt;br /&gt;And so hold on when there is nothing in you&lt;br /&gt;Except the Will which says to them: "Hold on!"&lt;br /&gt;If you can talk with crowds and keep your virtue,&lt;br /&gt;Or walk with kings--nor lose the common touch,&lt;br /&gt;If neither foes nor loving friends can hurt you;&lt;br /&gt;If all men count with you, but none too much,&lt;br /&gt;If you can fill the unforgiving minute&lt;br /&gt;With sixty seconds' worth of distance run,&lt;br /&gt;Yours is the Earth and everything that's in it,&lt;br /&gt;And--which is more--you'll be a Man, my son!&lt;br /&gt;&lt;br /&gt;--Rudyard Kipling&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5679693973875374050?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5679693973875374050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5679693973875374050' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5679693973875374050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5679693973875374050'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/04/if.html' title='If'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-413262195064475971</id><published>2009-04-01T22:55:00.001-04:00</published><updated>2009-04-01T23:04:51.920-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='audience'/><title type='text'>It's about the audience</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SdQpPqjaA9I/AAAAAAAAAKU/b6pdzq1MvMY/s1600-h/slide.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 297px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SdQpPqjaA9I/AAAAAAAAAKU/b6pdzq1MvMY/s400/slide.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5319922408928969682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I love this quote. Every time I give a presentation I hope it's obvious that I feel strongly about my subject. But the most important thing is that the audience takes away something that moves them. &lt;br /&gt;&lt;br /&gt;While recently attending a course taught by Garr Reynolds (&lt;a href="http://www.presentationzen.com/"&gt;PresentationZen&lt;/a&gt;) and Nancy Duarte (&lt;a href="http://blog.duarte.com/"&gt;Duarte Design, Slide:ology&lt;/a&gt;), Nancy said something that is a great corollary to the Salladay quote.  She said, "You can give a great presentation or you can give a presentation that moves the world."  Amen sister!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-413262195064475971?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/413262195064475971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=413262195064475971' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/413262195064475971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/413262195064475971'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/04/its-about-audience.html' title='It&apos;s about the audience'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SdQpPqjaA9I/AAAAAAAAAKU/b6pdzq1MvMY/s72-c/slide.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7787790452088884499</id><published>2009-03-22T21:02:00.000-04:00</published><updated>2009-03-22T21:07:46.105-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='trillion dollars'/><title type='text'>What does one TRILLION dollars look like?</title><content type='html'>If you haven't seen &lt;a href="http://www.pagetutor.com/trillion/index.html"&gt;this&lt;/a&gt;, it's worth a look.  I'd happily take the 1 million dollar package (100 packets of $10,000) which looks like this...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScbglLY2IkI/AAAAAAAAAKM/uKQ_W121zhM/s1600-h/1Mpile.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 266px; height: 254px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScbglLY2IkI/AAAAAAAAAKM/uKQ_W121zhM/s400/1Mpile.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5316183339474231874" /&gt;&lt;/a&gt;&lt;br /&gt;...and would still have room in my bag for my laptop.  &lt;br /&gt;&lt;br /&gt;Isn't it amazing that something that looks so small can mean so many big things?  &lt;br /&gt;&lt;br /&gt;Sigh...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7787790452088884499?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7787790452088884499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7787790452088884499' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7787790452088884499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7787790452088884499'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/03/what-does-one-trillion-dollars-look.html' title='What does one TRILLION dollars look like?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/ScbglLY2IkI/AAAAAAAAAKM/uKQ_W121zhM/s72-c/1Mpile.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6217097750635297618</id><published>2009-03-18T22:30:00.000-04:00</published><updated>2009-03-18T23:14:35.405-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='customer service'/><category scheme='http://www.blogger.com/atom/ns#' term='expensify'/><title type='text'>Expense reports - The Next Generation.  Wow!</title><content type='html'>I was filling out expense reports this past weekend and tweeted about it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScGvi6_c3PI/AAAAAAAAAJU/w-Gi_ZThE14/s1600-h/scr-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 50px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScGvi6_c3PI/AAAAAAAAAJU/w-Gi_ZThE14/s400/scr-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314722049759698162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A short while later, I got a reply tweet:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/ScGvn0sSfhI/AAAAAAAAAJc/191BCtTlJjI/s1600-h/scr.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 67px;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/ScGvn0sSfhI/AAAAAAAAAJc/191BCtTlJjI/s400/scr.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314722133968059922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My first thought was "Oh crap!  Twitter spam!"  But for some reason, I clicked on the link and ended up at a new site called &lt;a href="http://www.expensify.com"&gt;Expensify&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScGwWuc1-hI/AAAAAAAAAJk/lnXbD5oLnhI/s1600-h/scr-2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 244px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScGwWuc1-hI/AAAAAAAAAJk/lnXbD5oLnhI/s400/scr-2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314722939746515474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maybe because I hate filling out expense reports (particularly the part where I have to tape all my receipts to copy paper) or maybe it's because I was just bored of doing it and thought something new and different would at least be &lt;span style="font-style:italic;"&gt;not boring&lt;/span&gt;, so I signed up.  &lt;br /&gt;&lt;br /&gt;Within a few minutes, I had linked up the credit card I use for all my business expenses and imported all the transactions for that card into Expensify.  From that list of transactions, I chose the expenses that were from my latest business trip and built a new expense report following the very simple instructions.  There were a few expenses that I didn't charge to my card, so I added those manually.&lt;br /&gt;&lt;br /&gt;They said I could email a JPG of the receipt to receipts@expensify.com and it would be made available for me to include on my report just like charge card receipts.  I tried this and it didn't work.  Oh well...I figured it was either user error or perhaps it was the fact that this site is still labeled "beta" and I had just hit a bug that was preventing it from working.&lt;br /&gt;&lt;br /&gt;But, for the part that worked, I was very happy.  Every expense from my credit card had a certified electronic receipt. What this means is that there is proof of my charge direct from my credit card vendor that the IRS accepts so I don't need to provide the physical receipt for those expenses.  In other words, if I charge everything to my card, I have electronic receipts for all those charges and my entire expense report can be handled without me having to deal with one scrap of paper or receipt!  Now that is awesome!&lt;br /&gt;&lt;br /&gt;I was a bit concerned about the cash receipts JPGs not showing up though so I sent a feedback note (by clicking on the site's Feedback link) saying that I couldn't get the JPG email to show up properly.  I figured the feedback would just disappear into a support black hole, but then !bam!  I got an email from a real person with a real name with a real email address:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/ScGzaQYz_7I/AAAAAAAAAJs/-9EUo6dselk/s1600-h/scr-3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/ScGzaQYz_7I/AAAAAAAAAJs/-9EUo6dselk/s400/scr-3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314726298930905010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I forwarded him the original email I had sent with the attached JPG as he requested and got this reply:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/ScG0BbQhcjI/AAAAAAAAAJ0/q72flwz5bOY/s1600-h/scr-4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 197px;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/ScG0BbQhcjI/AAAAAAAAAJ0/q72flwz5bOY/s400/scr-4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314726971863822898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow!  Real. Live. Actual. Responsive. Customer. Service.  Wow!&lt;br /&gt;&lt;br /&gt;I re-sent the email with the attachment and checked my Expensify account and !wah-lah! it was there, pretty as you please.  &lt;br /&gt;&lt;br /&gt;Wanting to be thankful but seeing something else I was now wondering about, I replied:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScG1C2ZA0TI/AAAAAAAAAJ8/oZc16Uzn2VY/s1600-h/scr-5.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 124px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/ScG1C2ZA0TI/AAAAAAAAAJ8/oZc16Uzn2VY/s400/scr-5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314728095838687538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And very shortly, I received this note in response:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/ScG1Nhw8QjI/AAAAAAAAAKE/7ix3tfmcZCE/s1600-h/scr-6.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 274px;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/ScG1Nhw8QjI/AAAAAAAAAKE/7ix3tfmcZCE/s400/scr-6.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314728279280468530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Again, I say Wow!  I got an acknowledgment and a work-around.  &lt;br /&gt;&lt;br /&gt;I'm seriously impressed with these folks.  It reminds me of &lt;a href="http://www.tripit.com"&gt;TripIt&lt;/a&gt; and how much easier using it has made organizing my travels. Expensify seems to be to expense reporting what TripIt is to travel.  Granted, I think they've still got some maturing to do but I'm highly impressed with what they've got and with their excellent customer service.  And, even better...it's free to use! &lt;br /&gt;&lt;br /&gt;My customer service experience is so critical to how I view a product or service. If customer service and support is top notch, I think that speaks volumes.  And, it didn't take much for the Expensify folks to make me feel well taken care of and heard.  I appreciated it so much I've just spent 20 minutes writing this blog post singing their praises!&lt;br /&gt;&lt;br /&gt;So, if you hate doing expense reports and want a way to make it easier and faster to do them than you ever thought possible, I highly recommend that you check out Expensify.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6217097750635297618?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6217097750635297618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6217097750635297618' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6217097750635297618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6217097750635297618'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/03/expense-reports-next-generation-wow.html' title='Expense reports - The Next Generation.  Wow!'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/ScGvi6_c3PI/AAAAAAAAAJU/w-Gi_ZThE14/s72-c/scr-1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7165766747190683844</id><published>2009-03-17T00:04:00.001-04:00</published><updated>2009-03-17T00:19:01.794-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tagged'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Grand Poobah'/><title type='text'>Tagged</title><content type='html'>My friend Cheryl tagged me for this a couple of weeks ago and so I'm playing along (better late than never)!&lt;br /&gt;&lt;br /&gt;Here's the deal:&lt;br /&gt;1. Go to your My Documents/My Pictures&lt;br /&gt;2. Go to your sixth file&lt;br /&gt;3. Go to your sixth picture&lt;br /&gt;4. Blog about it&lt;br /&gt;5. Tag 6 people&lt;br /&gt;&lt;br /&gt;Well, first of all, I'm a Mac user so there's no such thing as My Documents/My Pictures.  So, I improvised.  I went to iPhoto and chose the 6th Event category (it was entitled "Misc Fun").  Here's what I found:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/Sb8hv6k_EuI/AAAAAAAAAJE/sWzOeYAPGK8/s1600-h/GrandPoobah.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 278px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/Sb8hv6k_EuI/AAAAAAAAAJE/sWzOeYAPGK8/s400/GrandPoobah.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314003192382427874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You know I followed the instructions because why else would I ever choose this humiliating photo of myself to display to the public!  Thanks a lot Cheryl!&lt;br /&gt;&lt;br /&gt;So, here's the deal.  I have a thing for hats.  I don't wear them often, but I have several I keep around for things like hiding bed hair when I have to run to the store early in the morning to pick up something we need for breakfast.  But mostly, I like to try on different hats and have fun making up stories about what I'd be doing or who I'd be if I was the owner of that hat.&lt;br /&gt;&lt;br /&gt;Can you guess who I'd be in the hat pictured?  Yep...that's me...the Grand Poobah! &lt;br /&gt;&lt;br /&gt;This hat was one of many I tried on at a shop at Universal Studios Florida called the Brown Derby.  That day I tried many hats and had many photos taken, but this one was the one I was most tempted to purchase.  I could almost imagine the stares I'd get the next time I wore it to cover up bed hair!&lt;br /&gt;&lt;br /&gt;I'll admit to ending the tag game at me.  I mean really...the Grand Poobah does have the power and authority to change the rules just a bit doesn't she?!?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7165766747190683844?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7165766747190683844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7165766747190683844' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7165766747190683844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7165766747190683844'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/03/tagged.html' title='Tagged'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gB2tAQrrKSw/Sb8hv6k_EuI/AAAAAAAAAJE/sWzOeYAPGK8/s72-c/GrandPoobah.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6434373852865575150</id><published>2009-03-10T20:13:00.000-04:00</published><updated>2009-03-10T20:16:04.442-04:00</updated><title type='text'>Tweetie</title><content type='html'>For those of you who &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt; and own an iPhone, you may like this app - &lt;a href="http://www.atebits.com/software/tweetie/"&gt;Tweetie&lt;/a&gt; - if you haven't found it yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6434373852865575150?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6434373852865575150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6434373852865575150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6434373852865575150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6434373852865575150'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/03/tweetie.html' title='Tweetie'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3991823677415456543</id><published>2009-03-05T21:18:00.000-05:00</published><updated>2009-03-05T21:38:26.974-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='health'/><category scheme='http://www.blogger.com/atom/ns#' term='cnn'/><title type='text'>Don't keep secrets from your doctor</title><content type='html'>Check out &lt;a href="http://www.cnn.com/2009/HEALTH/03/05/ep.secrets.doctors/index.html?eref=rss_topstories"&gt;this article&lt;/a&gt; from CNN.com.  It's a list of 10 'secrets' you shouldn't keep from your doctor.  I was amused enough at the list that I thought I'd share it for those who don't want to read the full article.&lt;br /&gt;&lt;br /&gt;1. Smoke, drink excessively, do illegal drugs&lt;br /&gt;2. Have peeing or pooping issues&lt;br /&gt;3. Take herbs&lt;br /&gt;4. See a chiropractor or an alternative healer&lt;br /&gt;5. Are having financial troubles&lt;br /&gt;6. Want cheap medicine (i.e. generic drugs vs. brand name)&lt;br /&gt;7. Feel depressed or anxious or stressed out&lt;br /&gt;8. Defied the doctor's orders&lt;br /&gt;9. Don't exercise and eat badly&lt;br /&gt;10. Have a small problem you think is unimportant&lt;br /&gt;&lt;br /&gt;I'm not sure why this struck me, in some ways, as funny, but it did.  My primary physician is one person I really do tell everything to!  After a heart attack two years ago and the realization that I'm getting older and older every day, I figure I'd better keep my doc "in the know".&lt;br /&gt;&lt;br /&gt;First of all, I pay her to make my health a priority (for her and for me).  Second, some of these things I think she'd know if I tried to lie.  For example, defying her orders or not exercising and eating badly will show up in her examinations of me for the most part.  If I leave her office and return six months later and have gained 20 pounds I think she'll figure out I've not been a good girl with diet and exercise.  Finally, what's the point in keeping secrets?  It's kinda funny but mostly sad to think that people would not tell their doctor about things because they were embarrassed or frightened of the reaction they'd get or maybe they just don't want to be told any bad news so they lie to avoid it.&lt;br /&gt;&lt;br /&gt;Anyway, if you have a fear of being honest with your doctor, try finding one that you feel comfortable enough with to be completely open.  I think you'll be glad in the long run and likely a lot healthier too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3991823677415456543?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3991823677415456543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3991823677415456543' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3991823677415456543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3991823677415456543'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/03/dont-keep-secrets-from-your-doctor.html' title='Don&apos;t keep secrets from your doctor'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-8822388665364259561</id><published>2009-02-23T19:03:00.000-05:00</published><updated>2009-02-23T19:09:17.548-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Word of the day'/><title type='text'>My word of the day</title><content type='html'>&lt;span style="font-weight:bold;"&gt;pro·te·an (prō’tē-ən) &lt;/span&gt;&lt;br /&gt;Exhibiting considerable versatility or diversity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-8822388665364259561?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/8822388665364259561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=8822388665364259561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8822388665364259561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8822388665364259561'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/02/my-word-of-day.html' title='My word of the day'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5680979792190704069</id><published>2009-02-14T21:51:00.000-05:00</published><updated>2009-02-14T21:57:53.876-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='over 40'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Black and White - Under 40?  You won't understand.</title><content type='html'>My friend Larry sent this to me and I liked it so much I thought I'd blog it.  The point is to help remember that life's most simple pleasures are very often the best.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SZeD91XUF_I/AAAAAAAAAIk/WQ2nxmTtLEY/s1600-h/Image3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 318px; height: 400px;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SZeD91XUF_I/AAAAAAAAAIk/WQ2nxmTtLEY/s400/Image3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5302852184572172274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You could hardly see for all the snow, &lt;br /&gt;Spread the rabbit ears as far as they go.&lt;br /&gt;Pull a chair up to the TV set,&lt;br /&gt;'Good Night, David. Good Night, Chet.'&lt;br /&gt;&lt;br /&gt;My Mom used to cut chicken, chop eggs and spread mayo on the same cutting board with the same knife and no bleach, but we didn't seem to get food poisoning.&lt;br /&gt;&lt;br /&gt;My Mom used to defrost hamburger on the counter AND I used to eat it raw sometimes, too. Our school sandwiches were wrapped in wax paper in a brown paper bag, not in ice-pack coolers, but I can't remember getting e.coli.&lt;br /&gt;&lt;br /&gt;Almost all of us would have rather gone swimming in the lake instead of a pristine pool (talk about boring), no beach closures then.&lt;br /&gt;&lt;br /&gt;The term cell phone would have conjured up a phone in a jail cell, and a pager was the school PA system.&lt;br /&gt;&lt;br /&gt;We all took gym, not PE and risked permanent injury with a pair of high top Ked's (only worn in gym) instead of having cross-training athletic shoes with air cushion soles and built in light reflectors. I can't recall any injuries, but they must have happened because they tell us how much safer we are now.&lt;br /&gt;&lt;br /&gt;Flunking gym was not an option, even for stupid kids! I guess PE must be much harder than gym.&lt;br /&gt;&lt;br /&gt;Speaking of school, we all said prayers and sang the national anthem, and staying in detention after school caught all sorts of negative attention.&lt;br /&gt;&lt;br /&gt;We must have had horribly damaged psyches. What an archaic health system we had then. Remember school nurses? Ours wore a hat and everything.&lt;br /&gt;&lt;br /&gt;I thought that I was supposed to accomplish something before I was allowed to be proud of myself.&lt;br /&gt;&lt;br /&gt;I just can't recall how bored we were without computers, Play Station, Nintendo, X-box or 270 digital TV cable stations.&lt;br /&gt;&lt;br /&gt;Oh yeah ... and where was the Benadryl and sterilization kit when I got that bee sting? I could have been killed!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SZeEHGcpH2I/AAAAAAAAAIs/VmP130rEX6A/s1600-h/Image6.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 318px; height: 400px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SZeEHGcpH2I/AAAAAAAAAIs/VmP130rEX6A/s400/Image6.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5302852343776747362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We played 'king of the hill' on piles of gravel left on vacant construction sites, and when we got hurt, Mom pulled out the 48-cent bottle of Mercurochrome (kids liked it better because it didn't sting like iodine did) and then we got our butt spanked.  Now it's a trip to the emergency room, followed by a 10-day dose of a $49 bottle of antibiotics, and then Mom calls the attorney to sue the contractor for leaving a horribly vicious pile of gravel where it was such a threat.&lt;br /&gt;&lt;br /&gt;We didn't act up at the neighbor's house either because if we did, we got our butt spanked there and then we got butt spanked again when we got home.&lt;br /&gt;&lt;br /&gt;I recall Donny Reynolds from next door coming over and doing his tricks on the front step, just before he fell off. Little did his Mom know that she could have owned our house. Instead, she picked him up and swatted him for being such a goof. It was a neighborhood run amuck.&lt;br /&gt;&lt;br /&gt;To top it off, not a single person I knew had ever been told that they were from a dysfunctional family. How could we possibly have known that?&lt;br /&gt;&lt;br /&gt;We needed to get into group therapy and anger management classes? We were obviously so duped by so many societal ills that we didn't even notice that the entire country wasn't taking Prozac! How did we ever survive?&lt;br /&gt;&lt;br /&gt;LOVE TO ALL OF US WHO SHARED THIS ERA, AND TO ALL WHO DIDN'T; SORRY FOR WHAT YOU MISSED. I WOULDN'T TRADE IT FOR ANYTHING.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5680979792190704069?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5680979792190704069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5680979792190704069' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5680979792190704069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5680979792190704069'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/02/black-and-white-under-40-you-wont.html' title='Black and White - Under 40?  You won&apos;t understand.'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SZeD91XUF_I/AAAAAAAAAIk/WQ2nxmTtLEY/s72-c/Image3.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3377079014718106876</id><published>2009-02-12T18:51:00.000-05:00</published><updated>2009-02-12T19:03:41.695-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CJ Date'/><category scheme='http://www.blogger.com/atom/ns#' term='Chris Date'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle optimizer statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><title type='text'>New paper and CJ Date advert</title><content type='html'>I've uploaded a paper entitled "&lt;a href="http://method-r.com/downloads/doc_download/11-managing-statistics-for-optimal-query-performance-karen-morton"&gt;Managing Statistics for Optimal Query Performance&lt;/a&gt;" that I'll be delivering at a couple of conferences over the next few months.  This was a fun and interesting paper to write and I'm looking forward to actually delivering it at &lt;a href="http://www.seouc.com"&gt;SEOUC&lt;/a&gt;, the &lt;a href="http://www.hotsos.com/sym09.html"&gt;Hotsos Symposium&lt;/a&gt; and &lt;a href="http://www.ioug.org/collaborate09/"&gt;Collaborate&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm also really thrilled that C.J. (Chris) Date will be coming to Dallas in April to teach a new course he's developed entitled "&lt;a href="http://method-r.com/education/courses/43-course/107-cj-date-course"&gt;How to Write Correct SQL and Know It: A Relational Approach to SQL&lt;/a&gt;".  You may have heard Mr. Date's name as you were learning relational theory as he, along with Ted Codd, are known for their work in the field.  I can't wait to attend an event from one of the "founding fathers".  I don't think it really matters what database platform you use, the experience and application of relational theory that this guy has in his little finger is likely to be more than I've ever dreamed of knowing.  Check out the class and come join me.  It should be a good one!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3377079014718106876?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3377079014718106876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3377079014718106876' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3377079014718106876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3377079014718106876'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/02/new-paper-and-cj-date-advert.html' title='New paper and CJ Date advert'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2048393042611397305</id><published>2009-02-02T16:20:00.000-05:00</published><updated>2009-02-02T16:25:09.134-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groundhog Day'/><title type='text'>Groundhog Day</title><content type='html'>So, I heard that according to the groundhog, we're to expect 6 more weeks of winter.  Given the odd weather we've had here in Portland this winter - from more snow than has been seen in years to days of absolutely freezing temps and biting winds with sunny skies (which is very unusual for the typically grey and dreary weather we usually see this time of year) - I almost expect volcanoes to erupt (possible since we're near Mt. St. Helen's) or a swarm of locusts to engulf the city!  &lt;br /&gt;&lt;br /&gt;I think Bill Murray said it best in the movie GroundHog Day.&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rWmbuKSWLDE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rWmbuKSWLDE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2048393042611397305?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2048393042611397305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2048393042611397305' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2048393042611397305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2048393042611397305'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/02/groundhog-day.html' title='Groundhog Day'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-458448094833776253</id><published>2009-02-02T16:10:00.000-05:00</published><updated>2009-02-02T16:13:44.302-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indexed'/><title type='text'>"Indexed" and Isolation</title><content type='html'>I've followed a blog called &lt;span style="font-style:italic;"&gt;&lt;a href="http://thisisindexed.com/"&gt;Indexed&lt;/a&gt;&lt;/span&gt; for some time.  The author/blogger is Jessica Hagy and she gives her perspective on the world using small drawings on index cards.  I think it's quite clever.  She has a book of the same name which is a collection of many of her "indexed" thoughts.  I like the way she makes a point in such a simple and visual way.&lt;br /&gt;&lt;br /&gt;I was looking through some older posts and came across one called "&lt;a href="http://thisisindexed.com/2006/11/self-defense-today/"&gt;Self Defense Today&lt;/a&gt;."  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SYdYPvOnXmI/AAAAAAAAAIc/3yQnFR-lyBc/s1600-h/self-defense-today.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SYdYPvOnXmI/AAAAAAAAAIc/3yQnFR-lyBc/s400/self-defense-today.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5298300514023726690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had to laugh.  I really (really, really) don't know what I did before caller ID and voicemail!  When I see a number I don't recognize, I just don't answer and will wait to see if I get a voicemail message.  Or, I'll answer but just cough in the phone like Jack Nicholson did in "As Good As It Gets".  Then I listen for a couple of seconds and then hang up.  By the way, this is a good trick for handling automated calls.  When you answer, you have to make some noise to get the automated message to start playing and then you can hang up.  If you hang up before the message starts, or if you don't answer at all, you keep getting call backs.  So much for the nationwide "do not call" list!&lt;br /&gt;&lt;br /&gt;I try to only do the cough/hang up trick when I really think it's an unwanted sales call (Dish Network for the thousandth time, credit card companies, and so on), but if you happen to call me and get a loud cough in your ear, perhaps you should call back from a number I recognize or just send me an email.  Of course, if I don't recognize your email address, that message just might end up in my spam folder.  &lt;br /&gt;&lt;br /&gt;So, better yet, just drop by if you're in the neighborhood.  But that might be a problem too as my doorbell isn't working and if you drop by after 6pm there's a sign that says "knock softly, baby sleeping" and another one that says "no soliciting".  If you do knock and I'm upstairs, I won't hear you particularly if the TV is on.  &lt;br /&gt;&lt;br /&gt;Geesh!  I suppose I've effectively cut myself off from society.  Maybe I need to rethink things.  Hmmmm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-458448094833776253?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/458448094833776253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=458448094833776253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/458448094833776253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/458448094833776253'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/02/indexed-and-isolation.html' title='&quot;Indexed&quot; and Isolation'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SYdYPvOnXmI/AAAAAAAAAIc/3yQnFR-lyBc/s72-c/self-defense-today.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4799314680994539256</id><published>2009-01-19T23:00:00.000-05:00</published><updated>2009-01-19T23:17:05.314-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dynamic sql'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle optimizer'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamic where clause'/><title type='text'>"Dynamic" WHERE clauses that aren't</title><content type='html'>What does the optimizer do with "dynamic" WHERE clauses?  What I'm talking about is when you have a SELECT statement that has a "simple" WHERE clause like this:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;WHERE column1 = NVL(:B1, column1) &lt;br /&gt;  AND column2 = NVL(:B2, column2)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The intention of this WHERE clause is to allow 4 different scenarios to be covered.&lt;br /&gt;1)  If :B1 is null and :B2 is null, then retrieve all rows.&lt;br /&gt;2)  If :B1 is null and :B2 is not null, then retrieve only rows where column2 = :B2.&lt;br /&gt;3)  If :B2 is null and :B1 is not null, then retrieve only rows where column1 = :B1.&lt;br /&gt;4)  If :B1 is not null and :B2 is not null, then retrieve only rows where column1 = :B1 and column2 = :B2.&lt;br /&gt;&lt;br /&gt;The logic is that since the two conditions are AND'ed, that both have to evaluate to true in order to produce any rows.  If, however, you wish to be flexible and allow for all 4 cases to be possible with a single query, then you have to find a way to ensure that both sides of the AND evaluate TRUE regardless of what inputs you receive.  By using the NVL, you can accomplish that.  You either pass in a null value or a not null value and the NVL check will make sure that the condition always evaluates to true.  You get to either qualify which rows are returned by passing in a not null bind variable or you can leave the selection of rows unqualified by passing in a null value.  Simple, huh?&lt;br /&gt;&lt;br /&gt;Well, it may be simple in terms of the way the code looks, but what it does to the optimizer isn't that simple. The optimizer has to come up with a plan that can best serve all 4 possibilities equally.  It can't/won't come up with 4 different plans.  &lt;br /&gt;&lt;br /&gt;Let me show you a few tests.  I'll be using a test table I had in place from some previous tests for another post.  It's a simple 2500 row table with 2 indexes (T2_I3 on the hair column and T2_I6 on the work column).  Take a look at what happens when I execute my query 4 times using the 4 different scenarios I noted above.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SQL&gt;set serveroutput off&lt;br /&gt;SQL&gt;variable b1 number&lt;br /&gt;SQL&gt;variable b2 number&lt;br /&gt;SQL&gt;exec :b1 := null;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;exec :b2 := null ;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;select /*+ gather_plan_statistics */ count(*)&lt;br /&gt;  2    from bitmap_t2&lt;br /&gt;  3  where hair = NVL(:b1, hair)&lt;br /&gt;  4    and work = NVL(:b2, work) ;&lt;br /&gt;&lt;br /&gt;       COUNT(*)&lt;br /&gt;---------------&lt;br /&gt;           2500&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;@allstats_last&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------&lt;br /&gt;SQL_ID  16jagac5xq0r4, child number 0&lt;br /&gt;-------------------------------------&lt;br /&gt;select /*+ gather_plan_statistics */ count(*)   from bitmap_t2 where hair = NVL(:b1, hair)   and work&lt;br /&gt;= NVL(:b2, work)&lt;br /&gt;&lt;br /&gt;Plan hash value: 2153464131&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;|   1 |  SORT AGGREGATE                |           |      1 |      1 |      1 |00:00:00.08 |    2504 |    342 |&lt;br /&gt;|   2 |   CONCATENATION                |           |      1 |        |   2500 |00:00:00.07 |    2504 |    342 |&lt;br /&gt;|*  3 |    FILTER                      |           |      1 |        |   2500 |00:00:00.06 |    2504 |    342 |&lt;br /&gt;|*  4 |     TABLE ACCESS FULL          | BITMAP_T2 |      1 |    357 |   2500 |00:00:00.03 |    2504 |    342 |&lt;br /&gt;|*  5 |    FILTER                      |           |      1 |        |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  6 |     TABLE ACCESS BY INDEX ROWID| BITMAP_T2 |      0 |      5 |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  7 |      INDEX RANGE SCAN          | T2_I6     |      0 |     32 |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;   3 - filter(:B2 IS NULL)&lt;br /&gt;   4 - filter(("HAIR"=NVL(:B1,"HAIR") AND "WORK" IS NOT NULL))&lt;br /&gt;   5 - filter(:B2 IS NOT NULL)&lt;br /&gt;   6 - filter("HAIR"=NVL(:B1,"HAIR"))&lt;br /&gt;   7 - access("WORK"=:B2)&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;exec :b2 := 45 ;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;select /*+ gather_plan_statistics */ count(*)&lt;br /&gt;  2    from bitmap_t2&lt;br /&gt;  3  where hair = NVL(:b1, hair)&lt;br /&gt;  4    and work = NVL(:b2, work) ;&lt;br /&gt;&lt;br /&gt;       COUNT(*)&lt;br /&gt;---------------&lt;br /&gt;             32&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;@allstats_last&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------&lt;br /&gt;SQL_ID  16jagac5xq0r4, child number 0&lt;br /&gt;-------------------------------------&lt;br /&gt;select /*+ gather_plan_statistics */ count(*)   from bitmap_t2 where hair = NVL(:b1, hair)   and work&lt;br /&gt;= NVL(:b2, work)&lt;br /&gt;&lt;br /&gt;Plan hash value: 2153464131&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;|   1 |  SORT AGGREGATE                |           |      1 |      1 |      1 |00:00:00.01 |      67 |      4 |&lt;br /&gt;|   2 |   CONCATENATION                |           |      1 |        |     32 |00:00:00.01 |      67 |      4 |&lt;br /&gt;|*  3 |    FILTER                      |           |      1 |        |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  4 |     TABLE ACCESS FULL          | BITMAP_T2 |      0 |    357 |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  5 |    FILTER                      |           |      1 |        |     32 |00:00:00.01 |      67 |      4 |&lt;br /&gt;|*  6 |     TABLE ACCESS BY INDEX ROWID| BITMAP_T2 |      1 |      5 |     32 |00:00:00.01 |      67 |      4 |&lt;br /&gt;|*  7 |      INDEX RANGE SCAN          | T2_I6     |      1 |     32 |     32 |00:00:00.01 |      35 |      0 |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;   3 - filter(:B2 IS NULL)&lt;br /&gt;   4 - filter(("HAIR"=NVL(:B1,"HAIR") AND "WORK" IS NOT NULL))&lt;br /&gt;   5 - filter(:B2 IS NOT NULL)&lt;br /&gt;   6 - filter("HAIR"=NVL(:B1,"HAIR"))&lt;br /&gt;   7 - access("WORK"=:B2)&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;exec :b1 := 5;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;exec :b2 := null ;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;select /*+ gather_plan_statistics */ count(*)&lt;br /&gt;  2    from bitmap_t2&lt;br /&gt;  3  where hair = NVL(:b1, hair)&lt;br /&gt;  4    and work = NVL(:b2, work) ;&lt;br /&gt;&lt;br /&gt;       COUNT(*)&lt;br /&gt;---------------&lt;br /&gt;            357&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;@allstats_last&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------&lt;br /&gt;SQL_ID  16jagac5xq0r4, child number 0&lt;br /&gt;-------------------------------------&lt;br /&gt;select /*+ gather_plan_statistics */ count(*)   from bitmap_t2 where hair = NVL(:b1, hair)   and work&lt;br /&gt;= NVL(:b2, work)&lt;br /&gt;&lt;br /&gt;Plan hash value: 2153464131&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;|   1 |  SORT AGGREGATE                |           |      1 |      1 |      1 |00:00:00.04 |    2504 |    342 |&lt;br /&gt;|   2 |   CONCATENATION                |           |      1 |        |    357 |00:00:00.04 |    2504 |    342 |&lt;br /&gt;|*  3 |    FILTER                      |           |      1 |        |    357 |00:00:00.03 |    2504 |    342 |&lt;br /&gt;|*  4 |     TABLE ACCESS FULL          | BITMAP_T2 |      1 |    357 |    357 |00:00:00.03 |    2504 |    342 |&lt;br /&gt;|*  5 |    FILTER                      |           |      1 |        |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  6 |     TABLE ACCESS BY INDEX ROWID| BITMAP_T2 |      0 |      5 |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  7 |      INDEX RANGE SCAN          | T2_I6     |      0 |     32 |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;   3 - filter(:B2 IS NULL)&lt;br /&gt;   4 - filter(("HAIR"=NVL(:B1,"HAIR") AND "WORK" IS NOT NULL))&lt;br /&gt;   5 - filter(:B2 IS NOT NULL)&lt;br /&gt;   6 - filter("HAIR"=NVL(:B1,"HAIR"))&lt;br /&gt;   7 - access("WORK"=:B2)&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;exec :b1 := 5;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;exec :b2 := 45 ;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;select /*+ gather_plan_statistics */ count(*)&lt;br /&gt;  2    from bitmap_t2&lt;br /&gt;  3  where hair = NVL(:b1, hair)&lt;br /&gt;  4    and work = NVL(:b2, work) ;&lt;br /&gt;&lt;br /&gt;       COUNT(*)&lt;br /&gt;---------------&lt;br /&gt;              5&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;@allstats_last&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------&lt;br /&gt;SQL_ID  16jagac5xq0r4, child number 0&lt;br /&gt;-------------------------------------&lt;br /&gt;select /*+ gather_plan_statistics */ count(*)   from bitmap_t2 where hair = NVL(:b1, hair)   and work&lt;br /&gt;= NVL(:b2, work)&lt;br /&gt;&lt;br /&gt;Plan hash value: 2153464131&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;|   1 |  SORT AGGREGATE                |           |      1 |      1 |      1 |00:00:00.02 |      67 |      5 |&lt;br /&gt;|   2 |   CONCATENATION                |           |      1 |        |      5 |00:00:00.02 |      67 |      5 |&lt;br /&gt;|*  3 |    FILTER                      |           |      1 |        |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  4 |     TABLE ACCESS FULL          | BITMAP_T2 |      0 |    357 |      0 |00:00:00.01 |       0 |      0 |&lt;br /&gt;|*  5 |    FILTER                      |           |      1 |        |      5 |00:00:00.02 |      67 |      5 |&lt;br /&gt;|*  6 |     TABLE ACCESS BY INDEX ROWID| BITMAP_T2 |      1 |      5 |      5 |00:00:00.02 |      67 |      5 |&lt;br /&gt;|*  7 |      INDEX RANGE SCAN          | T2_I6     |      1 |     32 |     32 |00:00:00.01 |      35 |      0 |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;   3 - filter(:B2 IS NULL)&lt;br /&gt;   4 - filter(("HAIR"=NVL(:B1,"HAIR") AND "WORK" IS NOT NULL))&lt;br /&gt;   5 - filter(:B2 IS NOT NULL)&lt;br /&gt;   6 - filter("HAIR"=NVL(:B1,"HAIR"))&lt;br /&gt;   7 - access("WORK"=:B2)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note how with each different set of bind variable values, the query produces a different result.  But the plan remains the same (check the SQL_ID, child_number and plan hash values...they all match).  You can also see how one set of the plan operations doesn't execute (note the 0's in the A-Rows, Buffers and Reads columns).&lt;br /&gt;&lt;br /&gt;What this tells you is that the optimizer created a plan that would work &lt;em&gt;dynamically&lt;/em&gt;.  Well, sorta.  Basically, the checks (step 3 and step 5) are made to see if :B2 IS NULL.  If it is null, then step 4 executes.  If it is not null, then steps 6-7 execute.  This works fine for when you want the whole table (both bind values are null) or when you want to retrieve rows only where the work column equals some value.  But, when you want to retrieve rows where you need to qualify both the work and hair columns or when you want to access rows for a particular hair value, the plan is sub-optimal.&lt;br /&gt;&lt;br /&gt;So, OK...you're batting .500.  Not bad I suppose.  ;)   But what if your SLA says you have to bat .900 or better?  This plan just won't do.  You need each different scenario to produce as optimal a plan as possible.  How can you do that?&lt;br /&gt;&lt;br /&gt;One way is to write your code to build the WHERE clause on the fly and use EXECUTE IMMEDIATE.  The pseudo-code to do this might go something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;full_string := 'SELECT (rest of stuff).....';&lt;br /&gt;if :b1 is null and :b2 is null then&lt;br /&gt;   where_string := null;&lt;br /&gt;elsif :b1 is not null and :b2 is not null then&lt;br /&gt;   where_string := ' WHERE hair = :B1 AND work = :B2';&lt;br /&gt;elsif :b1 is null and :b2 is not null then&lt;br /&gt;   where_string := ' WHERE work = :B2';&lt;br /&gt;elsif :b1 is not null and :b2 is null then&lt;br /&gt;   where_string := ' WHERE hair = :B1';&lt;br /&gt;&lt;br /&gt;full_string := full_string || where_string;&lt;br /&gt;EXECUTE IMMEDIATE...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This way, you have 4 different statements and therefore 4 different plans.  Each one (hopefully) optimal.&lt;br /&gt;&lt;br /&gt;Another option would be to change your indexing strategy.  Perhaps you could create a multi-column index using both columns.  But, even with this option, you're not going to get "perfect" results.  Depending on which column you decide to lead the index with, one of the index scans would likely have to do a skip scan or a full scan which wouldn't be as effective.&lt;br /&gt;&lt;br /&gt;So, while the idea to use a single statement with conditional logic (in this case, NVL) and binds looks appealing, just remember that the plan you end up with may not provide the performance you want/need for all possible scenarios.  If you use this approach, be prepared to create indexes properly so as to get the best possible coverage for all scenarios.  I think the bottom line is that if you truly want dynamic SQL, then really use dynamic SQL.  The attempt to simplify or to have a single statement that covers many different possible needs can cause performance to suffer for a some percentage (perhaps a significant %) of the scenarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4799314680994539256?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4799314680994539256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4799314680994539256' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4799314680994539256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4799314680994539256'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/01/dynamic-where-clauses-that-arent.html' title='&quot;Dynamic&quot; WHERE clauses that aren&apos;t'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-1106041617740503370</id><published>2009-01-15T23:50:00.000-05:00</published><updated>2009-01-15T23:51:51.629-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='manners'/><title type='text'>You say, "Thank you".  I say, "You're welcome".</title><content type='html'>You say "Thank you".  I say, "You're welcome".  At least that's how my mother taught me.  It's good manners to respond to a "thank you", with a "you're welcome".  But, it seems like many people either didn't learn their manners the same way I did or maybe they just don't have any manners.  Either way, I've got a pet peeve to rant on as a hiatus from the heavy tech nature of my last couple of posts (Cheryl, I'm primarily thinking of you as I write this non-techie post).&lt;br /&gt;&lt;br /&gt;It's pandemic: waiters, store clerks, gas station attendants, even the phone person who helped me with my recent airfare purchase.  All of them responded to my "thank you" by saying something like "no problem" or "yep" or "sure". It may be my upbringing to be mannerly.  It may be my Southern roots.  It may be just some other voice in my head that translates what I hear, when I hear any of those responses.  But whatever the reason, when I hear anything other than "you're welcome", it immediately seems rude to me.  When I hear "no problem", I think, "it shouldn't be a problem since I'm paying you for your time and service".  Or, when I hear "yep", I immediately picture a gum-smacking, sixteen year old rolling their eyes at me and breathing a long-suffering sigh in my direction as they trudge back to the kitchen to get the baked potato that was left off my order.&lt;br /&gt;&lt;br /&gt;Somehow saying "you're welcome" at least gives me the impression that you are having a personal interaction with me and not just giving me your time/attention/service because you have to be there when you'd really rather be anywhere else.  It just seems like the "nice" and polite thing to say.&lt;br /&gt;&lt;br /&gt;I know it's likely that only I have an objection to such flip responses, but I admit it.  I do.  &lt;br /&gt;&lt;br /&gt;So, if you happen to get a "thank you" from me, I'd really appreciate a "you're welcome". &lt;br /&gt;&lt;br /&gt;Thank you for reading.  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-1106041617740503370?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/1106041617740503370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=1106041617740503370' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1106041617740503370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1106041617740503370'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/01/you-say-thank-you-i-say-youre-welcome.html' title='You say, &quot;Thank you&quot;.  I say, &quot;You&apos;re welcome&quot;.'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2122298762263081097</id><published>2009-01-13T23:05:00.000-05:00</published><updated>2009-01-13T23:10:56.675-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle BITMAP AND'/><title type='text'>Round 2:  BITMAP AND</title><content type='html'>OK.  I thought this would be pretty straightforward, but as it turns out, it wasn't (is it ever?).  I finally got around to testing out the BITMAP CONVERSION stuff as related to my &lt;a href="http://karenmorton.blogspot.com/2008/12/and-equal-vs-bitmap-and.html"&gt;previous post&lt;/a&gt;.  I've actually been working on this off and on since my previous post, but am just now to the point where I'm willing to share the results.  Jeff Holt was a huge help and determined the correct trace events needed to investigate this fully.  Thanks Jeff!&lt;br /&gt;&lt;br /&gt;First, an interesting/surprising thing I found in trying to reproduce the behavior originally noted was that I wasn't able to reproduce it!  What I could consistently reproduce (on both 10.2.0.1 and 11.1.0.6 instances) was essentially the opposite behavior of what the original client case showed.  So, I decided to just make sure I could understand how the two operations (BITMAP AND vs AND-EQUAL) worked for what I could reproduce.  This post is just about the BITMAP AND operation.  I'll post another day about AND-EQUAL.&lt;br /&gt;&lt;br /&gt;From here on out, this post has lots of code and trace data output, so if you just want the punch-line, scroll to the bottom.  :)&lt;br /&gt;&lt;br /&gt;If you'd like to try the tests yourself, here's how I created the test data and performed the test.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;-- Create test table, populate with data and collect statistics (setup.sql)&lt;br /&gt;drop table bitmap_test;&lt;br /&gt;&lt;br /&gt;create table bitmap_test as&lt;br /&gt;select rownum id&lt;br /&gt;from all_objects&lt;br /&gt;where rownum &lt;= 50 /* make larger for more data */;&lt;br /&gt;&lt;br /&gt;drop table bitmap_t2;&lt;br /&gt;&lt;br /&gt;define isto="pctfree 99 storage (initial 5m)"&lt;br /&gt;define tsto="pctused 1 &amp;isto"&lt;br /&gt;&lt;br /&gt;create table bitmap_t2&lt;br /&gt;nologging&lt;br /&gt;&amp;tsto&lt;br /&gt;as select /*+ ordered use_nl(v2) */&lt;br /&gt;    lpad('x',20,'x')    facts,&lt;br /&gt;    mod(rownum, 2)  sex,&lt;br /&gt;    mod(rownum, 3)  eyes,&lt;br /&gt;    mod(rownum, 7)  hair,&lt;br /&gt;    mod(rownum, 31) town,&lt;br /&gt;    mod(rownum, 47) age,&lt;br /&gt;    mod(rownum, 79) work&lt;br /&gt;from bitmap_test v1,&lt;br /&gt;     bitmap_test v2&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;create index t2_i3 on bitmap_t2(hair) nologging &amp;isto;&lt;br /&gt;create index t2_i6 on bitmap_t2(work) nologging &amp;isto;&lt;br /&gt;&lt;br /&gt;exec dbms_stats.gather_table_stats(user, 'bitmap_t2', estimate_percent=&gt;100, -&lt;br /&gt;method_opt=&gt;'for all columns size 1', cascade=&gt;TRUE, no_invalidate=&gt;FALSE)&lt;br /&gt;&lt;br /&gt;-- Test (test.sql)&lt;br /&gt;select value from v$parameter where name = 'user_dump_dest';&lt;br /&gt;&lt;br /&gt;-- Get SPID so I can easily find trace file&lt;br /&gt;select p.spid from v$session s, v$process p &lt;br /&gt;where audsid = userenv('sessionid') and s.paddr = p.addr;&lt;br /&gt;&lt;br /&gt;-- Turn on all pertinent trace events&lt;br /&gt;alter session set events '10046 trace name context forever';&lt;br /&gt;alter session set events '10202 trace name context forever';&lt;br /&gt;alter session set events '10711 trace name context forever, level 127';&lt;br /&gt;alter session set events '10713 trace name context forever, level 127';&lt;br /&gt;alter session set events '10715 trace name context forever, level 127';&lt;br /&gt;alter session set events '10717 trace name context forever, level 127';&lt;br /&gt;alter session set statistics_level=all;&lt;br /&gt;&lt;br /&gt;set termout off pause off&lt;br /&gt;&lt;br /&gt;-- Run once for each query &lt;br /&gt;-- Run with index_combine hint to get BITMAP AND plan&lt;br /&gt;select /*+ index_combine(bitmap_t2 t2_i6 t2_i3) */ * &lt;br /&gt;from bitmap_t2 where hair = 5 and work = 45;&lt;br /&gt;&lt;br /&gt;-- Run with RULE hint to get AND-EQUAL plan&lt;br /&gt;-- select /*+ rule */ * from bitmap_t2 where hair = 5 and work = 45;&lt;br /&gt;&lt;br /&gt;set termout on&lt;br /&gt;exit&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Test 1 trace output (STAT lines only)&lt;br /&gt;&lt;pre name="code" class="sql"&gt;STAT #2 id=1 cnt=5 pid=0 pos=1 obj=56968 op='TABLE ACCESS BY INDEX ROWID BITMAP_T2 (cr=400 pr=362 pw=0 time=79714 us)'&lt;br /&gt;STAT #2 id=2 cnt=5 pid=1 pos=1 obj=0 op='BITMAP CONVERSION TO ROWIDS (cr=395 pr=361 pw=0 time=78988 us)'&lt;br /&gt;STAT #2 id=3 cnt=1 pid=2 pos=1 obj=0 op='BITMAP AND  (cr=395 pr=361 pw=0 time=78694 us)'&lt;br /&gt;STAT #2 id=4 cnt=1 pid=3 pos=1 obj=0 op='BITMAP CONVERSION FROM ROWIDS (cr=35 pr=1 pw=0 time=11851 us)'&lt;br /&gt;STAT #2 id=5 cnt=32 pid=4 pos=1 obj=56970 op='INDEX RANGE SCAN T2_I6 (cr=35 pr=1 pw=0 time=11297 us)'&lt;br /&gt;STAT #2 id=6 cnt=1 pid=3 pos=2 obj=0 op='BITMAP CONVERSION FROM ROWIDS (cr=360 pr=360 pw=0 time=66579 us)'&lt;br /&gt;STAT #2 id=7 cnt=357 pid=6 pos=1 obj=56969 op='INDEX RANGE SCAN T2_I3 (cr=360 pr=360 pw=0 time=65355 us)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Test 2 trace output (STAT lines only)&lt;br /&gt;&lt;pre name="code" class="sql"&gt;STAT #3 id=1 cnt=5 pid=0 pos=1 obj=56968 op='TABLE ACCESS BY INDEX ROWID BITMAP_T2 (cr=282 pr=4 pw=0 time=10833 us)'&lt;br /&gt;STAT #3 id=2 cnt=5 pid=1 pos=1 obj=0 op='AND-EQUAL  (cr=277 pr=0 pw=0 time=8651 us)'&lt;br /&gt;STAT #3 id=3 cnt=38 pid=2 pos=1 obj=56969 op='INDEX RANGE SCAN T2_I3 (cr=147 pr=0 pw=0 time=4553 us)'&lt;br /&gt;STAT #3 id=4 cnt=37 pid=2 pos=2 obj=56970 op='INDEX RANGE SCAN T2_I6 (cr=130 pr=0 pw=0 time=3614 us)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here's the result comparison &lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;BITMAP CONVERSION cr=395 pr=361 pw=0 time=78988 us&lt;br /&gt;AND-EQUAL         cr=282 pr=4   pw=0 time=10833 us&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I did a couple of simple count queries to verify how many rows matched each predicate.  You can also note the number of buffer accesses are required to satisfy each count.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SQL&gt; select /*+ gather_plan_statistics */ count(*) from bitmap_t2 where work = 45 ;&lt;br /&gt;&lt;br /&gt;       COUNT(*)&lt;br /&gt;---------------&lt;br /&gt;             32&lt;br /&gt;SQL&gt; @allstats_last&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;SQL_ID  9xbjw9v72xnty, child number 0&lt;br /&gt;-------------------------------------&lt;br /&gt;select /*+ gather_plan_statistics */ count(*) from bitmap_t2 where work = 45&lt;br /&gt;&lt;br /&gt;Plan hash value: 806960853&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation         | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;|   1 |  SORT AGGREGATE   |       |      1 |      1 |      1 |00:00:00.01 |      35 |&lt;br /&gt;|*  2 |   INDEX RANGE SCAN| T2_I6 |      1 |     32 |     32 |00:00:00.01 |      35 |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;   2 - access("WORK"=45)&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; select /*+ gather_plan_statistics */ count(*) from bitmap_t2 where hair = 5 ;&lt;br /&gt;&lt;br /&gt;       COUNT(*)&lt;br /&gt;---------------&lt;br /&gt;            357&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&gt; @allstats_last&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;SQL_ID  5h1vvmx6wd2j2, child number 0&lt;br /&gt;-------------------------------------&lt;br /&gt;select /*+ gather_plan_statistics */ count(*) from bitmap_t2 where hair = 5&lt;br /&gt;&lt;br /&gt;Plan hash value: 3466781003&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation         | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;|   1 |  SORT AGGREGATE   |       |      1 |      1 |      1 |00:00:00.03 |     360 |&lt;br /&gt;|*  2 |   INDEX RANGE SCAN| T2_I3 |      1 |    357 |    357 |00:00:00.03 |     360 |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;   2 - access("HAIR"=5)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;From this information, you can see that the buffer gets for a single predicate match the cr values in the bitmap plan.  So, what happened with the AND-EQUAL plan?  The STAT line rowsource totals for two INDEX RANGE SCAN operations in the AND-EQUAL plan don't seem to make any sense at all.  &lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;STAT #3 id=3 cnt=38 pid=2 pos=1 obj=56969 op='INDEX RANGE SCAN T2_I3 (cr=147 pr=0 pw=0 time=4553 us)'&lt;br /&gt;STAT #3 id=4 cnt=37 pid=2 pos=2 obj=56970 op='INDEX RANGE SCAN T2_I6 (cr=130 pr=0 pw=0 time=3614 us)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The index T2_I3 is on the hair column.  According to the counts, there are 357 rows where hair=5.  So, why does the execution information show 38 rows returned (cnt=38) and cr=147?  Further, why does the scan on the T2_I6 (work column) index show 37 rows returned and cr=130?  That makes no sense to me at all.  Anyway, as I said, I'll review the details of the AND-EQUAL plan in another post.&lt;br /&gt;&lt;br /&gt;Let's go back to the BITMAP AND plan.  I learned a lot from reviewing the trace file about how the BITMAP AND operation works.  Here's some of the content that shows you what's going on:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;-- Trace file excerpt&lt;br /&gt;&lt;br /&gt;qerbtStart(8217284): started&lt;br /&gt;qerbtStart(8228444): started&lt;br /&gt;qerbtStart(8228b0c): started&lt;br /&gt;qerbaStart(8217170): started&lt;br /&gt;qerbtFetch bitmap to rowids(8217284):&lt;br /&gt;qerbtFetch rowids to bitmap(8228444):&lt;br /&gt;kdibcoinit(82286b4): srid=011389bb.0000&lt;br /&gt;&lt;br /&gt;&lt;&lt; At this point a series of block gets were performed to read the T2_I6 index blocks &gt;&gt;&lt;br /&gt;&lt;br /&gt;kdibcoend(82286b4): erid=013252ea.0007status=0&lt;br /&gt;&lt;br /&gt;-- The following call is what shows up in the plan as the BITMAP CONVERSION FROM ROWIDS for T2_I6 (work) step&lt;br /&gt;qerbtFetch out bitmap(8228444): bml 127 srid=011389bb.0000, erid=013252ea.0007 objn 56968&lt;br /&gt;&lt;br /&gt;-- The following line shows the starting (srid) and ending (erid) rowids for rows where work = 45 (from index T2_I6)&lt;br /&gt;kdibr1r2r(8217184): bml 127 srid=011389bb.0000, erid=013252ea.0007&lt;br /&gt;&lt;br /&gt;kdibci3init(8351904): src_stream=a4bd1ac&lt;br /&gt;&lt;br /&gt;qerbtFetch rowids to bitmap(8228b0c):&lt;br /&gt;&lt;br /&gt;&lt;&lt; At this point a series of block gets were performed to read the T2_I3 index blocks &gt;&gt;&lt;br /&gt;&lt;br /&gt;kdibcoend(8228d7c): erid=01325308.0007status=0&lt;br /&gt;&lt;br /&gt;-- The following call is what shows up in the plan as the BITMAP CONVERSION FROM ROWIDS for T2_I3 (hair) step&lt;br /&gt;qerbtFetch out bitmap(8228b0c): bml 1054 srid=011389bb.0000, erid=01325308.0007 objn 56968  &lt;br /&gt;&lt;br /&gt;-- The following line shows the starting (srid) and ending (erid) rowids for rows where hair = 5 (from index T2_I3)&lt;br /&gt;kdibr1r2r(8217184): bml 1054 srid=011389bb.0000, erid=01325308.0007&lt;br /&gt;&lt;br /&gt;kdibci3init(8351938): src_stream=a4bd1ac&lt;br /&gt;&lt;br /&gt;-- The following call is setting up the BITMAP AND with the info collected from the two indexes&lt;br /&gt;kdibc3init(8217198): buf(16116)=83527b0, srid=011389bb.0000&lt;br /&gt;kdibc3end(8217198)&lt;br /&gt;&lt;br /&gt;-- The following call is what shows up in the plan as the BITMAP AND step in the plan&lt;br /&gt;kdibr2s2r out bitmap(8217184): bml 6 srid=011389bb.0000, erid=01325108.0007   &lt;br /&gt;&lt;br /&gt;-- The following shows the final range of rowids that will need to be fetched &lt;br /&gt;kdibr1r2r(8217298): bml 19 srid=011389bb.0000, erid=01325108.0007 &lt;br /&gt;kdibci3init(82172ac): src_stream=a4bd354&lt;br /&gt;&lt;br /&gt;-- The following call shows the number of rows to be retrieved (5) and lists their rowid&lt;br /&gt;kdibc3sids(82172ac): want=57, got=5&lt;br /&gt; 011389bb.0000 01138bec.0000 01138e1f.0000 01139050.0000&lt;br /&gt; 01325108.0000&lt;br /&gt;&lt;br /&gt;-- This call fetches the first rowid from the list&lt;br /&gt;qerbtFetch(8217284): rowid=011389bb.0000 tobj 56968&lt;br /&gt;&lt;br /&gt;-- DATA block cr 0x011389bb is fetched here&lt;br /&gt;&lt;br /&gt;-- Then, the first FETCH line is emitted to the trace data.  &lt;br /&gt;-- Note that it shows cr=396.  That's the total of T2_I6 index block reads plus&lt;br /&gt;-- T2_I3 index block reads plus the 1 data block read that just occurred.&lt;br /&gt;&lt;br /&gt;FETCH #2:c=15625,e=78684,p=361,cr=396,cu=0,mis=0,r=1,dep=0,og=1,tim=84895456678&lt;br /&gt;&lt;br /&gt;-- The next series of calls gets the remaining 4 rows from the list above. &lt;br /&gt;qerbtFetch bitmap to rowids(8217284):&lt;br /&gt;qerbtFetch(8217284): rowid=01138bec.0000 tobj 56968&lt;br /&gt;-- DATA block cr 0x01138bec is fetched here&lt;br /&gt;qerbtFetch bitmap to rowids(8217284):&lt;br /&gt;qerbtFetch(8217284): rowid=01138e1f.0000 tobj 56968&lt;br /&gt;-- DATA block cr 0x01138e1f is fetched here&lt;br /&gt;qerbtFetch bitmap to rowids(8217284):&lt;br /&gt;qerbtFetch(8217284): rowid=01139050.0000 tobj 56968&lt;br /&gt;-- DATA block cr 0x01139050 is fetched here&lt;br /&gt;qerbtFetch bitmap to rowids(8217284):&lt;br /&gt;qerbtFetch(8217284): rowid=01325108.0000 tobj 56968&lt;br /&gt;-- DATA block cr 0x01325108 is fetched here&lt;br /&gt;qerbtFetch bitmap to rowids(8217284):&lt;br /&gt;kdibc3sids(82172ac): want=57, got=0&lt;br /&gt;&lt;br /&gt;-- The 2nd, and final, FETCH line is emitted showing the 4 block&lt;br /&gt;-- accesses for the remaining rows.&lt;br /&gt;&lt;br /&gt;FETCH #2:c=0,e=735,p=1,cr=4,cu=0,mis=0,r=4,dep=0,og=1,tim=84895457801&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, here's the bottom-line with BITMAP AND plans as best I can decipher from my tests:  &lt;br /&gt;1)  The index blocks are all read first and the applicable rows (i.e. ROWIDs) matching the predicate are placed into memory.  The first FETCH line emitted by the 10046 trace shows the reads (cr and pr) that count these index blocks being collected.&lt;br /&gt;2)  A separate memory area is associated with each INDEX that is involved.&lt;br /&gt;3)  The index ROWIDs are converted to bitmaps.&lt;br /&gt;4)  Once all the index ROWIDs are collected and converted, they are AND'ed together to produce a final bitmap that represents the range of ROWIDs needed for the result.&lt;br /&gt;5)  That final bitmap is converted back to a list of ROWIDs.&lt;br /&gt;6)  Each ROWID on the list is then retrieved.  This is where the data blocks are retrieved.  You'll see just a cr (consistent read) or a cr and a pr (physical read) if the block isn't already in the buffer cache.&lt;br /&gt;&lt;br /&gt;So, what you should see is that the first FETCH (10046 trace data) will have the stats for the collection of all the index blocks needed and placing them into memory.  After that, only data blocks are read.  &lt;br /&gt;&lt;br /&gt;It makes sense when I look at now.  I still don't quite understand what happened in the original case noted in my earlier post, but I believe I've come a long way in my understanding of how bitmap conversion operations function.&lt;br /&gt;&lt;br /&gt;For those geeks out there like me who really find this interesting and want to do the tests yourself, please have at it!  I'd love to hear back from you if you get contradictory results or if your understanding of how the process is working is different than mine.  I was able to reproduce my tests with larger data sets but it would be great if you get another set of results you would share.  Let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2122298762263081097?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2122298762263081097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2122298762263081097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2122298762263081097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2122298762263081097'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2009/01/round-2-bitmap-and.html' title='Round 2:  BITMAP AND'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2373955473637307032</id><published>2008-12-29T13:15:00.000-05:00</published><updated>2008-12-29T13:21:36.325-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BITMAP AND'/><category scheme='http://www.blogger.com/atom/ns#' term='AND-EQUAL'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>AND-EQUAL vs BITMAP AND</title><content type='html'>My friend and colleague, Jan, sends me some great SQL performance issues from time to time.  He and I had an email exchange around the Christmas holiday that was another interesting case so I thought I'd share it.&lt;br /&gt;&lt;br /&gt;First a bit of background info.  The problem query is running under both 9i and 10g database versions.  On 9i, the query runs in about .5 secs and uses a AND-EQUAL operation.  However, on version 10, the optimizer chooses a BITMAP AND operation and converts the b-tree indexes to bitmaps first.  This is where the problem lies.  The v10 optimizer choice to use the BITMAP AND operation increases the response time for the query to almost 1 minute (56.5 secs).&lt;br /&gt;&lt;br /&gt;I recall that 10g deprecated the AND-EQUAL operation and will now choose this "index combine" operation using bitmap conversions instead most of the time.  However, I also recall having read about performance issues occurring at times with this choice.  I've seen a couple of tricks to work-around this problem.  One is to set the optimizer_features_enable parameter to 9.2.0 in the session before executing the query (many times with a logon trigger).  The other would be to split up the query into two queries using UNION ALL to put them together.  &lt;br /&gt;&lt;br /&gt;As you'll see below in the details, in v10 the majority of the time is spent in the plan step that converts the rowids of the b-tree index to bitmaps.  But, the part that I'm not sure of (and haven't built a test case yet for review) is why the INDEX RANGE SCAN that provides the rowids to the bitmap conversion accesses so many more blocks than the range scan for the AND-EQUAL operation.  &lt;br /&gt;&lt;br /&gt;Now for the details:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select  count(item_t.poid_id0)&lt;br /&gt;from    item_t                           -- num_rows 5,095,494&lt;br /&gt;where 1=1&lt;br /&gt;and   item_t.ar_billinfo_obj_ID0 = :1    -- num_distinct 599,778&lt;br /&gt;and   item_t.ar_bill_obj_ID0     = :2    -- num_distinct 3,155,282&lt;br /&gt;&lt;br /&gt;Bind variable values:  &lt;br /&gt;:1 = 53&lt;br /&gt;:2 = 10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The query under 9i uses AND-EQUAL as shown in the STAT lines from collected trace data:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=79 pr=23 pw=0 time=514521 us)'&lt;br /&gt;STAT #2 id=2 cnt=6 pid=1 pos=1 obj=352589 op='TABLE ACCESS BY INDEX ROWID ITEM_T (cr=79 pr=23 pw=0 time=162835 us)'&lt;br /&gt;STAT #2 id=3 cnt=6 pid=2 pos=1 obj=0 op='AND-EQUAL (cr=76 pr=20 pw=0 time=142399 us)'&lt;br /&gt;STAT #2 id=4 cnt=21 pid=3 pos=1 obj=368525 op='INDEX RANGE SCAN I_ITEM_AR_BNFO_OBJ__ID (cr=36 pr=1 pw=0 time=13924 us)'&lt;br /&gt;STAT #2 id=5 cnt=16 pid=3 pos=2 obj=368532 op='INDEX RANGE SCAN I_ITEM_AR_BILL_OBJ__ID (cr=40 pr=19 pw=0 time=101036 us)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Under 10g, using default settings the query uses a BITMAP AND plan:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=9688 pr=9519 pw=0 time=56554617 us)'&lt;br /&gt;STAT #2 id=2 cnt=6 pid=1 pos=1 obj=352589 op='TABLE ACCESS BY INDEX ROWID ITEM_T (cr=9688 pr=9519 pw=0 time=56554575 us)'&lt;br /&gt;STAT #2 id=3 cnt=6 pid=2 pos=1 obj=0 op='BITMAP CONVERSION TO ROWIDS (cr=9685 pr=9519 pw=0 time=56554533 us)'&lt;br /&gt;STAT #2 id=4 cnt=1 pid=3 pos=1 obj=0 op='BITMAP AND (cr=9685 pr=9519 pw=0 time=56554480 us)'&lt;br /&gt;STAT #2 id=5 cnt=1 pid=4 pos=1 obj=0 op='BITMAP CONVERSION FROM ROWIDS (cr=3 pr=0 pw=0 time=128 us)'&lt;br /&gt;STAT #2 id=6 cnt=22 pid=5 pos=1 obj=368525 op='INDEX RANGE SCAN I_ITEM_AR_BNFO_OBJ__ID (cr=3 pr=0 pw=0 time=90 us)'&lt;br /&gt;STAT #2 id=7 cnt=6 pid=4 pos=2 obj=0 op='BITMAP CONVERSION FROM ROWIDS (cr=9682 pr=9519 pw=0 time=46814337 us)'&lt;br /&gt;STAT #2 id=8 cnt=530398 pid=7 pos=1 obj=368532 op='INDEX RANGE SCAN I_ITEM_AR_BILL_OBJ__ID (cr=9682 pr=9519 pw=0 time=67896016 us)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Notice how both of them use INDEX RANGE SCAN I_ITEM_AR_BILL_OBJ__ID, but the bitmap plan is doing 9682 cr against 40 for the and-equal.  Why would that be the case?&lt;br /&gt;&lt;br /&gt;My guess for the increased cr's comes from seeing cnt=530398 in step 8 of the bitmap plan where the index range scan occurs.  That step is returning over half a million rows from the index that then are converted by the parent step 7.  The parent ends up with cnt=6.  What that says to me is that the conversion happened for the half million rowids and then were filtered to end up with only 6.  But in the and-equal plan, the index range scan only returned cnt=16.  I can see the behavior, my question is why?  What's really going on?  If any of you have the answer to that question, I'd appreciate hearing from you.  I promise to test it for myself too!  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2373955473637307032?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2373955473637307032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2373955473637307032' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2373955473637307032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2373955473637307032'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/12/and-equal-vs-bitmap-and.html' title='AND-EQUAL vs BITMAP AND'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-8328665834116916137</id><published>2008-12-19T13:32:00.000-05:00</published><updated>2008-12-19T13:41:40.289-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Performance optimization (or not) on a snowy day</title><content type='html'>A friend sent me this and it totally cracked me up.  It's an excellent example of how working on the wrong thing is a bad idea.  It doesn't matter how good you think the results of your efforts are, if you've been working on the wrong thing, you've just wasted a lot of time and effort.  This also goes to show you that optimizing performance is not just a database challenge, but an every day challenge!&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-1ec93b3ffa42212e" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v12.nonxt1.googlevideo.com/videoplayback?id%3D1ec93b3ffa42212e%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330183149%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D1A7A457FF4F9000B48B6CA7868D584CC4FE4AB1B.73EE3366101401FDE88700039788BA6B08A65285%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D1ec93b3ffa42212e%26offsetms%3D5000%26itag%3Dw160%26sigh%3DWlgMo-Du3KZKJjDRqz26oB7YggE&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v12.nonxt1.googlevideo.com/videoplayback?id%3D1ec93b3ffa42212e%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330183149%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D1A7A457FF4F9000B48B6CA7868D584CC4FE4AB1B.73EE3366101401FDE88700039788BA6B08A65285%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D1ec93b3ffa42212e%26offsetms%3D5000%26itag%3Dw160%26sigh%3DWlgMo-Du3KZKJjDRqz26oB7YggE&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-8328665834116916137?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=1ec93b3ffa42212e&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/8328665834116916137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=8328665834116916137' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8328665834116916137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8328665834116916137'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/12/performance-optimization-or-not-on.html' title='Performance optimization (or not) on a snowy day'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2513925592655005337</id><published>2008-12-01T22:57:00.000-05:00</published><updated>2008-12-01T23:42:21.517-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unsubscribe'/><title type='text'>Unsubscribe</title><content type='html'>Today I tried to unsubscribe myself from a mailing list that I'm not sure how I got on.  I'm typically very careful about where I use my main work and personal email addresses so as to keep my Inbox from being flooded with junk email.  But, I still occasionally find myself receiving emails that I just don't want to receive.&lt;br /&gt;&lt;br /&gt;This was the case today when I attempted to unsubscribe from one such list.  I clicked on the Unsubscribe link provided in the email and was taken to a page that showed my email address and a list of about 30 different mailing lists that I was (or could be) subscribed to.  Out of the full list, two check boxes were marked.  Since I didn't know about the other one that was marked, I thought this was good fortune that I could now unsubscribe to both on this one screen.  So, I unchecked the boxes and selected the radio button at the bottom of the page that was labeled "Please remove me from all the above lists" and clicked Update.  &lt;br /&gt;&lt;br /&gt;I was a bit disturbed that I didn't get any confirmation message, but closed the browser and went about my business.  Less than 5 minutes later, I got a rush of about 30 emails in a row.  Yes, that's right...30.  Guess where they were from?  They were all email lists that were on the list where I'd just requested to be removed from all lists.&lt;br /&gt;&lt;br /&gt;Well, that's precisely the opposite behavior that I wanted and expected.  Instead of being removed from all lists, it appeared that I had been added.  After a moment of thought, I decided that perhaps I had uncovered a bug in the unsubscribe program and created the problem myself by unchecking the boxes before I selected the "remove from all" option.  I'm not happy at this point, but OK...I can fix this...I'll just unsubscribe again.  &lt;br /&gt;&lt;br /&gt;So, I click on the Unsubscribe link in the first email of the 30 I'd just received.  This time I'm presented with an entirely different list of about 30 other mailing lists with the difference now being that the one list I want to unsubscribe from is one of the 30.  Crap!  I'm now thinking that means that I may actually have to go to all 30 emails and unsubscribe individually from each.  Sigh...&lt;br /&gt;&lt;br /&gt;This time, I leave the box beside the list I just received an email from and notice that at the bottom, there is another choice (besides the remove from all lists one).  It says "Please remove me from all lists affiliated with the sender".  I'm a bit afraid after my previous experience but I think "hey...maybe this will save me from having to go to all of the 29 other emails and unsubscribe there".  So, I choose that option and click Update.  Once again, I do *not* get a confirmation as to what changes, if any, were made from my update request.  So, I decide to just keep the browser window open for a while and wait and see if I get another rush of emails.&lt;br /&gt;&lt;br /&gt;After 10 minutes pass, I'm starting to feel pretty happy that I'd safely unsubscribed and closed the browser window I'd kept open just in case.  I also deleted the 29 other emails I'd received.  It's lunch time so I leave my computer for about 45 minutes.&lt;br /&gt;&lt;br /&gt;Upon my return from my lunch, I notice the unread email count in my Inbox says 67.  What the heck?  As I looked over the list of emails, they were all emails requesting that I "click on this link" to confirm my request to unsubscribe to that particular list.  I'm usually a very patient and easy-going person, but this is just too much for me.  If I had access to whoever was sending me on this wild goose chase, I'd throttle them!  I'm NOT happy.  As a matter of fact, I'm royally hacked off!  All I wanted to do was unsubscribe to one list and now I've been subscribed to a boatload more that all want me to confirm my desire to unsubscribe.  Crap, crap, crap!&lt;br /&gt;&lt;br /&gt;I swear to you that if I had clicked on the link to confirm my choice to unsubscribe and had been taken to that same screen again, I would've lost it.  Fortunately for me (and my nearby possessions which would likely have suffered from my wrath), I was simply taken to a screen that showed my email address and a message saying that my email address would be removed from the list within 48 hours.&lt;br /&gt;&lt;br /&gt;I had to do this 65 times (the other two emails in my Inbox were actually real business stuff!).  I got through all this mess in less than an hour of my time, but that's nearly an hour out of my day that could've been much more productively spent!  I wish I could bill whoever these folks were behind this fiasco for my lost time.  Geesh!&lt;br /&gt;&lt;br /&gt;The bottom-line here is that the whole process was absolutely not warranted.  The list holder should've been able to unsubscribe me immediately from the original link in the original email.  Unsubscribe means unsubscribe!  Don't ask me about 30 other lists or if I want to subscribe to others, or be removed from all, or any of that stuff.  Just take my address OFF the stupid list I've just clicked on the link about.  What's so hard about that?!?  And, why oh why, in this day and age, do I have to wait up to 48 hours before you will take me off your lists?!  I get the whole distributed processing thing, but come on people!  If they can send out new, "welcome to our list" emails almost immediately to new subscribers, these folks can certainly take my email address out of their system equally as fast.  Besides, who's going to be more upset?  Me, who wants off the stupid list but keeps getting emails after I've requested to be unsubscribed, or a new subscriber who has never received anything from you yet at all and has to wait a day or two?&lt;br /&gt;&lt;br /&gt;I don't know about you all, but I'm sick and tired of being subscribed to lists I've never heard of.  There are a few sites from which I have requested to be notified, but there are multitudes more that I care absolutely nothing about.  All I feel I can do is scream out to the universe to STOP THE MADNESS!  If you hear a sonic boom coming from the Pacific Northwest in the near future, it may just be me...imploding after having received another unwanted email.  &lt;br /&gt;&lt;br /&gt;In the meantime, I'm just doing some deep breathing exercises and trying to stop my mental thrashing of this particular list vendor.  Surely it can't be good for my blood pressure.  Sigh....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2513925592655005337?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2513925592655005337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2513925592655005337' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2513925592655005337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2513925592655005337'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/12/unsubscribe.html' title='Unsubscribe'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5129331538134602376</id><published>2008-11-21T12:45:00.000-05:00</published><updated>2008-11-21T12:47:42.709-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thanksgiving'/><category scheme='http://www.blogger.com/atom/ns#' term='Charles Schultz'/><title type='text'>The Charles Schultz Philosophy</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbwq4W0tWI/AAAAAAAAAHc/Oh1JRFGiFIk/s1600-h/snoopy-birds-hike.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 316px; height: 200px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbwq4W0tWI/AAAAAAAAAHc/Oh1JRFGiFIk/s400/snoopy-birds-hike.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5271165033357030754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The following is a philosophy of life attributed to Charles Schulz, the creator of the 'Peanuts' comic strip. You don't have to actually answer the questions to get the point. Just ponder on them. &lt;br /&gt;&lt;br /&gt;1. Name the five wealthiest people in the world. &lt;br /&gt;2. Name the last five Heisman trophy winners. &lt;br /&gt;3. Name the last five winners of the Miss America pageant. &lt;br /&gt;4. Name ten people who have won the Nobel or Pulitzer Prize. &lt;br /&gt;5. Name the last half dozen Academy Award winners for best actor and actress. &lt;br /&gt;6. Name the last decade's worth of World Series winners. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbw19RYqSI/AAAAAAAAAHk/-huRd15IKDk/s1600-h/charlie-brown-snoopy-on-dock.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbw19RYqSI/AAAAAAAAAHk/-huRd15IKDk/s400/charlie-brown-snoopy-on-dock.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271165223654959394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How did you do? The point is, few of us remember the headliners of yesterday. These are no second-rate achievers. They are the best in their fields. But the applause dies.  Awards tarnish. Achievements are forgotten. Accolades and certificates are buried with their owners.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SSbxIhJ8tFI/AAAAAAAAAHs/Ho4LCcAq_ts/s1600-h/snoopy-drawing.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 143px; height: 150px;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SSbxIhJ8tFI/AAAAAAAAAHs/Ho4LCcAq_ts/s400/snoopy-drawing.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5271165542525088850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's another set of questions. See how you do with these: &lt;br /&gt;&lt;br /&gt;1. List a few teachers who aided your journey through school. &lt;br /&gt;2. Name three friends who have helped you through a difficult time. &lt;br /&gt;3. Name five people who have taught you something worthwhile. &lt;br /&gt;4. Think of a few people who have made you feel appreciated and special. &lt;br /&gt;5. Think of five people you enjoy spending time with.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbxjZbmYKI/AAAAAAAAAH0/N1p6QfNzlbM/s1600-h/peanuts-party.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 260px; height: 177px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbxjZbmYKI/AAAAAAAAAH0/N1p6QfNzlbM/s400/peanuts-party.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5271166004308107426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Easier? &lt;br /&gt;   &lt;br /&gt;The lesson: &lt;br /&gt;The people who make a difference in your life are not the ones with the most credentials...the most money...or the most awards. They simply are the ones who care the most.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbx9VtqnXI/AAAAAAAAAH8/P55CRXTGYC4/s1600-h/shoulder-carry.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 239px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbx9VtqnXI/AAAAAAAAAH8/P55CRXTGYC4/s400/shoulder-carry.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271166449986739570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For me, I thought this was something good to ponder on the weekend before Thanksgiving.  I realized how easy it was for me to answer the second set of questions and how many people have touched my life.  There have been family, friends, teachers, mentors, and colleagues who have given me something of themselves.  I feel very, very thankful and my life is richer.&lt;br /&gt;&lt;br /&gt;So, what are you thankful for?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSb0EsgVf8I/AAAAAAAAAIE/4OFTA5igTZs/s1600-h/snoopy-dancing.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 98px; height: 146px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSb0EsgVf8I/AAAAAAAAAIE/4OFTA5igTZs/s400/snoopy-dancing.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5271168775387185090" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5129331538134602376?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5129331538134602376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5129331538134602376' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5129331538134602376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5129331538134602376'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/11/charles-schultz-philosophy.html' title='The Charles Schultz Philosophy'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gB2tAQrrKSw/SSbwq4W0tWI/AAAAAAAAAHc/Oh1JRFGiFIk/s72-c/snoopy-birds-hike.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-1374874159389486935</id><published>2008-11-17T22:31:00.001-05:00</published><updated>2008-11-17T22:45:23.616-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database independence'/><title type='text'>One last hurrah on database independence</title><content type='html'>I had mentioned in my &lt;a href="http://karenmorton.blogspot.com/2008/11/database-independence.html" target="blank"&gt;previous post&lt;/a&gt; on database independence about Toon Koppelaars presentation on a database centric approach to application development.  I contacted him and he said he was going to post his presentation on his site soon.  But in the meantime, I thought I'd show one of his slides which I think speaks volumes to the performance aspects of trying to keep with a database independent approach.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSI3m74ErzI/AAAAAAAAAHU/Woq8JtTlGPI/s1600-h/scr.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SSI3m74ErzI/AAAAAAAAAHU/Woq8JtTlGPI/s400/scr.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5269835656024338226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The slide shows:&lt;br /&gt;a) If you put business logic in the mid tier, you’ll call the dbms an order of magnitude more.&lt;br /&gt;b) If you also put data logic in the mid tier, you’ll call the dbms two orders of magnitude more.&lt;br /&gt;c) Finally, if you also don’t use SQL effectively, you’ll call the dbms three orders of magnitudes more.&lt;br /&gt;&lt;br /&gt;So, a single click on a "Save" button by the user can ultimately mean 100 calls the dbms has to execute to handle all the middle tier madness!&lt;br /&gt;&lt;br /&gt;You should be able to download Toon's full presentation from &lt;a href="http://www.rulegen.com/pls/apex/f?p=14265:81:3245285396448740::NO:::" target="blank"&gt;RuleGen.com&lt;/a&gt; very soon.  Give it a look...it's good stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-1374874159389486935?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/1374874159389486935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=1374874159389486935' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1374874159389486935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1374874159389486935'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/11/one-last-hurrah-on-database.html' title='One last hurrah on database independence'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gB2tAQrrKSw/SSI3m74ErzI/AAAAAAAAAHU/Woq8JtTlGPI/s72-c/scr.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4194741662499804007</id><published>2008-11-12T22:30:00.000-05:00</published><updated>2008-11-12T22:53:09.372-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database independence'/><title type='text'>Database Independence?!</title><content type='html'>OK.  Call me dense.  Call me biased.  Call me performance conscious.  But I just can't groove on the concept of database independence.  You know what I mean?  The whole idea of having all your application logic built into your application and the database does basically nothing...well, it just doesn't make sense. Even after hearing all the arguments, I just don't get it. &lt;br /&gt;&lt;br /&gt;There are so many optimizations that can't be utilized when the database isn't involved.  The database ends up serving back boatloads of "simple" query results (usually max of 2-3 tables per query and mostly single table queries) and the application does everything else.  The application basically processes the joins, applies the constraints...everything.  What would amount to simple work that could occur in minimal time for Oracle, amounts to seconds of time processing the data at the application layer.  Heck...if you're gonna do that, why not just have flat files to store your data and skip the database all together!?  It'd sure save you a bundle on Oracle license fees!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rulegen.com"&gt;Toon Koppelaars&lt;/a&gt; recently delivered a presentation at Miracle Oracle Open World that I attended that was about a database centric approach.  I hope he'll post it somewhere soon for "public consumption" as it makes an extremely strong argument for going towards a "fat" database and getting the bulk of logic and function out of the application layer.  Amen brother!&lt;br /&gt;&lt;br /&gt;I'm ranting, so I'll stop.  But, I'd love to hear from you about your thoughts.  I'm an open-minded kinda gal, but when it comes down to it, I find all the reasons people share with me about why they absolutely have to write database independent code and put all the code in their application layer to be just a bunch of excuses.  They are excuses that cover up 1) lack of sufficient knowledge of the databases they want to use and 2) a preference for what they think is easy.  I mean, when you have a stable full of developers who can code Java fast and furious, but have been taught to not care about the database, designing for a database centric approach just isn't the forte...so it doesn't happen.  But, when performance problems start to occur, they want to blame the database.  Again...I just don't get it.&lt;br /&gt;&lt;br /&gt;Can anyone help me out here?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4194741662499804007?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4194741662499804007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4194741662499804007' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4194741662499804007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4194741662499804007'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/11/database-independence.html' title='Database Independence?!'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5675048920332282871</id><published>2008-11-01T18:30:00.000-04:00</published><updated>2008-11-01T18:57:49.411-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Recent Presentations</title><content type='html'>I've posted my most recent presentations from Miracle Oracle Open World in Denmark and the OPP2008 (Oracle PL/SQL Programming Conference) in Chicago to &lt;a href="http://www.slideshare.net/"&gt;SlideShare&lt;/a&gt;.  By the way, SlideShare is pretty cool if you've never seen or used it.  It's a great way to easily share presentations.  You can also add audio to create SlideCasts.  I'm thinking of adding an audio track over the presentations I've already uploaded, but that'll have to wait until I have more time to do so.  So much to do...so little time!&lt;br /&gt;&lt;br /&gt;I've also added a link to my blog sidebar that will access all my presentations I upload to SlideShare.  So, after this post ages off my main blog page, it'll be easy to find them from the sidebar link.  I plan to post all my presentations there after I've delivered them.&lt;br /&gt;&lt;br /&gt;To access the presentation you want, just choose the name of the presentation on the right side and it will display in the view area on the left.  Happy viewing!&lt;br /&gt;&lt;br /&gt;&lt;div style="width:540px;margin:auto;"&gt;&lt;object style="margin:0px" width="538" height="341"&gt;&lt;param name="movie" value="http://static.slideshare.net.s3.amazonaws.com/swf/egowidget2.swf"/&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net.s3.amazonaws.com/swf/egowidget2.swf" flashVars="feedurl=user/krmorton&amp;widgettitle=Presentations" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="538" height="341"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;text-align:left;"&gt;&lt;a href="http://www.slideshare.net/?src=egowidget"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/&gt;&lt;/a&gt; | &lt;a href="http://www.slideshare.net/widgets/presentation-pack" title="Get your Presentation Pack"&gt;Get your Presentation Pack&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5675048920332282871?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5675048920332282871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5675048920332282871' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5675048920332282871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5675048920332282871'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/11/recent-presentations.html' title='Recent Presentations'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-755029132275989612</id><published>2008-10-29T19:00:00.000-04:00</published><updated>2008-10-29T19:25:31.120-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOOW'/><category scheme='http://www.blogger.com/atom/ns#' term='Denmark'/><title type='text'>Miracle Oracle Open World</title><content type='html'>My first trip to Denmark was most excellent.  The good folks at Miracle were great hosts and the event was unique in many ways.  I delivered two presentations and heard several others that were superb.  Jonathan Lewis delivered an excellent session (well, 2 actually) on hints and Tanel Poder's presentation on advanced troubleshooting was top notch.  My only regret is that I didn't get to see all the presentations.  It never fails that when I speak at a conference there is a session being delivered that I want to see at the same time as my presentation.  That was once again true.  I missed Robyn Sands presentation on variance, but was lucky enough to be able to chat with her about it a bit over dinner.  &lt;br /&gt;&lt;br /&gt;One of the things that I found unique about the Miracle event was the amount of time available to network, meet new people and talk.  Each evening dinner was a multi-hour affair fueled by excellent conversation.  Oh, and the food and drink were excellent too and were made available in very large quantity!  One thing that can be said for sure about Miracle is that they don't skimp on quality or quantity!&lt;br /&gt;&lt;br /&gt;Besides the event itself, I had the opportunity for exposure to a new place.  Since it was my first trip to Denmark, I thought I'd share a few things that I noted.&lt;br /&gt;1.  They have some seriously cool doors there.  Yep, that's right...doors.  Some of the doors don't have the traditional door lock/dead bolt combination that I'm used to.  Instead, the doors lock closed by lifting the handle up and the door then vacuum seals or something like that.  I was too impressed by it that I didn't even bother to look closely at how the mechanism works, but it is seriously cool.  I want doors like that at my house.&lt;br /&gt;&lt;br /&gt;2.  The public water closets had doors that were about 8 feet tall starting about 1 inch off the ground.  OK.  This may seem silly for that to be something I noticed, but being 6'4, I almost always find the top and bottom 1/3 of my body is visible in most ladies rooms.  Let's just say I liked not having my head waving over the door like a giraffe for once!&lt;br /&gt;&lt;br /&gt;3.  The traffic signals not only go Green-Yellow-Red, but Red-Yellow-Green as well.  That way if you're stopped, you know when the light is about to change.  I'd like that in the US.  I often find myself leaning to see the other side of the light so I can tell when the change is coming.  New traffic signals would eliminate much neck strain on my part.&lt;br /&gt;&lt;br /&gt;4.  Danish currency is cool.  Of course, practically any country outside the US has cooler money than we do.  US currency is so dull.  Doing currency exchange math is a bit tedious, but I pretty much figured it out:  2 million Danish kroner used to equal 1 US dollar, but now it's the other way around (given our current financial state here in the US).  On the first evening of the event, the Americans were offered a collection of US dollars from our Danish friends.  They gave the half dozen of us about $14 total to split amongst ourselves to help us through the current tough times.  :)&lt;br /&gt;&lt;br /&gt;5.  Denmark is flat.  I was told the highest points in the whole country are only about 150 and 170 meters high.  Heck, that wouldn't even qualify as a bump in the road in Tennessee where I grew up!  Oh, and the funny thing is that they actually call one of those places "Sky Mountain".  &lt;br /&gt;&lt;br /&gt;6.  Danes are quiet, thoughtful, and reserved.  Not!  I've never met a more party-hearty bunch!  I will say that they're fairly quiet during the day, but as dusk comes, they gear up to a whole other level.  Not a dull moment!  To be fair, I have to say that perhaps not all Danes are of the same genre as those attending the Miracle event, but the good folks I met sure weight the average to the fun side.  :)&lt;br /&gt;&lt;br /&gt;7.  Danish hot dogs look very odd (to my American eye), but taste yummy.  We stopped in downtown Copenhagen and partook of a vendor stand hot dog on the day before our departure.  I didn't watch how it was made, nor look at it closely before taking a bite.  It's one of those things where it's just better not to know.  I found this &lt;a href="http://www.youtube.com/watch?v=6WJuJ_AQqqA&amp;NR=1"&gt;YouTube video&lt;/a&gt; that after watching it makes me glad I didn't look at what I was eating!  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I know there's a lot more I could add but you get the idea.  I loved my trip and hope to return before too long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-755029132275989612?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/755029132275989612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=755029132275989612' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/755029132275989612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/755029132275989612'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/10/miracle-oracle-open-world.html' title='Miracle Oracle Open World'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3898192675438374791</id><published>2008-10-17T13:49:00.000-04:00</published><updated>2008-10-25T12:04:22.542-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimizer statistics'/><title type='text'>Statistics musings</title><content type='html'>I've been thinking about a few problems that seem to turn up with Oracle query optimization lately.  Jonathan Lewis &lt;a href="http://jonathanlewis.wordpress.com/2008/10/14/going-too-fast/"&gt;posted&lt;/a&gt; on one case where the high value statistic was likely "off" at times and caused the plans to switch between good and bad.  I had recently seen a similar case where a new partition was added each day and query plans that involved the new partition would pick the wrong index due to a high value problem.  The stats were manually set to help fix it.  &lt;br /&gt;&lt;br /&gt;Anyway, these situations and several others I've seen have got me to wondering about whether or not using dynamic stats collections more aggressively would help some of these types of problems.  I mean, if stats were missing and dynamic sampling kicked in, could/would better plans be derived more frequently?&lt;br /&gt;&lt;br /&gt;I'm going to set up a set of tests to see where these musings take me, but I thought I'd mention it first to see if anyone has any experience with doing this and what kinds of results you've seen.  If you have any input, let me hear from you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3898192675438374791?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3898192675438374791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3898192675438374791' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3898192675438374791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3898192675438374791'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/10/statistics-musings.html' title='Statistics musings'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7600825388013649468</id><published>2008-10-08T14:10:00.000-04:00</published><updated>2008-10-08T14:13:41.757-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>None of it works!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SOz2FYAVzAI/AAAAAAAAAGI/bCMaVWM4HUw/s1600-h/scr-3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SOz2FYAVzAI/AAAAAAAAAGI/bCMaVWM4HUw/s400/scr-3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254845437438184450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A friend of mine sent this to me.  Oh how true it is!  Don't you just hate getting those cutesy emails that promise you to have eternal youth and good fortune if you only would forward the email on to 10 of your friends?  &lt;br /&gt;&lt;br /&gt;OK, I admit that I've done it once or twice.  And for those of you who have been on the receiving end, please allow me to apologize.  I guess there have just been moments when I really wanted what was promised to be granted to me.  And if it only meant forwarding on one little email, then what's the harm, right?&lt;br /&gt;&lt;br /&gt;Harumph!  Hope may spring eternal, but there is a line between hope and not being rational.&lt;br /&gt;&lt;br /&gt;Not that I'm against hoping and wishing for things that I want to happen, but in regard to this particular method of achieving my dreams, I think from now on I'm simply going to reply to the sender with this graphic.  Then, I'll go buy a lottery ticket.&lt;br /&gt;&lt;br /&gt;:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7600825388013649468?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7600825388013649468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7600825388013649468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7600825388013649468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7600825388013649468'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/10/none-of-it-works.html' title='None of it works!'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SOz2FYAVzAI/AAAAAAAAAGI/bCMaVWM4HUw/s72-c/scr-3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5563917599355001946</id><published>2008-10-03T17:52:00.000-04:00</published><updated>2008-10-03T17:55:04.721-04:00</updated><title type='text'>Something to ponder...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SOaUVTkRapI/AAAAAAAAAGA/Sz145MS2GQU/s1600-h/wwyd.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SOaUVTkRapI/AAAAAAAAAGA/Sz145MS2GQU/s400/wwyd.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253049109124835986" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5563917599355001946?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5563917599355001946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5563917599355001946' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5563917599355001946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5563917599355001946'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/10/something-to-ponder.html' title='Something to ponder...'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SOaUVTkRapI/AAAAAAAAAGA/Sz145MS2GQU/s72-c/wwyd.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4287057328461451545</id><published>2008-10-01T23:15:00.000-04:00</published><updated>2008-10-01T23:15:00.942-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Learning'/><title type='text'>The courage to learn</title><content type='html'>Cary Millsap recently had a &lt;a href="http://carymillsap.blogspot.com/2008/09/lesson-in-writing-from-1944.html"&gt;great post&lt;/a&gt; on the use of active vs. passive voice when writing.  Check it out, it's an excellent read.&lt;br /&gt;&lt;br /&gt;Anyway, Cary made a reply to one of the comments he received that has sparked much thought on my part.  His statement was:&lt;br /&gt;&lt;blockquote&gt;Learning is a state transition between not knowing something and knowing it. For someone to truly learn, he has to have the courage to admit—at least to himself—that there's something he doesn't know. Some people are unwilling to do that.&lt;/blockquote&gt;&lt;br /&gt;Think about that for a second.  What do you think?  Is the capacity to learn rooted in the ability to simply admit there is something you don't know?&lt;br /&gt;&lt;br /&gt;I think Cary's spot on with that assessment.  I do believe that fear of admitting what you don't know holds you back from learning/knowing what you need to.  It's like having blinders on.  I prefer to believe it is fear based and not arrogance, but I think arrogance is at the heart of many people's unwillingness to seek out knowledge.  I mean, what if they're proved wrong about something they've stated as truth?  If you think yourself an "expert" and your ego can't stand the hit it would take if you are proven wrong, aren't you destined to be found lacking knowledge you claim to possess at some point?  &lt;br /&gt;&lt;br /&gt;Although I can't find the exact quote, I remember reading something to the effect of "A wise man knows he doesn't know everything."  For me, my personal goal is to be continually in the process of learning.  I love to learn.  Sometimes the process is painful or embarrassing when I state something I believe to be fact and am shown that my information is either lacking or just plain wrong.  But, even then, I'm glad to learn.  Without coming under critique, how do I confirm what I claim I know?  In the end, it's empowering for me...and humbling too.  I like knowing and I like sharing what I know.  But in order to know, I have to first learn.  And I think that learning is the real thrill for me.  Sharing what I learn is just icing on the cake.&lt;br /&gt;&lt;br /&gt;I think it's easy to get complacent and not seek out new knowledge.  Many times I see people who do basically the same job and see the same issues day after day, month after month.  It's easy to get lazy.  It's easy to turn around and your company is considering implementing Oracle 11 and you've never bothered to learn anything more than you knew when you learned back in Oracle 7.  It's easy to assume that once you know something, that knowledge stays fixed and there's no need to "upgrade" that knowledge.  &lt;br /&gt;&lt;br /&gt;For me, I do what I do because not only do I like to mentor and teach, but I primarily love to learn.  My first job was in the government sector.  I was the new, young kid working with a bunch of guys who had been at their jobs for 20-30 years.  When I finished projects ahead of my allotted time, they'd chide me.  They told me I needed to learn to "take it easy" and that I "wasn't in school anymore" and didn't need to complete my assignments in record time or try to impress my professors.  I just needed to sit back and relax and learn to "not tax my brain".  I tried (for a very short while).  But, I stagnated.  I couldn't stand sitting still.  I couldn't stand not learning and not doing more than just what I knew.  I wanted more.  I wanted challenge.  I wanted to expand what I knew so I could do my job better and more efficiently.&lt;br /&gt;&lt;br /&gt;In the end, I stayed in my first job for less than a year.  And, I know now as I look back, it was the simple fact that I wasn't learning that prompted me to leave.  I grew bored and uninterested in my job and I just couldn't stand it.&lt;br /&gt;&lt;br /&gt;It takes courage to be a learner.  It requires effort.  It requires being willing to admit there's a lot I don't know.  But I know for me there's no other choice.  Learning is like a drug and I'm an addict.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4287057328461451545?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4287057328461451545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4287057328461451545' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4287057328461451545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4287057328461451545'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/10/courage-to-learn.html' title='The courage to learn'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3496534431686448505</id><published>2008-09-22T22:20:00.000-04:00</published><updated>2008-09-22T22:31:56.172-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle 11'/><category scheme='http://www.blogger.com/atom/ns#' term='rowsource execution statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='STAT lines'/><title type='text'>STAT lines in 11g</title><content type='html'>My friend and colleague, Ric Van Dyke, has been preparing a presentation for the UKOUG conference and in his work discovered an anomaly in the roll ups for the time values in the STAT lines emitted in 10046 trace data from an 11g database.  I had seen this behavior as well but didn't follow up on it for myself since I wasn't using Oracle 11 for anything other than a bit of testing here and there.&lt;br /&gt;&lt;br /&gt;A couple of weeks ago, I received an email from &lt;a href="http://rudikristanto.wordpress.com"&gt;Rudi K.&lt;/a&gt; as a follow up to my post on &lt;a href="http://karenmorton.blogspot.com/2008/06/plan-execution-statistics.html"&gt;Plan Execution Statistics&lt;/a&gt;.  In some of Rudi's own testing, he came across this anomaly in the rowsource execution statistics as well and asked me about it.  So, given Rudi's question and a recent discussion with Ric on the subject, I thought I'd blog about it. Rudi - I apologize it's taken me so long to properly respond to you, but here you go!  :)&lt;br /&gt;&lt;br /&gt;First, let's look at an example of what the problem looks like.  Take a look at the rowsource execution statistics (from the trace file STAT lines) for the following very simple query in Oracle 10g:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select /*+ use_merge(e,d) */ * &lt;br /&gt;  from emp e, dept d&lt;br /&gt; where e.deptno = d.deptno ;&lt;br /&gt;&lt;br /&gt;STAT #3 id=1 cnt=13 pid=0 pos=1 obj=0 op='MERGE JOIN  (cr=11 pr=8 pw=0 time=21096 us)'&lt;br /&gt;STAT #3 id=2 cnt=4 pid=1 pos=1 obj=54389 op='TABLE ACCESS BY INDEX ROWID DEPT (cr=4 pr=2 pw=0 time=17342 us)'&lt;br /&gt;STAT #3 id=3 cnt=4 pid=2 pos=1 obj=54390 op='INDEX FULL SCAN DEPT_DEPTNO_PK (cr=2 pr=1 pw=0 time=16060 us)'&lt;br /&gt;STAT #3 id=4 cnt=13 pid=1 pos=2 obj=0 op='SORT JOIN (cr=7 pr=6 pw=0 time=3539 us)'&lt;br /&gt;STAT #3 id=5 cnt=13 pid=4 pos=1 obj=54391 op='TABLE ACCESS FULL EMP (cr=7 pr=6 pw=0 time=3284 us)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In order to understand the rowsource execution statistics (the information in the parentheses at the end of each line), you need to follow one simple "rule": the values listed in a child operation roll up into their parents.  The bottom-line is that the top line should be the roll up of the child operations listed below it.  To understand the relationships, take a look at this tree diagram of this query's execution plan.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;     1&lt;br /&gt;     |&lt;br /&gt;  -------&lt;br /&gt;  |     |&lt;br /&gt;  2     4&lt;br /&gt;  |     |&lt;br /&gt;  3     5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, you could break down the rowsource time stats as follows (I'm only showing the time stats as these are the roll ups that appear to have problems in 11g but all the rowsource statistics roll up the same way):&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Pid | Operation                    | Name           | Time  | Self  | Kids  &lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;|   0 |     | SELECT STATEMENT             |                | 21096 |       |       &lt;br /&gt;|   1 |  0  |  MERGE JOIN                  |                | 21096 |   215 | 17342+3539 &lt;br /&gt;|   2 |  1  |   TABLE ACCESS BY INDEX ROWID| DEPT           | 17342 |  1282 | 16060 &lt;br /&gt;|   3 |  2  |    INDEX FULL SCAN           | DEPT_DEPTNO_PK | 16060 | 16060 |     0 &lt;br /&gt;|   4 |  1  |   SORT JOIN                  |                |  3539 |   255 |  3284 &lt;br /&gt;|   5 |  4  |    TABLE ACCESS FULL         | EMP            |  3284 |  3284 |     0 &lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So far, so good.  Now, let's look at the same info from 11g.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;STAT #3 id=1 cnt=13 pid=0 pos=1 obj=0 op='MERGE JOIN  (cr=6 pr=3 pw=3 time=166 us cost=5 size=767 card=13)'&lt;br /&gt;STAT #3 id=2 cnt=4 pid=1 pos=1 obj=71193 op='TABLE ACCESS BY INDEX ROWID DEPT (cr=4 pr=2 pw=2 time=53 us cost=2 size=80 card=4)'&lt;br /&gt;STAT #3 id=3 cnt=4 pid=2 pos=1 obj=71194 op='INDEX FULL SCAN DEPT_DEPTNO_PK (cr=2 pr=1 pw=1 time=36 us cost=1 size=0 card=4)'&lt;br /&gt;STAT #3 id=4 cnt=13 pid=1 pos=2 obj=0 op='SORT JOIN (cr=2 pr=1 pw=1 time=25 us cost=3 size=507 card=13)'&lt;br /&gt;STAT #3 id=5 cnt=13 pid=4 pos=1 obj=71195 op='TABLE ACCESS BY INDEX ROWID EMP (cr=2 pr=1 pw=1 time=84 us cost=2 size=507 card=13)'&lt;br /&gt;STAT #3 id=6 cnt=13 pid=5 pos=1 obj=71200 op='INDEX FULL SCAN EMP_DEPT_IDX (cr=1 pr=1 pw=1 time=29 us cost=1 size=0 card=13)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The plan is a bit different in that it used an INDEX FULL SCAN for the EMP table access but otherwise, it's basically the same.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;     1&lt;br /&gt;     |&lt;br /&gt;  -------&lt;br /&gt;  |     |&lt;br /&gt;  2     4&lt;br /&gt;  |     |&lt;br /&gt;  3     5&lt;br /&gt;        |&lt;br /&gt;        6&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here's the break down of the rowsource time stats:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Pid | Operation                     | Name           | Time  | Self  | Kids  &lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;|   0 |     | SELECT STATEMENT              |                |   166 |       |       &lt;br /&gt;|   1 |  0  |  MERGE JOIN                   |                |   166 |    ?? | 53+??&lt;br /&gt;|   2 |  1  |   TABLE ACCESS BY INDEX ROWID | DEPT           |    53 |    17 |    36 &lt;br /&gt;|   3 |  2  |    INDEX FULL SCAN            | DEPT_DEPTNO_PK |    36 |    36 |     0 &lt;br /&gt;|   4 |  1  |   SORT JOIN                   |                |    25 |    ?? |    ??   &lt;br /&gt;|   5 |  4  |    TABLE ACCESS BY INDEX ROWID| EMP            |    84 |    55 |    29 &lt;br /&gt;|   6 |  5  |     INDEX FULL SCAN           | EMP_DEPT_IDX   |    29 |    29 |     0&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hmmmm...  Something's wrong here.  Notice on step 4, the SORT JOIN operation's total time is only 25 microseconds.  How can that be possible if it's child operation takes 84 microseconds?  The MERGE JOIN step shows a time of 166 microseconds.  How can I be sure of that total since step 4 appears wrong (i.e. it doesn't appear to include it's child operation totals)?  &lt;br /&gt;&lt;br /&gt;Well, if we go with &lt;a href="http://hotsoseducation.blogspot.com/2008/08/sorts-times-and-11g.html"&gt;Ric's theory&lt;/a&gt;, the problem is with the SORT step (id = 4).  It appears that Oracle is no longer rolling up totals when a SORT type of operation occurs.  Instead, it maintains that operation's statistics independent of its children.  If that's the case, then to get the correct timing roll up, we'd need to add the time from steps 2, 4 and 5.  That would be 162 microseconds.  That would mean that the MERGE step would take 4 microseconds.&lt;br /&gt;&lt;br /&gt;I'm not sure that's really how it's working, but the math seems to work out fairly close.  Ric says:&lt;br /&gt;&lt;blockquote&gt;What appears to be happening is that the SORT is now done "while" the child steps are accruing. I think the best way to describe this new behavior is that sorts now happen simultaneously with the child steps. I don't believe that this is a parallel action, it is an action that happens simultaneously. There is a subtle but distinct difference.&lt;/blockquote&gt;&lt;br /&gt;Regardless of if there's a resolution or not (perhaps we need to change the way the roll ups are done for SORT type operations which include not only SORT-MERGE joins, but queries that have ORDER BY and HASH joins as well), we do need to take note of the change.  I've depended on these rowsource stats quite frequently when optimizing SQL and would love to really understand why this behavior is occurring and how to account for it in trace data.&lt;br /&gt;&lt;br /&gt;If anyone has anything more concrete on this, I'd love to hear from you and I'm sure Ric would too!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3496534431686448505?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3496534431686448505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3496534431686448505' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3496534431686448505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3496534431686448505'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/09/stat-lines-in-11g.html' title='STAT lines in 11g'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4640185124265677240</id><published>2008-09-22T09:00:00.000-04:00</published><updated>2008-09-22T09:00:00.749-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOOW'/><title type='text'>Miracle Open World 2008</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SNbu2VqFPoI/AAAAAAAAAF4/xwWWfT6siak/s1600-h/MiracleOpenWorld-banner.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SNbu2VqFPoI/AAAAAAAAAF4/xwWWfT6siak/s400/MiracleOpenWorld-banner.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5248645033040887426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll be presenting at this year's &lt;a href="http://www.miracleas.dk/index.asp?page=168&amp;page2=485"&gt;Miracle Open World&lt;/a&gt; in Denmark and was asked to prepare a &lt;a href="http://gallery.me.com/karen.morton#100000"&gt;video&lt;/a&gt; about my presentation 'Are you an astronaut or a monkey? The Oracle Advisors from a different perspective'.  I sure had fun making it.  I have a feeling MOOW will be even more fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4640185124265677240?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4640185124265677240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4640185124265677240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4640185124265677240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4640185124265677240'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/09/miracle-open-world-2008.html' title='Miracle Open World 2008'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SNbu2VqFPoI/AAAAAAAAAF4/xwWWfT6siak/s72-c/MiracleOpenWorld-banner.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-8470248468481060175</id><published>2008-09-21T18:16:00.001-04:00</published><updated>2008-09-21T18:26:36.587-04:00</updated><title type='text'>Where in the world is Karen?</title><content type='html'>Sorry to be absent for so long.  I've been teaching all day for the past two weeks and have one more week to go before I catch a bit of a break.  It's been great, but it doesn't leave me with much energy or brain function to post in the evenings.  :)&lt;br /&gt;&lt;br /&gt;So, in lieu of something more profound, follow the visuals to know where I've been hanging out.&lt;br /&gt;&lt;br /&gt;Canada&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/SNbIzNflFEI/AAAAAAAAAFQ/1nh815MN7BY/s1600-h/canada.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/SNbIzNflFEI/AAAAAAAAAFQ/1nh815MN7BY/s400/canada.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5248603197867889730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ontario&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SNbJAvetJQI/AAAAAAAAAFY/X23Rxw8A7iI/s1600-h/canada-e.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SNbJAvetJQI/AAAAAAAAAFY/X23Rxw8A7iI/s400/canada-e.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5248603430329328898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Near Toronto which is near this gorgeous landmark&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SNbJnY1G9YI/AAAAAAAAAFo/F8NrNVsndH4/s1600-h/niagara.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SNbJnY1G9YI/AAAAAAAAAFo/F8NrNVsndH4/s400/niagara.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5248604094264178050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the city of Waterloo&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/SNbJwlPvkDI/AAAAAAAAAFw/MiC4Ln20Blw/s1600-h/waterloo.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/SNbJwlPvkDI/AAAAAAAAAFw/MiC4Ln20Blw/s400/waterloo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5248604252215939122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm having a terrific visit, eh.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-8470248468481060175?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/8470248468481060175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=8470248468481060175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8470248468481060175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8470248468481060175'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/09/where-in-world-is-karen.html' title='Where in the world is Karen?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gB2tAQrrKSw/SNbIzNflFEI/AAAAAAAAAFQ/1nh815MN7BY/s72-c/canada.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-212881797948228134</id><published>2008-09-05T13:40:00.000-04:00</published><updated>2008-09-05T13:43:47.959-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Teachers day'/><title type='text'>Teacher's Day</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SMFu-J-cbPI/AAAAAAAAAFI/RH19L6dXYzw/s1600-h/teacherday.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SMFu-J-cbPI/AAAAAAAAAFI/RH19L6dXYzw/s400/teacherday.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5242593455344741618" /&gt;&lt;/a&gt;&lt;br /&gt;Today is Teachers' day in India.  Every year on this day I receive an email from a student of mine who lives in India sending his thanks and also to ask for my "teacher's blessing" for him and his endeavors.  This has been going on for about 4 years now and I look forward to it.&lt;br /&gt;&lt;br /&gt;In India September 5th is celebrated as Teachers' day as a mark of tribute to the contribution made by teachers to the society. This date is the birthday of a great teacher, Dr. Sarvapalli Radhakrishnan, who was a staunch believer of education, and was the well-known diplomat, scholar, president of India (elected in 1962) and above all a teacher.  You can read more about Teachers' day &lt;a href="http://festivalsofindia.in/id/td/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I love to teach.  It's truly a passion.  I think it is true that teachers are also the most frequent and enthusiastic students.  I know I am.  I love to learn.  And, even when I am teaching, I'm learning.  My students often impart as much helpful information to me as I do to them.  How great is that?!?!&lt;br /&gt;&lt;br /&gt;In any case, I wanted to take a moment to thank my teachers...all of you.  I know my life has been shaped by all the wonderful teachers I have had.  &lt;br /&gt;&lt;br /&gt;I got to speak to one of my most favorite teachers just last week after more than 25 years.  It happened out of the blue when my sister, who is a physical therapist and lives and works in Tennessee, called me during the day and said "I've got someone here for you to say hi to."  She then handed the phone to someone who asked if I remembered her.  Obviously, I was clueless and so she gave me a hint: "I had you in class for two years in a row."  Ah-ha!  It was Mrs. Crossno!  She was my Latin teacher during my freshman and sophomore years in high school.  Wow.  As it turns out she was visiting my sister's office for some physical therapy and when she asked about me, Amy just called me up and handed her the phone.&lt;br /&gt;&lt;br /&gt;It was very, very sweet to speak to her again after all these years.  She retired just a couple of years ago but had remembered me all these years and even kept a little cartoon I drew way back then posted on the bulletin board in her classroom.  It was a copy of a Peanuts cartoon showing Charlie Brown with his little sister Sally.  Sally was resisting the idea of going to kindergarten and the caption read 'Well, all right, I'll go - but I'm not going to learn Latin.' Mrs. Crossno had laminated it and kept it in her classroom all those years.&lt;br /&gt;&lt;br /&gt;She made quite an impact on me that's for sure.  Two years of Latin, a "dead" language, equipped me with knowledge I used through college and still find skills I learned then coming in handy now.  She taught us etymology (the study of word origins) and from that, I have been able to break many words down into their Latin roots so that I could get at least some understanding of their meaning when the word was new to me.  And, it wasn't just what she taught me, it was how she did it.  She made it fun.  She was encouraging and supportive.  She knew her stuff but never made you feel stupid for stumbling.  She was an inspiration and gave so much of herself that it made you want to give back all you could.&lt;br /&gt;&lt;br /&gt;So, today on this Teachers' day, I want to thank Mrs. Crossno and all my teachers throughout the years.  You have blessed me in so many ways.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-212881797948228134?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/212881797948228134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=212881797948228134' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/212881797948228134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/212881797948228134'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/09/teachers-day.html' title='Teacher&apos;s Day'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gB2tAQrrKSw/SMFu-J-cbPI/AAAAAAAAAFI/RH19L6dXYzw/s72-c/teacherday.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6275962558469063907</id><published>2008-09-04T23:14:00.000-04:00</published><updated>2008-09-04T23:26:25.702-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle ACE'/><title type='text'>I'm truly honored</title><content type='html'>I received an email this past week with the following (partial) content:&lt;br /&gt;&lt;blockquote&gt;I am pleased to inform you that you have been nominated for the Oracle ACE award. You have been chosen based on your significant contribution and activity in the Oracle technical community.  Like your fellow Oracle ACEs, you have demonstrated a proficiency in Oracle technology as well as a willingness to share your knowledge and experiences with the community.&lt;/blockquote&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SMCmlnW0xSI/AAAAAAAAAFA/Fdin9p9jhro/s1600-h/oracle_ace_blk.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SMCmlnW0xSI/AAAAAAAAAFA/Fdin9p9jhro/s400/oracle_ace_blk.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5242373131409343778" /&gt;&lt;/a&gt;&lt;br /&gt;I am pleased and very honored to join the ranks of Oracle ACEs and will make it my continuing goal to be deserving of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6275962558469063907?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6275962558469063907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6275962558469063907' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6275962558469063907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6275962558469063907'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/09/im-truly-honored.html' title='I&apos;m truly honored'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SMCmlnW0xSI/AAAAAAAAAFA/Fdin9p9jhro/s72-c/oracle_ace_blk.gif' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6341387463994827259</id><published>2008-09-01T14:30:00.000-04:00</published><updated>2008-09-01T15:10:51.629-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Too big?</title><content type='html'>What do you think? &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/SLw7Ytk9c6I/AAAAAAAAAEw/RNNDBCKq2AE/s1600-h/butter.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/SLw7Ytk9c6I/AAAAAAAAAEw/RNNDBCKq2AE/s400/butter.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5241129362089931682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Did I make the wrong choice when I bought the super jumbo size tub of "I Can't Believe It's Not Butter"?  &lt;br /&gt;&lt;br /&gt;Let me help you visualize the size a bit better.  Here's the tub next to a cream cheese container that is the same size (8 oz) as my previous size butter tub.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SLw7-4LNg0I/AAAAAAAAAE4/Nw1B-w-ViZQ/s1600-h/butter_compare.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SLw7-4LNg0I/AAAAAAAAAE4/Nw1B-w-ViZQ/s400/butter_compare.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5241130017769751362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm thinking that my logic was a bit flawed when I decided on the 45 ounce size.  I thought it was smart.  The super jumbo tub was on sale and only cost 50 cents more than the small size.  It seemed to me to be an easy choice.  The big tub would equate to over 5 of the smaller size and cost only 50 cents more.  Sounds like a great deal, right?  &lt;br /&gt;&lt;br /&gt;However, the problem with my choice became evident when I got home with my purchase.  Where was this gigantic tub o' butter going to fit in my refrigerator?  I ended up having to rearrange an entire shelf to get the thing to fit.  Of course, the arrangement I came up with meant that if/when I wanted to get out the butter, I'd have to get out several other items just to be able to pull the big guy from its spot.  Sigh...&lt;br /&gt;&lt;br /&gt;Sometimes I suppose you just shouldn't go for what seems to be the obviously better deal, huh?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6341387463994827259?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6341387463994827259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6341387463994827259' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6341387463994827259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6341387463994827259'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/09/too-big.html' title='Too big?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gB2tAQrrKSw/SLw7Ytk9c6I/AAAAAAAAAEw/RNNDBCKq2AE/s72-c/butter.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4759412487976632764</id><published>2008-08-29T22:18:00.001-04:00</published><updated>2008-08-29T22:30:51.715-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Duarte'/><category scheme='http://www.blogger.com/atom/ns#' term='slide:ology'/><title type='text'>slide:ology</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SLit-KRuRQI/AAAAAAAAAEo/cGITch8vrQI/s1600-h/scr.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SLit-KRuRQI/AAAAAAAAAEo/cGITch8vrQI/s400/scr.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5240129449867756802" /&gt;&lt;/a&gt;&lt;br /&gt;My latest read is a terrific book called slide:ology by Nancy Duarte.  There is also a &lt;a href="http://slideology.com"&gt;site by the same name&lt;/a&gt; with lots of on-going material related to the book which is filled with content from the folks at Duarte Design.  This book is going to be right next to my copy of &lt;a href="http://www.presentationzen.com/"&gt;Presentation Zen&lt;/a&gt; by Garr Reynolds that I &lt;a href="http://karenmorton.blogspot.com/2008/05/presentation-zen.html"&gt;posted about&lt;/a&gt; back in May.&lt;br /&gt;&lt;br /&gt;I'm loving this book so far.  It has some great stuff that continues to feed my desire to be a better, more effective and compelling speaker.  I've become fascinated by the use of design principles to guide my presentation designs.  I've had an opportunity to try out my new presentation style a couple of times now and I find the audience is more engaged and asks more questions and provides more comments and feedback at the end.  &lt;br /&gt;&lt;br /&gt;So, if you're tired of the same old boring PowerPoint presentation design and delivery that we're all so used to (and tired of), give this book (and Presentation Zen) a read.  It'll change you...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4759412487976632764?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4759412487976632764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4759412487976632764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4759412487976632764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4759412487976632764'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/08/slideology.html' title='slide:ology'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SLit-KRuRQI/AAAAAAAAAEo/cGITch8vrQI/s72-c/scr.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3593702117646587017</id><published>2008-08-27T00:19:00.000-04:00</published><updated>2008-08-27T00:25:34.623-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='avocation'/><category scheme='http://www.blogger.com/atom/ns#' term='vocation'/><title type='text'>What are you doing?</title><content type='html'>One of my favorites stories goes like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;A man came upon a construction site where three people were working. He asked the first, &lt;span style="font-style:italic;"&gt;What are you doing?&lt;/span&gt; and the man answered, &lt;span style="font-style:italic;"&gt;I am laying bricks&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;He asked the second, &lt;span style="font-style:italic;"&gt;What are you doing?&lt;/span&gt; and the man answered, &lt;span style="font-style:italic;"&gt;I am building a wall&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;He walked up to the third man, who was humming a tune as he worked and asked, &lt;span style="font-style:italic;"&gt;What are you doing?&lt;/span&gt; and the man stood up and smiled and said, &lt;span style="font-style:italic;"&gt;I am building a cathedral.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;In my work, I'm like the third guy.  I wake up every day smiling because in my own way, I get to build a cathedral.  It's about the bigger picture, the higher view, the life choices that have brought me to a place where every day I get to do what I truly love to do.&lt;br /&gt;&lt;br /&gt;How about you?  &lt;span style="font-style:italic;"&gt;What are you doing?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3593702117646587017?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3593702117646587017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3593702117646587017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3593702117646587017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3593702117646587017'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/08/what-are-you-doing.html' title='What are you doing?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-4973614085792088700</id><published>2008-08-19T18:00:00.000-04:00</published><updated>2008-08-19T18:00:01.123-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='making your case'/><title type='text'>Making your case</title><content type='html'>I am surprised at how often I've been on site with a customer and find out that the recommendations I end up making were actually already suggested by the DBAs and/or developers on staff.  I wonder why the suggestions of the employees aren't heeded and a consultant gets called in instead?  It would seem that the company could have more effectively used the money and time spent to have a consultant tell them the same thing their employees are already saying.&lt;br /&gt;&lt;br /&gt;So, how does the staff DBA or developer get heard?  It may not even be that what they have to say is set aside in lieu of a consultant's opinion.  It may be a case where a DBA or developer suggests doing something that hasn't been done before and they can't get buy in from their managers and colleagues.  Why?&lt;br /&gt;&lt;br /&gt;It's an interesting issue.  My experience has been that many times I will be able to make recommendations or solve problems that on site employees hadn't been able to work out for themselves either due to lack of experience or lack of time to devote to solving the problem.  Fortunately, I don't think I've ever left behind recommendations that failed and cost the company I intended to help, but I can't even count the number of times that my recommendations mirrored those that one or more employees had already made.  &lt;br /&gt;&lt;br /&gt;So, how do you make your case?  How do you get heard?  Do you quit and contract back in as a consultant making 4 times more money?  I've seen that very thing happen, haven't you?  Do you offer to quit if your recommendation fails?  Hardly.  &lt;br /&gt;&lt;br /&gt;I think there are a few things that can help anyone make a case for their suggestions/recommendations:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;li&gt; Outline the business case or situation in detail and note the business goal.  Keep in mind that a business case is really a tool that looks at financial considerations.  No matter what other elements may be viewed as relevant to the decision, if they can't be expressed in terms of their financial impact they'll have no influence on the results of your case.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Provide meaningful options to accomplish the task/project.  If the question to be answered can only have a "yes" or "no" option, it's easy to point to the winner.  However, when you need to ask "which way" something will be accomplished, it is important to provide the options to allow the reviewers to step back and review options that reflect the most relevant means of accomplishing the business' goals.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; State the full costs of the task/project and any on-going support and of transition.  This isn't just about the cost of doing the project, but costs of supporting it once it's over.  Things like licensing costs, staffing costs and costs of ongoing problems the project didn't intend to fix (perhaps only postpone).  The full cost isn't just the cost to do the project, but is the full cost to the business of making a specific decision.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Show both the good and bad impacts of change.  It is possible that along with the positive consequences of the project, there may be some negative consequences as well.    This could include positions needing re-defined, transition costs and ongoing process problems that the project won't resolve.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Ensure the benefits of your recommendations are attainable...and can be measured.  Be able and prepared to show before and after comparisons.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Know what metrics play a role in the decision-making process (and how).  There are a host of metrics (some concrete and some fuzzy) that are considered when any decision must be made.  And many times there is no collectively agreed upon way of measuring them.  The key is understanding what your audience is looking for in terms of metrics and what they are going to make a decision based on.  You need to know what they're looking for, what thresholds are relevant to them, and how they are used to seeing these metrics presented and lay them out that way.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Tell a story.  The bottom-line is that your case is made by answering two fundamental questions: "Should we do this?" and "Which way is most effective to accomplish it?"  Write up your recommendations and plans as if you are telling a story that answers those questions.  Establish the background, introduce the problem and define why it is important to solve the problem.  If you don't solve the problem, what is the consequence?  What are the various way sthat you could solve the problem, and what will happen to the organization in each instance?  And based on all of that, what is the conclusion your want your audience to draw and the action you recommend taking?  Make sure you tell the story first, and then fit it into the template of your case.&lt;/li&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Everyone can learn to make a case strongly and effectively.  You can make a case that is polished and persuasive.  In time, results will back up your proposals and consultants can be used as they &lt;span style="font-style:italic;"&gt;should be&lt;/span&gt; and not just to confirm what full-time employees already know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-4973614085792088700?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/4973614085792088700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=4973614085792088700' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4973614085792088700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/4973614085792088700'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/08/making-your-case.html' title='Making your case'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7593709583882106239</id><published>2008-08-15T13:00:00.000-04:00</published><updated>2008-08-15T13:12:45.799-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PX Deq: Parse Reply'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle performance problem'/><category scheme='http://www.blogger.com/atom/ns#' term='cursor: pin S wait on X'/><category scheme='http://www.blogger.com/atom/ns#' term='bad SQL'/><title type='text'>Strange parsing behavior</title><content type='html'>My friend Jan is cool.  He sends me lots of neat SQL performance issues he's working on so I canto take a look at.  I love it when I get to see performance problems get fixed and have the before/after data to show the differences.  Like I said, Jan is cool and sends me lots of good stuff like this.&lt;br /&gt;&lt;br /&gt;What he sent me yesterday was interesting because I'd never seen it before.  The query that was having problems was a UNION of 30 or so different SELECTs.  Many of the SELECTs were similar except for the WHERE clause.  Here's what Jan said in his email to me:&lt;br /&gt;&lt;br /&gt;[Jan]&lt;br /&gt;Now the fun thing is to follow it during execution. This seems to be happening:&lt;br /&gt;&lt;br /&gt;-- parse whole query                                    =&gt; v$sql shows sql_id child_number 0&lt;br /&gt;-- start parallel slaves for &lt;first query&gt;&lt;br /&gt;-- parallel slaves do work&lt;br /&gt;-- when done, parallel slaves for this part of query wait: 'PX Deq: Execution Msg'&lt;br /&gt;...&lt;br /&gt;-- start new set of parallel slaves for &lt;second query&gt;&lt;br /&gt;-- slaves wait 'cursor: pin S wait on X'&lt;br /&gt;-- Query coordinator shows wait: 'PX Deq: Parse Reply'  =&gt; v$sql shows sql_id child_number 1&lt;br /&gt;-- parallel slaves do work&lt;br /&gt;-- when done, parallel slaves for this part of query wait: 'PX Deq: Execution Msg'&lt;br /&gt;...&lt;br /&gt;-- start new set of parallel slaves for &lt;third query&gt;&lt;br /&gt;-- slaves wait 'cursor: pin S wait on X'&lt;br /&gt;-- Query coordinator shows wait: 'PX Deq: Parse Reply'  =&gt; v$sql shows sql_id child_number 2&lt;br /&gt;-- parallel slaves do work&lt;br /&gt;-- when done, parallel slaves for this part of query wait: 'PX Deq: Execution Msg'&lt;br /&gt;etc, etc&lt;br /&gt; &lt;br /&gt;By the time the whole query is done we have child_number 0..30, and about 360 sessions because of all the parallel slaves!  &lt;br /&gt;&lt;br /&gt;Weirdest part is the 'cursor: pin S wait on X' plus 'PX Deq: Parse Reply' waits, they take &gt; 8 seconds every time! Why would it parse over and over again???&lt;br /&gt; &lt;br /&gt;When I start the query a second time, it's way faster, since those parsing waits don't happen (if the plan's still there):&lt;br /&gt;First time:   Selected 109 records in 712.485 Secs&lt;br /&gt;Second time:  Selected 109 records in 142.829 Secs&lt;br /&gt;[/Jan]&lt;br /&gt;&lt;br /&gt;The two things about this that interested me where the &lt;span style="font-weight:bold;"&gt;cursor: pin S wait on X&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt; events and the parsing waits.  I had just seen the 'pin S' timed event the day before while reviewing a trace file with another customer.  I find it funny how I'll often see 2 or 3 of the same kind of error in a short time frame.  I guess it really is true that things happen in multiples, huh?  Anyway, the 'pin S' events are related to mutex pinning issues.  Admittedly, I didn't know much about that until the issue I researched the day before.  Here's what I learned:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The timed event for 'cursor: pin S wait on X' (I'm just going to call this pinS for short from now on) is an event that started in occurring in v10 when Oracle added mutex pins into the scheme in addition to latches.  Basically, a mutex is kind of like a latch, but just a simpler, faster version.  When you get the pinS wait, it's caused by a session holding an exclusive mutex pin on a cursor for which another session wishes to get a shared mutex pin on the same cursor object.  From the looks of things with your big UNION query and all the parallel slave processes, that makes sense.  The p1-p3 values give you some info:&lt;br /&gt;&lt;br /&gt;P1 Hash value of cursor&lt;br /&gt;P2 Mutex value (top 2 bytes contains SID holding mutex in exclusive mode, and bottom two bytes usually hold the value 0)&lt;br /&gt;P3 Mutex where (an internal code locator) OR'd with Mutex Sleeps&lt;br /&gt;&lt;br /&gt;and there are a few dynamic system views that provide more information about this timed event:  V$MUTEX_SLEEP and V$MUTEX_SLEEP_HISTORY.  You just have to check those views while the problem is occurring to get the additional info.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;There's not a whole lot of data on this floating around out there, but I found some interesting info from Tanel Poder and Jonathan Lewis that helped.&lt;br /&gt;&lt;br /&gt;Anyway, the second issue was the &lt;span style="font-weight:bold;"&gt;PX Deq: Parse Reply&lt;/span&gt; waits.  I was wondering why all the parsing was going on and guessing that if the parsing issue was resolved, that would also reduce or eliminate the pinS waits as well.&lt;br /&gt;&lt;br /&gt;I wrote back to Jan about the small bit I knew and told him I thought that rewriting the query to combine several of the separate SELECTs together would likely help the problem.  At a quick glance, there were 18 of the SELECTs that shared the same FROM clause and join conditions.&lt;br /&gt;&lt;br /&gt;Today I did a bit more research to check out the 'PX Deq: Parse Reply' and came across a &lt;a href="http://oracledoug.com/px8.html"&gt;great write up at Doug Burn's blog&lt;/a&gt; about Parallel-specific wait events (the whole article starts &lt;a href="http://oracledoug.com/px.html"&gt;here&lt;/a&gt;).  Good stuff...check it out.&lt;br /&gt;&lt;br /&gt;Then, just a few minutes ago, Jan sent me the update on how he was progressing.&lt;br /&gt;&lt;br /&gt;[Jan]&lt;br /&gt;After some more digging this is where we get multiple children (simplified case, I'm sure you can simulate it):&lt;br /&gt;&lt;pre name="code" class="sql"&gt; &lt;br /&gt;select /*+ test */ appln_jrnl_id, sum(payment_count) from fihub.tbl_voucher_acct_line  d&lt;br /&gt;where appln_jrnl_id   = 'AP_PAYMENT'&lt;br /&gt;and   fiscal_year_num = 2008&lt;br /&gt;and   acct_period_cd  = 5&lt;br /&gt;group by appln_jrnl_id&lt;br /&gt;union&lt;br /&gt;select /*+ test */ 'AP_PAYMENT', sum(payment_count) from fihub.tbl_voucher_acct_line  d&lt;br /&gt;where appln_jrnl_id   = 'AP_PAYMENT'&lt;br /&gt;and   fiscal_year_num = 2008&lt;br /&gt;and   acct_period_cd  = 5;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;BTW, this table is partitioned, so it's using parallelism.&lt;br /&gt; &lt;br /&gt;The original query had mostly group by's. But there where a few SUMs without group by's. That's what is causing the trouble. v$sql_shared_cursor says it's because of a PQ_SLAVE_MISMATCH. When running serially it doesn't happen.  After rewriting the troubling parts to do a group by, it's back to normal. After a total rewrite, the query is much faster.&lt;br /&gt;[/Jan]&lt;br /&gt;&lt;br /&gt;Again, I love stuff like this.  I thought it would be an interesting case to share.&lt;br /&gt;&lt;br /&gt;Thanks Jan!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7593709583882106239?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7593709583882106239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7593709583882106239' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7593709583882106239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7593709583882106239'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/08/strange-parsing-behavior.html' title='Strange parsing behavior'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-427180915424870742</id><published>2008-08-14T10:35:00.000-04:00</published><updated>2008-08-14T10:38:08.682-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MacBook Pro'/><title type='text'>Mac vs. PC</title><content type='html'>I saw a post recently that read as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Subject: A bit of Mac vs PC hilarity&lt;br /&gt;&lt;br /&gt;A co-worker returned recently from a developers class for some aspect of .Net.  He found it quite funny when he discovered some MS employees taking the class, running Vista in a VM.&lt;br /&gt;&lt;br /&gt;The host machines:  MacBook Pro's&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My MacBook Pro is also running Vista in a VM, but I rarely touch it!  But, the fact that MS employees are using Macs with VM for Vista says it all if you ask me.  All hail the Mac!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-427180915424870742?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/427180915424870742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=427180915424870742' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/427180915424870742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/427180915424870742'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/08/mac-vs-pc.html' title='Mac vs. PC'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7678674172544618828</id><published>2008-08-08T09:00:00.000-04:00</published><updated>2008-08-08T09:00:16.140-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='odd notes'/><title type='text'>Pah-tay-toe, Pah-tah-toe</title><content type='html'>After a brief hiatus, I figured I'd better blog a little something to let everyone know I was still out here.  So, here you go...&lt;br /&gt;&lt;br /&gt;I was reading something recently that caught my fancy in that "this is weird and kinda funny" way.  It went something like this: &lt;br /&gt;&lt;blockquote&gt;If deer meat is called venison and cow meat is called steak, why is chicken just called chicken?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;How did the chicken miss out?  Somehow if I went to a nice restaurant and the menu offered me &lt;span style="font-style:italic;"&gt;Prime Cut of Cow&lt;/span&gt; instead of &lt;span style="font-style:italic;"&gt;NY Strip&lt;/span&gt;, I don't think I'd find it quite so appealing.  But, when I see Grilled Chicken on the menu, I'm completely fine with that.  Hmmmm....&lt;br /&gt;&lt;br /&gt;Hopefully next week I'll have something more interesting to say, but for now, I'll leave you to ponder.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7678674172544618828?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7678674172544618828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7678674172544618828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7678674172544618828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7678674172544618828'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/08/pah-tay-toe-pah-tah-toe.html' title='Pah-tay-toe, Pah-tah-toe'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5341638388167799148</id><published>2008-07-28T18:30:00.000-04:00</published><updated>2008-07-28T18:30:01.056-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Wordle'/><title type='text'>Wordle</title><content type='html'>I was directed to a cool little site called &lt;a href="http://wordle.net/create"&gt;Wordle&lt;/a&gt; that takes text, the URL of any page that has an Atom or RSS feed, or a del.icio.us user name and turns it into a cool little graphic.  &lt;br /&gt;&lt;br /&gt;I tried it twice: once with my blog and once with the text of my &lt;a href="http://method-r.com/speakers/karen-morton"&gt;Method R bio page&lt;/a&gt;.  The one from my blog needs to have it's "nerdiness factor" toned down (this feedback according to my colleague Ron...and I agree by the way).  I think the one from my bio page is pretty cool.  Here they both are so you can see what you think.&lt;br /&gt;&lt;br /&gt;From my blog:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_gB2tAQrrKSw/SI40ZXNjrUI/AAAAAAAAAEY/zb_IBWmvkxQ/s1600-h/blog_wordle.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_gB2tAQrrKSw/SI40ZXNjrUI/AAAAAAAAAEY/zb_IBWmvkxQ/s400/blog_wordle.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5228173827755978050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From my bio page text:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_gB2tAQrrKSw/SI40f-MSkXI/AAAAAAAAAEg/rzCCiRWP8n4/s1600-h/karen_wordle1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_gB2tAQrrKSw/SI40f-MSkXI/AAAAAAAAAEg/rzCCiRWP8n4/s400/karen_wordle1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5228173941298860402" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5341638388167799148?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5341638388167799148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5341638388167799148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5341638388167799148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5341638388167799148'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/wordle.html' title='Wordle'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_gB2tAQrrKSw/SI40ZXNjrUI/AAAAAAAAAEY/zb_IBWmvkxQ/s72-c/blog_wordle.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-6588056882804570419</id><published>2008-07-23T16:55:00.000-04:00</published><updated>2008-07-23T18:21:02.817-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Just for fun</title><content type='html'>I occasionally see something called a meme on other blogs I read and recently saw one that I thought looked like fun so I thought I'd try it.&lt;br /&gt;&lt;br /&gt;Here's how it works:&lt;br /&gt;&lt;br /&gt;Using &lt;a href="http://bighugelabs.com/flickr/mosaic.php"&gt;BigHugeLabs Mosaic maker&lt;/a&gt; to make a mosaic and Flickr to do your searches, type your answer to each of the questions below into Flickr Search.  Then, using only the FIRST page, pick an image.  Copy and paste each of the URLs for the images into the mosaic maker.&lt;br /&gt;&lt;br /&gt;The Questions:&lt;br /&gt;1. What is your first name?&lt;br /&gt;2. What is your favorite food?&lt;br /&gt;3. What high school did you go to?&lt;br /&gt;4. What is your favorite color?&lt;br /&gt;5. Who is your celebrity crush?&lt;br /&gt;6. Favorite drink?&lt;br /&gt;7. Dream vacation?&lt;br /&gt;8. Favorite dessert?&lt;br /&gt;9. What you want to be when you grow up?&lt;br /&gt;10. What do you love most in life?&lt;br /&gt;11. One word to describe you.&lt;br /&gt;12. Your flickr name.&lt;br /&gt;&lt;br /&gt;You never know what may turn up on that first Flickr page. Can you guess what some of my answers were? They may not be what you think.  :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_gB2tAQrrKSw/SIeVNkVWPZI/AAAAAAAAAEQ/ChatSCMCQpg/s1600-h/km_mosaic.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_gB2tAQrrKSw/SIeVNkVWPZI/AAAAAAAAAEQ/ChatSCMCQpg/s400/km_mosaic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5226309952910802322" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-6588056882804570419?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/6588056882804570419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=6588056882804570419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6588056882804570419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/6588056882804570419'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/just-for-fun.html' title='Just for fun'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_gB2tAQrrKSw/SIeVNkVWPZI/AAAAAAAAAEQ/ChatSCMCQpg/s72-c/km_mosaic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-9026957046087103790</id><published>2008-07-22T22:10:00.000-04:00</published><updated>2008-07-22T22:11:39.429-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Index fast full scan'/><title type='text'>Optimizer won't choose Index Fast Full Scan?</title><content type='html'>A while back, I was asked to take a look at a situation where a COUNT(*) query was using full table scan instead of an Index Fast Full Scan.  The answer turned out to be fairly simple.  Can you determine the problem?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Table with about 480K rows and about 800 Mb in size.&lt;br /&gt;&lt;br /&gt;It has the following indexes:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SQL&gt; @show_table_indexes&lt;br /&gt;Enter value for owner: aradmin70&lt;br /&gt;Enter value for table: t1478&lt;br /&gt;&lt;br /&gt;                               Column                          Column&lt;br /&gt;INDEX_NAME                     Name                           Position&lt;br /&gt;------------------------------ ------------------------------ --------&lt;br /&gt;I1478_3_1                      C3                                    1&lt;br /&gt;I1478_600000214_1              C600000214                            1&lt;br /&gt;I1478_600000215_1              C600000215                            1&lt;br /&gt;I1478_740002011_1              C740002011                            1&lt;br /&gt;I1478_740002012_1              C740002012                            1&lt;br /&gt;I1478_770000000_1              C770000000                            1&lt;br /&gt;I1478_840000044_1              C840000044                            1&lt;br /&gt;IT1478                         C1                                    1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When executing:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select C600000215, count(*)&lt;br /&gt;  from aradmin70.T1478&lt;br /&gt; group by C600000215;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It uses the following plan:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=27954 Card=563 Bytes=11823)&lt;br /&gt;   1    0  HASH (GROUP BY) (Cost=27954 Card=563 Bytes=11823)&lt;br /&gt;   2    1    TABLE ACCESS (FULL) OF 'T1478' (TABLE) (Cost=27922 Card=481061 Bytes=10102281)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Even using a hint, the optimizer still goes for a full scan.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select /*+ INDEX_FFS(tab1) */ C600000215, count(*)&lt;br /&gt;  from aradmin70.T1478 tab1&lt;br /&gt; group by C600000215;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=27954 Card=563 Bytes=11823)&lt;br /&gt;   1    0   HASH (GROUP BY) (Cost=27954 Card=563 Bytes=11823)&lt;br /&gt;   2    1     TABLE ACCESS (FULL) OF 'T1478' (TABLE) (Cost=27922 Card=481061 Bytes=10102281)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The index should obviously be a better choice:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select count(*) "Extents",&lt;br /&gt;       round(sum(bytes)/(1024*1024)) "MBytes"&lt;br /&gt;  from dba_extents&lt;br /&gt; where owner='ARADMIN70'&lt;br /&gt;   and segment_name='T1478';&lt;br /&gt;&lt;br /&gt;   Extents     MBytes&lt;br /&gt;---------- ----------&lt;br /&gt;       172        807&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For the index:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;   Extents     MBytes&lt;br /&gt;---------- ----------&lt;br /&gt;        32         17&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What should be checked? &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...and the answer is...&lt;br /&gt;&lt;br /&gt;You should check to see if the indexed column allows nulls.  If the column allows nulls, then the index can't be used to count the nulls since rows with null values are not stored for single column indexes.&lt;br /&gt;&lt;br /&gt;A simple describe showed that the column C600000215 which was used as the index column was a VARCHAR2(100) and it did not have a NOT NULL constraint.  So, the optimizer couldn't choose the IFFS.&lt;br /&gt;&lt;br /&gt;Here's the fix that was implemented to allow the IFFS to be chosen:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;alter table ARADMIN70.T1478&lt;br /&gt;  modify (C600000215 NOT NULL);&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;This added the NOT NULL constraint to the column.  Now, when the query is executed, the optimizer chooses the IFFS.&lt;br /&gt; &lt;pre name="code" class="sql"&gt;&lt;br /&gt;select C600000215, count(*)&lt;br /&gt;  from aradmin70.T1478&lt;br /&gt; group by C600000215&lt;br /&gt; order by C600000215;&lt;br /&gt; &lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=1781 Card=5340 Bytes=112140)&lt;br /&gt;   1    0   SORT (GROUP BY) (Cost=1781 Card=5340 Bytes=112140)&lt;br /&gt;   2    1     INDEX (FAST FULL SCAN) OF 'I1478_600000215_1' (INDEX) (Cost=605 Card=494913 Bytes=10393173)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Of course, if the column had to be allowed to have nulls then the solution would've required some more thought.  But fortunately, this one worked fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-9026957046087103790?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/9026957046087103790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=9026957046087103790' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9026957046087103790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9026957046087103790'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/optimizer-wont-choose-index-fast-full.html' title='Optimizer won&apos;t choose Index Fast Full Scan?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2955842032563738069</id><published>2008-07-21T17:50:00.000-04:00</published><updated>2008-07-22T11:38:41.001-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code formatting'/><category scheme='http://www.blogger.com/atom/ns#' term='SyntaxHighligher'/><title type='text'>Code formatting/Syntax Highlighting</title><content type='html'>I've been trying for a while to find a way to get a code formatting utility to work on my blog.  I'd originally seen it in WordPress where there's a built in tag to handle code formatting.  But, no such thing exists natively for Blogger.&lt;br /&gt;&lt;br /&gt;I found a &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;Google Code utility&lt;/a&gt; that I had tried to get added without much success but today, my colleague Ron got it working for us to use in our new forum (coming soon!).  Now, with a couple of additions to my Blogger template, I'm able to use a slightly modified pre tag to get my code blocks formatted quite nicely.&lt;br /&gt;&lt;br /&gt;All I have to do is enclose my code like this: &lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;  &amp;lt;pre name="code" class="sql"&gt;&lt;br /&gt;  &amp;lt;/pre&gt;&lt;br /&gt;&lt;/pre&gt;and I'm all set.  To get this example to show up, I had to use "&amp; lt" instead of the actual pre start and end tags (using &lt;).  That's good to know as it allows you to also display html as formatted code text and not be interpretted.&lt;br /&gt;&lt;br /&gt;Cool stuff.  The piece that I needed to get all this working was related to javascript, so when Ron got that part handled, I was in business!&lt;br /&gt;&lt;br /&gt;Check it out if you're looking for a way to format your code in a nice, clean way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2955842032563738069?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2955842032563738069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2955842032563738069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2955842032563738069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2955842032563738069'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/code-formattingsyntax-highlighting.html' title='Code formatting/Syntax Highlighting'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-381743706012623537</id><published>2008-07-18T13:00:00.000-04:00</published><updated>2008-07-18T13:00:02.149-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='anonymous posts'/><title type='text'>Anonymous</title><content type='html'>I've been watching the continuing comments related to &lt;a href="http://tkyte.blogspot.com/2008/07/read-this.html"&gt;Tom Kyte's recent post&lt;/a&gt; which referenced &lt;a href="http://carymillsap.blogspot.com/2008/07/christian-antogninis-new-book.html"&gt;Cary's recent post&lt;/a&gt; on Christian Antognini's new book.  There are a couple of things that fascinate me about the whole exchange:  1) all the comments about Cary are happening over at Tom's blog and 2) the person who is firing at Cary is "Anonymous".&lt;br /&gt;&lt;br /&gt;To the first point, it really just cracks me up that Tom's very short and simple post about liking something Cary wrote for his foreward to Chris's book has received all the comments.  Why, I wonder, didn't "Anonymous" make comments on Cary's blog since it was Cary's words that he took exception to?  Odd...&lt;br /&gt;&lt;br /&gt;To the second point, I have to rant a bit on the whole idea of anonymity.   First let me say that I don't like it.  In the context of posting to public forums or blogs or where ever a person chooses to share their opinions and comments, it seems unnecessarily covert to not identify who you are.  I'm interested to know what the fear is that makes someone not want to identify themselves.  Is it fear of reprisal?  Is it fear of looking "dumb"?  What?&lt;br /&gt;&lt;br /&gt;It reminds me of a couple of quotes:&lt;br /&gt;&lt;blockquote&gt;"I disapprove of what you say, but I will defend to the death your right to say it." &lt;b&gt;&lt;i&gt;&lt;br /&gt;S. G. Tallentyre&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;"If you aren't going to say something directly to someone's face, then don't use online as an opportunity to say it.  It is this sense of bravery that people get when they are anonymous that gives the blogosphere a bad reputation."&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Mena Trott&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;I think there is a place for anonymous commentary.  Many times people won't tell you the full truth because they actually like you and think it may hurt your feelings or something like that. But they feel OK to share when they know they won't be identified.&lt;br /&gt;&lt;br /&gt;One of the best personal review techniques I've ever heard of is the 360 degree feedback process.   It is an review process that involves having co-workers, managers,  and as many people as possible involved in providing feedback to a single individual.  All their feedback is done anonymously.  Each person that participates fills out detailed questionnaires about the person and the results are compiled to provide a very specific report back to the employee about their performance &lt;span style="font-style: italic;"&gt;as other people see it&lt;/span&gt;.  Think about it.  If you were asked to talk about your manager (remember, this is the person who does your review and grants you raises and approves your time off requests) many people are less than totally forthcoming when answering questions if they think their feedback will be known to the boss.  But, when they are assured their anonymity, they feel free to truly speak their minds.&lt;br /&gt;&lt;br /&gt;OK.  I get that.  And, I'm sure I could find other instances when anonymity can serve a very good purpose.  But, I don't see how remaining anonymous when you make a blog post or comment is valid.  There's another quote that I heard recently but don't remember it exactly that goes something like, if you wouldn't sign your name to something you say, then don't say it.  I think that is right on.&lt;br /&gt;&lt;br /&gt;We live in a country where we are free to express our opinions.  Only truly inflammatory speech is prohibited.  But, even then, you've got to really be over the top for anything you say to be legally actionable.&lt;br /&gt;&lt;br /&gt;So, why not own what you have to say?  If you're not willing to own it, then just plain don't say it.  Lurk on the blogs and keep your opinions to yourself.  I may not like what you say.  If I don't like it, I can add my voice to the conversation in opposition.  But in order to engage in true, meaningful, open debate and discussion, I truly don't see how remaining anonymous serves that purpose.&lt;br /&gt;&lt;br /&gt;From the start, an anonymous poster is (at least by me) viewed with suspicion.  For the most part, I either ignore or gloss over their comments.  But, as I believe so often happens, many people who post anonymously tend to have a recognizable pattern in how they write.  So, after a while, the anonymous person is actually recognized...even if it's only a recognition that it's the same person's "voice".  Sometimes the anonymous voice can be cross-matched to an actual person from places where they have chosen to identify themselves.  Writing style is similar to a fingerprint and can often be used to identify the writer even when they post without identifying themselves.&lt;br /&gt;&lt;br /&gt;But it is hard to completely ignore the anonymous commenter.  When they have things to say that you don't understand or that you disagree with, you want to respond.  But, it just feels "off" to respond to a "nobody".&lt;br /&gt;&lt;br /&gt;I do support anyone's right to say things they think/believe even if it is in opposition to my own thoughts/beliefs.  I just wish people would own their comments with their real identities.  I think it speaks to strong character and intent when you are willing to identify yourself.&lt;br /&gt;&lt;br /&gt;I recently read something about how your name is your brand.  If you hide your real name behind an anonymous label or even some made up screen name (for example, JoeCoolDBA or SmartGuy), you are not presenting &lt;span style="font-style: italic;"&gt;your&lt;/span&gt; brand and that creates confusion and waters down your name.&lt;br /&gt;&lt;p&gt;So don’t be tempted to bury your own beautiful name. Love it. Own it. Flaunt it.&lt;/p&gt;With that said, this is Karen Morton, signing off for today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-381743706012623537?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/381743706012623537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=381743706012623537' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/381743706012623537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/381743706012623537'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/anonymous.html' title='Anonymous'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-90806686442227590</id><published>2008-07-17T16:55:00.000-04:00</published><updated>2008-07-21T17:16:58.703-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle analytic functions'/><title type='text'>Analytics to the rescue - followup</title><content type='html'>I thought I'd do a follow-up post to yesterday's "Analytics to the rescue" post as the discussion in the comments brought up a couple of things that needed more info than could be easily included in the comment section.  So...&lt;br /&gt;&lt;br /&gt;What you'll see below is a more complete text of the tests I executed that were discussed in yesterday's post.  First, the original query, then for the rewritten query.  What I show for each is the actual STAT lines from the 10046 trace data, the EXPLAIN PLAN and some additional stats (collected with a SQL test harness set of scripts I use).&lt;br /&gt;&lt;br /&gt;Test for original query&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select utrsotp_desc&lt;br /&gt;  from utrsotp, ucbsvco&lt;br /&gt; where ucbsvco_sotp_code = utrsotp_code&lt;br /&gt;   and ucbsvco_dispatch_date =&lt;br /&gt;                                (select max(ucbsvco_dispatch_date)&lt;br /&gt;                                   from ucbsvco&lt;br /&gt;                                  where ucbsvco_cust_code = 1320908&lt;br /&gt;                                    and ucbsvco_prem_code = '507601'&lt;br /&gt;                                    and ucbsvco_stus_code = 'C'&lt;br /&gt;                                    and ucbsvco_dispatch_ind is not null)&lt;br /&gt;   and ucbsvco_stus_code = 'C'&lt;br /&gt;   and ucbsvco_dispatch_ind is not null&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;STAT #3 id=1 cnt=1 pid=0 pos=1 obj=0 op='NESTED LOOPS  (cr=106693 r=59924 w=0 time=19518419 us)'&lt;br /&gt;STAT #3 id=2 cnt=1 pid=1 pos=1 obj=74130 op='TABLE ACCESS FULL UCBSVCO (cr=106691 r=59924 w=0 time=19518381 us)'&lt;br /&gt;STAT #3 id=3 cnt=1 pid=2 pos=2 obj=0 op='SORT AGGREGATE (cr=13 r=0 w=0 time=145 us)'&lt;br /&gt;STAT #3 id=4 cnt=2 pid=3 pos=1 obj=74130 op='TABLE ACCESS BY INDEX ROWID UCBSVCO (cr=13 r=0 w=0 time=138 us)'&lt;br /&gt;STAT #3 id=5 cnt=9 pid=4 pos=1 obj=82187 op='INDEX RANGE SCAN UCBSVCO_CUST_INDEX (cr=3 r=0 w=0 time=45 us)'&lt;br /&gt;STAT #3 id=6 cnt=1 pid=1 pos=2 obj=74368 op='TABLE ACCESS BY INDEX ROWID UTRSOTP (cr=2 r=0 w=0 time=22 us)'&lt;br /&gt;STAT #3 id=7 cnt=1 pid=6 pos=1 obj=81903 op='INDEX UNIQUE SCAN UTRSOTP_KEY_INDEX (cr=1 r=0 w=0 time=12 us)'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Explain Plan&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      |  Name               | Rows  | Bytes | Cost  |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT               |                     |     1 |    38 |  1768 |&lt;br /&gt;|   1 |  NESTED LOOPS                  |                     |     1 |    38 |  1768 |&lt;br /&gt;|*  2 |   TABLE ACCESS FULL            | UCBSVCO             |     1 |    12 |  1767 |&lt;br /&gt;|   3 |    SORT AGGREGATE              |                     |     1 |    20 |       |&lt;br /&gt;|*  4 |     TABLE ACCESS BY INDEX ROWID| UCBSVCO             |     1 |    20 |     1 |&lt;br /&gt;|*  5 |      INDEX RANGE SCAN          | UCBSVCO_CUST_INDEX  |     8 |       |     1 |&lt;br /&gt;|   6 |   TABLE ACCESS BY INDEX ROWID  | UTRSOTP             |     1 |    26 |     1 |&lt;br /&gt;|*  7 |    INDEX UNIQUE SCAN           | UTRSOTP_KEY_INDEX   |     1 |       |       |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   2 - filter("UCBSVCO"."UCBSVCO_STUS_CODE"='C' AND "UCBSVCO"."UCBSVCO_DISPATCH_IND"&lt;br /&gt;              IS NOT NULL AND "UCBSVCO"."UCBSVCO_DISPATCH_DATE"= (SELECT /*+ */&lt;br /&gt;              MAX("UCBSVCO"."UCBSVCO_DISPATCH_DATE") FROM "UIMSMGR"."UCBSVCO" "UCBSVCO" WHERE&lt;br /&gt;              "UCBSVCO"."UCBSVCO_CUST_CODE"=1320908 AND "UCBSVCO"."UCBSVCO_PREM_CODE"='507601' AND&lt;br /&gt;              "UCBSVCO"."UCBSVCO_STUS_CODE"='C' AND "UCBSVCO"."UCBSVCO_DISPATCH_IND" IS NOT NULL))&lt;br /&gt;   4 - filter("UCBSVCO"."UCBSVCO_PREM_CODE"='507601' AND&lt;br /&gt;              "UCBSVCO"."UCBSVCO_STUS_CODE"='C' AND "UCBSVCO"."UCBSVCO_DISPATCH_IND" IS NOT NULL)&lt;br /&gt;   5 - access("UCBSVCO"."UCBSVCO_CUST_CODE"=1320908)&lt;br /&gt;   7 - access("UCBSVCO"."UCBSVCO_SOTP_CODE"="UTRSOTP"."UTRSOTP_CODE")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statistics Snapshot&lt;br /&gt;&lt;br /&gt;Type  Statistic Name                                    Value&lt;br /&gt;----- ---------------------------------------- --------------&lt;br /&gt;Latch cache buffers chains                          2,142,103&lt;br /&gt;      library cache                                   116,725&lt;br /&gt;      row cache objects                                19,592&lt;br /&gt;&lt;br /&gt;Stats buffer is pinned count                                8&lt;br /&gt;      consistent gets                                 106,693&lt;br /&gt;      db block gets                                        56&lt;br /&gt;      execute count                                        16&lt;br /&gt;      parse count (hard)                                    1&lt;br /&gt;      physical reads                                   59,924&lt;br /&gt;      physical writes                                       0&lt;br /&gt;      redo size                                         9,524&lt;br /&gt;      session logical reads                           106,749&lt;br /&gt;      session pga memory                              594,008&lt;br /&gt;      session pga memory max                                0&lt;br /&gt;      sorts (disk)                                          0&lt;br /&gt;      sorts (memory)                                        0&lt;br /&gt;      sorts (rows)                                          0&lt;br /&gt;      table fetch by rowid                                 10&lt;br /&gt;      table scan blocks gotten                        106,669&lt;br /&gt;&lt;br /&gt;Time  elapsed time (centiseconds)                       2,016&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Test for rewritten query&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;select utrsotp_desc&lt;br /&gt;  from utrsotp,&lt;br /&gt;                (&lt;br /&gt;                select ucbsvco_sotp_code sotp_cd, ucbsvco_dispatch_date dispatch_dt,&lt;br /&gt;                           max(ucbsvco_dispatch_date) over (partition by ucbsvco_cust_code, ucbsvco_prem_code) max_dispatch_dt&lt;br /&gt;                  from ucbsvco&lt;br /&gt;                 where ucbsvco_cust_code = 1320908&lt;br /&gt;                   and ucbsvco_prem_code = '507601'&lt;br /&gt;                   and ucbsvco_stus_code = 'C'&lt;br /&gt;                   and ucbsvco_dispatch_ind is not null&lt;br /&gt;                ) svco&lt;br /&gt; where svco.dispatch_dt = svco.max_dispatch_dt&lt;br /&gt;   and svco.sotp_cd = utrsotp_code&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;STAT #3 id=1 cnt=1 pid=0 pos=1 obj=0 op='NESTED LOOPS  (cr=15 r=0 w=0 time=249 us)'&lt;br /&gt;STAT #3 id=2 cnt=1 pid=1 pos=1 obj=0 op='VIEW  (cr=13 r=0 w=0 time=228 us)'&lt;br /&gt;STAT #3 id=3 cnt=2 pid=2 pos=1 obj=0 op='WINDOW BUFFER (cr=13 r=0 w=0 time=218 us)'&lt;br /&gt;STAT #3 id=4 cnt=2 pid=3 pos=1 obj=74130 op='TABLE ACCESS BY INDEX ROWID UCBSVCO (cr=13 r=0 w=0 time=145 us)'&lt;br /&gt;STAT #3 id=5 cnt=9 pid=4 pos=1 obj=82187 op='INDEX RANGE SCAN UCBSVCO_CUST_INDEX (cr=3 r=0 w=0 time=37 us)'&lt;br /&gt;STAT #3 id=6 cnt=1 pid=1 pos=2 obj=74368 op='TABLE ACCESS BY INDEX ROWID UTRSOTP (cr=2 r=0 w=0 time=16 us)'&lt;br /&gt;STAT #3 id=7 cnt=1 pid=6 pos=1 obj=81903 op='INDEX UNIQUE SCAN UTRSOTP_KEY_INDEX (cr=1 r=0 w=0 time=9 us)'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Explain Plan&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      |  Name               | Rows  | Bytes | Cost  |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT               |                     |     1 |    48 |     4 |&lt;br /&gt;|   1 |  NESTED LOOPS                  |                     |     1 |    48 |     4 |&lt;br /&gt;|*  2 |   VIEW                         |                     |     1 |    22 |     3 |&lt;br /&gt;|   3 |    WINDOW BUFFER               |                     |     1 |    25 |     3 |&lt;br /&gt;|*  4 |     TABLE ACCESS BY INDEX ROWID| UCBSVCO             |     1 |    25 |     1 |&lt;br /&gt;|*  5 |      INDEX RANGE SCAN          | UCBSVCO_CUST_INDEX  |     8 |       |     1 |&lt;br /&gt;|   6 |   TABLE ACCESS BY INDEX ROWID  | UTRSOTP             |     1 |    26 |     1 |&lt;br /&gt;|*  7 |    INDEX UNIQUE SCAN           | UTRSOTP_KEY_INDEX   |     1 |       |       |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   2 - filter("SVCO"."DISPATCH_DT"="SVCO"."MAX_DISPATCH_DT")&lt;br /&gt;   4 - filter("UCBSVCO"."UCBSVCO_PREM_CODE"='507601' AND&lt;br /&gt;              "UCBSVCO"."UCBSVCO_STUS_CODE"='C' AND "UCBSVCO"."UCBSVCO_DISPATCH_IND" IS NOT NULL)&lt;br /&gt;   5 - access("UCBSVCO"."UCBSVCO_CUST_CODE"=1320908)&lt;br /&gt;   7 - access("SVCO"."SOTP_CD"="UTRSOTP"."UTRSOTP_CODE")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statistics Snapshot&lt;br /&gt;&lt;br /&gt;Type  Statistic Name                                    Value&lt;br /&gt;----- ---------------------------------------- --------------&lt;br /&gt;Latch cache buffers chains                              9,098&lt;br /&gt;      library cache                                     3,608&lt;br /&gt;      row cache objects                                   370&lt;br /&gt;&lt;br /&gt;Stats buffer is pinned count                                8&lt;br /&gt;      consistent gets                                      15&lt;br /&gt;      db block gets                                        53&lt;br /&gt;      execute count                                        15&lt;br /&gt;      parse count (hard)                                    1&lt;br /&gt;      physical reads                                        0&lt;br /&gt;      physical writes                                       0&lt;br /&gt;      redo size                                         9,008&lt;br /&gt;      session logical reads                                68&lt;br /&gt;      session pga memory                                    0&lt;br /&gt;      session pga memory max                                0&lt;br /&gt;      sorts (disk)                                          0&lt;br /&gt;      sorts (memory)                                        1&lt;br /&gt;      sorts (rows)                                          2&lt;br /&gt;      table fetch by rowid                                 10&lt;br /&gt;      table scan blocks gotten                              0&lt;br /&gt;&lt;br /&gt;Time  elapsed time (centiseconds)                          18&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Difference Report&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;TYPE  NAME                                           original         rewrite      DIFFERENCE&lt;br /&gt;----- --------------------------------------- --------------- --------------- ---------------&lt;br /&gt;Latch cache buffers chains                            2142103            9098         2133005&lt;br /&gt;      library cache                                    116725            3608          113117&lt;br /&gt;      row cache objects                                 19592             370           19222&lt;br /&gt;&lt;br /&gt;Stats buffer is pinned count                                8               8               0&lt;br /&gt;      consistent gets                                  106693              15          106678&lt;br /&gt;      db block gets                                        56              53               3&lt;br /&gt;      execute count                                        16              15               1&lt;br /&gt;      parse count (hard)                                    1               1               0&lt;br /&gt;      physical reads                                    59924               0           59924&lt;br /&gt;      physical writes                                       0               0               0&lt;br /&gt;      redo size                                          9524            9008             516&lt;br /&gt;      session logical reads                            106749              68          106681&lt;br /&gt;      session pga memory                               594008               0          594008&lt;br /&gt;      session pga memory max                                0               0               0&lt;br /&gt;      sorts (disk)                                          0               0               0&lt;br /&gt;      sorts (memory)                                        0               1              -1&lt;br /&gt;      sorts (rows)                                          0               2              -2&lt;br /&gt;      table fetch by rowid                                 10              10               0&lt;br /&gt;      table scan blocks gotten                         106669               0          106669&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Time  elapsed time (centiseconds)                        2016              18            1998&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Original&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;STAT #3 id=1 cnt=1 pid=0 pos=1 obj=0 op='NESTED LOOPS  (cr=106693 r=59924 w=0 time=19518419 us)'&lt;br /&gt;STAT #3 id=2 cnt=1 pid=1 pos=1 obj=74130 op='TABLE ACCESS FULL UCBSVCO (cr=106691 r=59924 w=0 time=19518381 us)'&lt;br /&gt;STAT #3 id=3 cnt=1 pid=2 pos=2 obj=0 op='SORT AGGREGATE (cr=13 r=0 w=0 time=145 us)'&lt;br /&gt;STAT #3 id=4 cnt=2 pid=3 pos=1 obj=74130 op='TABLE ACCESS BY INDEX ROWID UCBSVCO (cr=13 r=0 w=0 time=138 us)'&lt;br /&gt;STAT #3 id=5 cnt=9 pid=4 pos=1 obj=82187 op='INDEX RANGE SCAN UCBSVCO_CUST_INDEX (cr=3 r=0 w=0 time=45 us)'&lt;br /&gt;STAT #3 id=6 cnt=1 pid=1 pos=2 obj=74368 op='TABLE ACCESS BY INDEX ROWID UTRSOTP (cr=2 r=0 w=0 time=22 us)'&lt;br /&gt;STAT #3 id=7 cnt=1 pid=6 pos=1 obj=81903 op='INDEX UNIQUE SCAN UTRSOTP_KEY_INDEX (cr=1 r=0 w=0 time=12 us)'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Rewrite&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;STAT #3 id=1 cnt=1 pid=0 pos=1 obj=0 op='NESTED LOOPS  (cr=15 r=0 w=0 time=249 us)'&lt;br /&gt;STAT #3 id=2 cnt=1 pid=1 pos=1 obj=0 op='VIEW  (cr=13 r=0 w=0 time=228 us)'&lt;br /&gt;STAT #3 id=3 cnt=2 pid=2 pos=1 obj=0 op='WINDOW BUFFER (cr=13 r=0 w=0 time=218 us)'&lt;br /&gt;STAT #3 id=4 cnt=2 pid=3 pos=1 obj=74130 op='TABLE ACCESS BY INDEX ROWID UCBSVCO (cr=13 r=0 w=0 time=145 us)'&lt;br /&gt;STAT #3 id=5 cnt=9 pid=4 pos=1 obj=82187 op='INDEX RANGE SCAN UCBSVCO_CUST_INDEX (cr=3 r=0 w=0 time=37 us)'&lt;br /&gt;STAT #3 id=6 cnt=1 pid=1 pos=2 obj=74368 op='TABLE ACCESS BY INDEX ROWID UTRSOTP (cr=2 r=0 w=0 time=16 us)'&lt;br /&gt;STAT #3 id=7 cnt=1 pid=6 pos=1 obj=81903 op='INDEX UNIQUE SCAN UTRSOTP_KEY_INDEX (cr=1 r=0 w=0 time=9 us)'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the original query, there was some question as to whether or not the SELECT MAX() was happening for each row.  I had not included the predicate information section for the EXPLAIN PLAN which would have cleared this up. Note the filter on line 2 of the plan for the full table scan.&lt;pre name="code" class="sql"&gt;&lt;br /&gt;2 - filter("UCBSVCO"."UCBSVCO_STUS_CODE"='C' AND &lt;br /&gt;           "UCBSVCO"."UCBSVCO_DISPATCH_IND" IS NOT NULL AND&lt;br /&gt;           "UCBSVCO"."UCBSVCO_DISPATCH_DATE"= &lt;br /&gt;           (SELECT /*+ */ MAX("UCBSVCO"."UCBSVCO_DISPATCH_DATE") &lt;br /&gt;              FROM "UIMSMGR"."UCBSVCO" "UCBSVCO" &lt;br /&gt;             WHERE "UCBSVCO"."UCBSVCO_CUST_CODE"=1320908 &lt;br /&gt;               AND "UCBSVCO"."UCBSVCO_PREM_CODE"='507601' &lt;br /&gt;               AND "UCBSVCO"."UCBSVCO_STUS_CODE"='C' &lt;br /&gt;               AND "UCBSVCO"."UCBSVCO_DISPATCH_IND" IS NOT NULL))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The SELECT MAX query is part of the filter on this step.  That means that it will get executed once for every row that is examined.  One thing to note is that it is most likely that there will be subquery caching that occurs since the MAX query remains the same.  In other words, the MAX query will be executed once and the answer stored in a cached array so that it really won't get executed every time, only when the inputs are new.  And, in this case, the inputs are always the same so the answer will be retrieved from cache on every check except for the first one.  I've got a really good example of how subquery caching works that I'll post on another day.  :)&lt;br /&gt;&lt;br /&gt;So, the plan chosen does show that the SELECT MAX would occur as a filter for the full table scan and that means it could possibly execute once for each row.  It was just "lucky" that the MAX query always used the same inputs and therefore didn't really require an actual execution of the MAX query for each row evaluated by the WHERE clause due to subquery caching.&lt;br /&gt;&lt;br /&gt;But, the thing to notice about the original plan is that it does require 2 access operations against the UCBSVCO table where one should suffice.  The new analytic syntax does only one access operation on that table.  That's good!  If you can do something once instead of twice to get the same end result, once is better.  It's like needing to go to the store to get bread and milk and you make one trip and get the bread and bring it home, then you make a second trip to get the milk.  You could've gotten both items in a single trip and saved yourself a lot of time and effort.  It works the same way with Oracle.  Don't send Oracle to the store twice if once will do.&lt;br /&gt;&lt;br /&gt;There were a couple of other comments I wanted to discuss as well.&lt;br /&gt;From Bundit: Is there any reason to avoid using analytic function due to performance issue?&lt;br /&gt;&lt;br /&gt;I'd say that analytic functions aren't a fix for everything.  They're just another tool in the toolbox to choose from.  I like the saying "just because you have a hammer doesn't mean every problem is a nail".  You can't use analytic functions to fix everything, but you can use them to help reduce the resource requirements for certain classes of problems like the one I've demonstrated.  They won't always be the answer but they should be one of the syntax options to test when/where appropriate.  Only through proper testing would you be able to prove which way of writing a particular query would be most efficient. &lt;br /&gt;&lt;br /&gt;From Craig M: Are the columns in the partition by necessary? It seems like it isn't adding anything since you are filtering on those columns.&lt;br /&gt;&lt;br /&gt;In this case, you're right.  Since the WHERE clause is specifying only a single cust_code and prem_code, the partition by isn't really necessary.  For me, it's just a habit I'm in of always clearly indicating on which columns I want grouping to occur.&lt;br /&gt;&lt;br /&gt;Also from Craig M: Also, I use analytic functions frequently, however I am not sure I would have ever thought to this problem in this way. Would it provide an advantage over something like &lt;pre name="code" class="sql"&gt;&lt;br /&gt;with max_ucbsvco as&lt;br /&gt;(select sotp_cd&lt;br /&gt;   from&lt;br /&gt;    (   select ucbsvco_sotp_code sotp_cd&lt;br /&gt;          from ucbsvco&lt;br /&gt;         where ucbsvco_cust_code = :b1&lt;br /&gt;           and ucbsvco_prem_code = :b2&lt;br /&gt;           and ucbsvco_stus_code = 'C'&lt;br /&gt;           and ucbsvco_dispatch_ind is not null&lt;br /&gt;           and ucbsvco_dispatch_date is not null&lt;br /&gt;         order by ucbsvco_dispatch_date desc&lt;br /&gt;    )&lt;br /&gt;  where rownum = 1&lt;br /&gt;)&lt;br /&gt;select utrsotp_desc&lt;br /&gt;  from utrsotp&lt;br /&gt; where utrsotp_code = &lt;br /&gt;       ( select sotp_cd&lt;br /&gt;           from max_ucbsvco);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The only way I can answer this now is to say we'd have to test it and see.  But, I think the analytic version would still be better if this version did what I think you're expecting it to do and materialize a temp table with the result of the query against UCBSVCO.  First, the plan for this version would require an "almost" sort.  The use of ORDER BY to put the rows in descending order would mean the rows output from that step would need to come out in sorted order and Oracle would have to do that operation.  Now, because of ROWNUM, it should do an in-line sort vs. a normal sort operation.  In other words, as the rows are read, Oracle will check to see if the ucbsvco_dispatch_date column value is greater than the previous row's value.  After all the rows are read, then it will have the one row which has the most current (MAX) value.  So, I'd want to see how the bit of extra ordering work would be handled as compared to the analytic version.&lt;br /&gt;&lt;br /&gt;The other thing is that if the result set is materialized for that query, there will be some small overhead to create that temp table and then read from it.  That overhead doesn't exist in the analytic version.&lt;br /&gt;&lt;br /&gt;So, my instinct on this one is that the analytic version would still win.  I mean 15 LIOs and .18 seconds is likely going to be pretty hard to beat.  But, it's just speculation unless I get a chance to visit that client again and test it out.  :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to everyone who commented on the original post and I hope this follow-up provides more info to clarify issues raised.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-90806686442227590?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/90806686442227590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=90806686442227590' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/90806686442227590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/90806686442227590'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/analytics-to-rescue-followup.html' title='Analytics to the rescue - followup'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-674389018794053807</id><published>2008-07-16T19:20:00.000-04:00</published><updated>2008-07-21T17:13:33.187-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bad SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle analytic functions'/><title type='text'>Analytics to the rescue</title><content type='html'>I see a lot of SQL.  Actually, I see a lot of &lt;span style="font-style: italic;"&gt;bad&lt;/span&gt; SQL.  I guess that's because my job is mainly to help people with performance problems and the majority of the time, the problems are rooted in one or more inefficient SQL statements.  Yesterday I was doing a demo of our &lt;a href="http://method-r.com/software/profiler-info"&gt;Profiler&lt;/a&gt; software and showed one case that I see over and over, so I thought I'd share it here.&lt;br /&gt;&lt;br /&gt;I have a profile for a 4 hour and 44 minute trace of an application process that was taking too long.  The top 3 events in the profile (accounting for 82% of the total overall response time) were:&lt;br /&gt;&lt;pre&gt;CPU service, FETCH calls  8,357.40s (48.9%)&lt;br /&gt;db file scattered read    3,075.95s (18.0%)&lt;br /&gt;db file sequential read   2,577.67s (15.1%)&lt;/pre&gt;The SQL statement that topped the list taking 12,695.90s (74.3% of the total response time) was:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;select utrsotp_desc&lt;br /&gt;from utrsotp, ucbsvco&lt;br /&gt;where ucbsvco_sotp_code = utrsotp_code&lt;br /&gt;and ucbsvco_dispatch_date =&lt;br /&gt;  (select max(ucbsvco_dispatch_date)&lt;br /&gt;     from ucbsvco&lt;br /&gt;    where ucbsvco_cust_code = :b1&lt;br /&gt;      and ucbsvco_prem_code = :b2&lt;br /&gt;      and ucbsvco_stus_code = 'C'&lt;br /&gt;      and ucbsvco_dispatch_ind is not null)&lt;br /&gt;and ucbsvco_stus_code = 'C'&lt;br /&gt;and ucbsvco_dispatch_ind is not null;&lt;br /&gt;&lt;/pre&gt;Given the fact that this one statement accounted for 74% of the overall response time, with a quick look at the rest of the profile, you could see that this one query was responsible for almost all the response time consumed by the top 3 events in the profile.  So, the cool thing about this profile is that it was easy to see that by fixing one SQL statement, we'd basically get rid of our dominant problem.   &lt;br /&gt;&lt;br /&gt;Now, a bit more info.  This statement was executed 1,332 times during the almost 5 hour period captured by the trace.  The query returned only 587 rows and did a total of 141,084,499 block accesses (LIOs).  That means that on average it took almost 160,000 LIOs for each execution.  Ummm...that's &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; good.  It should be using something like 20 LIOs or less per row (based on a maximum tolerance of no more than 10 LIOs per joined table per row).&lt;br /&gt;&lt;br /&gt;It kinda seems obvious that there's a big problem with this query doesn't it?  So, why had this process been running for so long without someone catching it?  I mean, if we could fix this one statement, we could cause as much as a 74% reduction in response time.  That means the 4 hr and 44 minute process could drop down to about 1 hour and 15 minutes.  &lt;br /&gt;&lt;br /&gt;But the problem was in the way the code was being reviewed on the test instance.  First, (mistake 1) only EXPLAIN PLAN was used to review the anticipated plan for the SQL and (mistake 2) the SQL was executed to make sure the response time (for a single execution), &lt;span style="font-style: italic;"&gt;seemed reasonable&lt;/span&gt;.  Another thing worth noting is (mistake 3) that the test instance had only about 10% of the volume of data as production, so virtually anything that was executed took only a second or so due to the lack of volume.  So, the response time never was really noted as an issue because it always ran &lt;span style="font-style: italic;"&gt;fast&lt;/span&gt;.  The EXPLAIN PLAN didn't really rasie any eyebrows either because it looked like this:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      |  Name               | Rows  | Bytes | Cost  |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT               |                     |     1 |    38 |  1768 |&lt;br /&gt;|   1 |  NESTED LOOPS                  |                     |     1 |    38 |  1768 |&lt;br /&gt;|   2 |   TABLE ACCESS FULL            | UCBSVCO             |     1 |    12 |  1767 |&lt;br /&gt;|   3 |    SORT AGGREGATE              |                     |     1 |    20 |       |&lt;br /&gt;|   4 |     TABLE ACCESS BY INDEX ROWID| UCBSVCO             |     1 |    20 |     1 |&lt;br /&gt;|   5 |      INDEX RANGE SCAN          | UCBSVCO_CUST_INDEX  |     8 |       |     1 |&lt;br /&gt;|   6 |   TABLE ACCESS BY INDEX ROWID  | UTRSOTP             |     1 |    26 |     1 |&lt;br /&gt;|   7 |    INDEX UNIQUE SCAN           | UTRSOTP_KEY_INDEX   |     1 |       |       |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;Now, the TABLE ACCESS FULL step might have raised a few eyebrows, but since they saw Rows = 1 at that step, they figured it shouldn't be a problem.  I mean, hey, if there's only going to be one row pulled from the table, they thought, how bad could it be? (Remember that they were seeing sub-second response times in test.)&lt;br /&gt;&lt;br /&gt;But, once I was able to point out the combined effect of executing that SQL over 1300 times in their production, full volume environment, the problem was (all of a sudden) easy to see.  Something needed to be done to make this SQL statement more efficient.&lt;br /&gt;&lt;br /&gt;As I mentioned when I first started this post, I see SQL statements similar to this one over and over again.  They are very typical in that lots of apps use tables that store both historical and current info in them.  For instance, imagine that if you wanted to get the latest price from a product table that stored each price in a separate product row with an effective date column value used to indicate the date the price was put into effect.  In order to do that, you'd have to make sure you retrieved the row which had the MAX effective date for that product.  The way the query is most commonly formulated to do this is with this WHERE clause:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;WHERE price_eff_dt = (SELECT MAX(price_eff_dt) FROM product_tab WHERE product_id = outer.product_id)&lt;/pre&gt;This is exactly what was going on in the problem query in this process.&lt;br /&gt;&lt;br /&gt;Analytics to the rescue! By using an analytic MAX function instead, Oracle is able to make a single pass over the data to get the answer it needs.  Here's the query rewritten to use an analytic MAX function instead:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;select utrsotp_desc&lt;br /&gt; from utrsotp,&lt;br /&gt;      (select ucbsvco_sotp_code sotp_cd, ucbsvco_dispatch_date dispatch_dt,&lt;br /&gt;              max(ucbsvco_dispatch_date) over (partition by ucbsvco_cust_code,&lt;br /&gt;      ucbsvco_prem_code) max_dispatch_dt&lt;br /&gt;         from ucbsvco&lt;br /&gt;        where ucbsvco_cust_code = :b1&lt;br /&gt;          and ucbsvco_prem_code = :b2&lt;br /&gt;          and ucbsvco_stus_code = 'C'&lt;br /&gt;          and ucbsvco_dispatch_ind is not null) svco&lt;br /&gt;where svco.dispatch_dt = svco.max_dispatch_dt&lt;br /&gt;  and svco.sotp_cd = utrsotp_code;&lt;br /&gt;&lt;/pre&gt;The plan for this query was:&lt;pre name="code" class="sql"&gt;&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      |  Name               | Rows  | Bytes | Cost  |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT               |                     |     1 |    48 |     4 |&lt;br /&gt;|   1 |  NESTED LOOPS                  |                     |     1 |    48 |     4 |&lt;br /&gt;|*  2 |   VIEW                         |                     |     1 |    22 |     3 |&lt;br /&gt;|   3 |    WINDOW BUFFER               |                     |     1 |    25 |     3 |&lt;br /&gt;|*  4 |     TABLE ACCESS BY INDEX ROWID| UCBSVCO             |     1 |    25 |     1 |&lt;br /&gt;|*  5 |      INDEX RANGE SCAN          | UCBSVCO_CUST_INDEX  |     8 |       |     1 |&lt;br /&gt;|   6 |   TABLE ACCESS BY INDEX ROWID  | UTRSOTP             |     1 |    26 |     1 |&lt;br /&gt;|*  7 |    INDEX UNIQUE SCAN           | UTRSOTP_KEY_INDEX   |     1 |       |       |&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tests of the two queries on a full volume data source (for a single set of bind values expected to return 1 row), had the following results:&lt;br /&gt;Original query&lt;br /&gt;160,693 LIOs&lt;br /&gt;20.16s&lt;br /&gt;&lt;br /&gt;New query&lt;br /&gt;15 LIOs&lt;br /&gt;.18s&lt;br /&gt;&lt;br /&gt;That's a 99%+ reduction in LIOs and response time.  Not bad, huh?  :)&lt;br /&gt;&lt;br /&gt;Simple change, massive difference.  I didn't get to stay around long enough on the client site to see the fix implemented in production, but the expected benefit would mean, as mentioned above, that the response time should drop down from nearly 5 hours to just over 1 hour.  Nice.&lt;br /&gt;&lt;br /&gt;So, I'm always glad to see examples like this one pop up when I'm helping a customer with performance issues.  The analytic function is a nice alternative to the traditional way of writing these types of queries that works extremely well and provides the performance needed for high numbers of executions in a high data volume environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-674389018794053807?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/674389018794053807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=674389018794053807' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/674389018794053807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/674389018794053807'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/analytics-to-rescue.html' title='Analytics to the rescue'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2121300669525664117</id><published>2008-07-10T22:30:00.000-04:00</published><updated>2008-07-21T17:18:28.688-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle optimizer'/><category scheme='http://www.blogger.com/atom/ns#' term='INDEX FULL SCAN (MIN/MAX)'/><title type='text'>MIN/MAX and Index Full Scans</title><content type='html'>We got a question at work today from a blogger in regard to his blog post entitled &lt;a href="http://momendba.blogspot.com/2008/07/min-and-max-functions-in-single-query.html" target="_blank"&gt;MIN and MAX Functions in a Single Query are Disastrous&lt;/a&gt;.  If you check out his post, you'll see the details of his tests.  Basically, he was wondering why the optimizer would choose to do a full table scan instead of using an INDEX FULL SCAN (MIN/MAX) operation for a query that contained both a MIN and a MAX function call on the same indexed column.  I thought my answer to his question to us, about why the optimizer makes such a "bad" decision about the execution plan, would be a good topic for my post today.&lt;br /&gt;&lt;br /&gt;Normally, if you write a query that uses only one call, either MIN or MAX, the optimizer will use the INDEX FULL SCAN (MIN/MAX) optimization to read only through to the first leaf block (for MIN) and to the last leaf block (for MAX).  This is a great optimization that can save hundreds/thousands of block accesses over either a full table scan or even an INDEX FAST FULL SCAN.  But, as Momen's tests show, if you execute a query that has both MIN and MAX in it, the optimizer refuses to use this optimization although it would seem to us (the feeble human brain) that the optimizer should know that it could do the operation twice, once to get the first block and once to get the last block, right?&lt;br /&gt;&lt;br /&gt;But, the optimizer can't do this.  The INDEX FULL SCAN (MIN/MAX) operation will do &lt;span style="font-style: italic;"&gt;either&lt;/span&gt; an index scan for the first leaf block &lt;span style="font-style: italic;"&gt;or&lt;/span&gt; an index scan for the last leaf block.  It can not do both at the same time.  Think about it...  The code to handle the operation would have to have some fairly specific logic in it to handle the dual calls.&lt;br /&gt;&lt;br /&gt;The question to then ask is why wouldn't Oracle choose to add that logic?  Well, since there's actually an easy way to get the result you want using the current operation's code path, I'd say Oracle didn't want to invest development time into writing specific case code when the simple branch of MIN or MAX can work properly as long as the developer knows how to write their SQL to invoke it.&lt;br /&gt;&lt;br /&gt;Here's what has to happen.&lt;br /&gt;This query:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;select min(empno) min_empno, max(empno) max_empno&lt;br /&gt;from emp;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation             | Name    | Rows  | Bytes | Cost (%CPU)| Time     |&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT      |         |     1 |     5 |   442   (5)| 00:00:06 |&lt;br /&gt;|   1 |  SORT AGGREGATE       |         |     1 |     5 |            |          |&lt;br /&gt;|   2 |   INDEX FAST FULL SCAN| PK_EMP  |   917K|  4480K|   442   (5)| 00:00:06 |&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;      196  recursive calls&lt;br /&gt;        0  db block gets&lt;br /&gt;     1959  consistent gets&lt;br /&gt;        1  physical reads&lt;br /&gt;        0  redo size&lt;br /&gt;      476  bytes sent via SQL*Net to client&lt;br /&gt;      381  bytes received via SQL*Net from client&lt;br /&gt;        2  SQL*Net roundtrips to/from client&lt;br /&gt;        6  sorts (memory)&lt;br /&gt;        0  sorts (disk)&lt;br /&gt;        1  rows processed&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;becomes this:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;select a.min_empno, b.max_empno&lt;br /&gt;from&lt;br /&gt;  (select min(empno) min_empno from emp) a,&lt;br /&gt;  (select max(empno) max_empno from emp) b;&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |&lt;br /&gt;----------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT             |         |     1 |    26 |     6   (0)| 00:00:01 |&lt;br /&gt;|   1 |  NESTED LOOPS                |         |     1 |    26 |     6   (0)| 00:00:01 |&lt;br /&gt;|   2 |   VIEW                       |         |     1 |    13 |     3   (0)| 00:00:01 |&lt;br /&gt;|   3 |    SORT AGGREGATE            |         |     1 |     5 |            |          |&lt;br /&gt;|   4 |     INDEX FULL SCAN (MIN/MAX)| PK_EMP  |   917K|  4480K|     3   (0)| 00:00:01 |&lt;br /&gt;|   5 |   VIEW                       |         |     1 |    13 |     3   (0)| 00:00:01 |&lt;br /&gt;|   6 |    SORT AGGREGATE            |         |     1 |     5 |            |          |&lt;br /&gt;|   7 |     INDEX FULL SCAN (MIN/MAX)| PK_EMP  |   917K|  4480K|     3   (0)| 00:00:01 |&lt;br /&gt;----------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;        0  recursive calls&lt;br /&gt;        0  db block gets&lt;br /&gt;        6  consistent gets&lt;br /&gt;        0  physical reads&lt;br /&gt;        0  redo size&lt;br /&gt;      476  bytes sent via SQL*Net to client&lt;br /&gt;      381  bytes received via SQL*Net from client&lt;br /&gt;        2  SQL*Net roundtrips to/from client&lt;br /&gt;        0  sorts (memory)&lt;br /&gt;        0  sorts (disk)&lt;br /&gt;        1  rows processed&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The same results could also be achieved by doing a UNION of the two separate statements.  Either way, what is required is that the developer must understand how the optimizer utilizes the INDEX FULL SCAN (MIN/MAX) optimization and write their SQL to take full advantage of it.&lt;br /&gt;&lt;br /&gt;Perhaps at some point (I haven't tested this in 11g yet to see if the optimizer behaves any differently) the optimizer will have code path to handle both calls simultaneously, but for now, the developer must provide the optimizer with syntax to allow the optimizer to formulate the optimal overall execution plan.&lt;br /&gt;&lt;br /&gt;To me, this is just one more really good example why the database should not be "just a black box" to developers.  Writing high performance SQL requires understanding how the Oracle optimizer works, not just an ability to put together a statement that gets the correct answer.&lt;br /&gt;&lt;br /&gt;Thanks to Momen for his post and his question to &lt;a href="http://www.method-r.com/"&gt;Method R&lt;/a&gt; on this.  It was good food for thought and nice blog fodder!  :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Addendum - July 11, 2008, 8:57am&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Thanks to my colleague Ron who did the 11g test on this and he confirmed that the optimizer behavior has not changed.  So, even in 11g, the SQL would need to be written to submit the MIN and MAX calls separately in order to get the optimal execution plan.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2121300669525664117?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2121300669525664117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2121300669525664117' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2121300669525664117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2121300669525664117'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/minmax-and-index-full-scans.html' title='MIN/MAX and Index Full Scans'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-5541185998150059249</id><published>2008-07-08T19:15:00.000-04:00</published><updated>2008-07-08T19:15:01.770-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brand'/><category scheme='http://www.blogger.com/atom/ns#' term='survey'/><title type='text'>Interesting survey results</title><content type='html'>I read recently about a study conducted by product review online TV site, ExpoTV, where it was found that many people do actually want to "have a conversation" with a brand.    &lt;span style="font-style: italic;"&gt;Brand&lt;/span&gt; can mean many different things.  For example, Mr. Whipple (Charmin) and Tony the Tiger (Frosted Flakes) are examples of spokespersons who become part of the brand.  Logos or fonts can also represent brands.  Think of the Disney font or the font used for the Harry Potter movies.  Branding is also slogans, like Nike's "Just do it".  And sometimes the brand is just the company name like Apple or Starbucks. &lt;br /&gt;&lt;br /&gt;The study found:&lt;br /&gt;&lt;blockquote&gt;- Consumers not only want to talk to brands, they want to establish a conversation. 55% of consumers want an ongoing dialogue with brands.&lt;br /&gt;&lt;br /&gt;- Learning about new products in the pipeline is a top priority. Respondents were most anxious to talk to the product design (49%) department, followed by customer support (14%), marketing (14%) and pricing (13%).&lt;br /&gt;&lt;br /&gt;- Positive brand experiences can generate word-of-mouth buzz. More than 60% of those polled said they tell 10 or more people about the products they like while a third tell 20 or more people.&lt;br /&gt;&lt;br /&gt;- Listening leads to loyalty. 89% of respondents would feel more loyal to brands which invited them to participate in a feedback group, and 92 percent of those who have a positive experience communicating with a brand will recommend purchasing a product from that brand to someone they know.&lt;br /&gt;&lt;br /&gt;- Consumers are open to engaging with the competition. 93 percent of consumers surveyed would be interested or very interested in communicating with competitive brands that expressed interest in their feedback if their first choice is not interested in hearing what they have to say.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I know from my own experience with my iPhone and Kindle for example, that I'm more than happy to share my experiences with others and to recommend the products based on my good experiences.  I really like being able to check forums for questions and reviews and I think more highly of those companies whose products I buy that provide them.  &lt;br /&gt;&lt;br /&gt;I think this is important for any business, or even people in the public eye, to know.  People want the opportunity to interact and to share.  I think that's one of the reasons why blogging is so popular.  Making your brand hard to interact with makes people think you've got something to hide and makes them wary.  &lt;br /&gt;&lt;br /&gt;Opening up a discussion that allows people to share anything/everything about your brand can be a bit scary.  I mean, what if someone says something "bad"?  In the end, I think that an open dialogue is most important and if there is something "bad", it gives the brand owner a chance to respond and make corrections and have that be seen as well.  I like hearing stories where a company "made it right" with a customer.  It makes you believe there is a real concern about the consumer involved and it's not just a big machine cranking out product with the only goal being revenue generation.  Revenue is certainly important, but if you treat your customers in a top-notch way, the revenue will come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-5541185998150059249?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/5541185998150059249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=5541185998150059249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5541185998150059249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/5541185998150059249'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/interesting-survey-results.html' title='Interesting survey results'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2447200657037206965</id><published>2008-07-07T22:20:00.000-04:00</published><updated>2008-07-07T22:22:39.143-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle vs Fisher Price'/><title type='text'>Unbreakable?</title><content type='html'>Oracle has had the "unbreakable" marketing spiel going for some time now.  I don't know that I buy their bit, but today, I found the ultimate in unbreakable and it has nothing to do with Oracle.  Move over Oracle.  Meet Fisher Price.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_gB2tAQrrKSw/SHLNFq2G6gI/AAAAAAAAAD4/QYKVtMFF-gM/s1600-h/fp_ark.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_gB2tAQrrKSw/SHLNFq2G6gI/AAAAAAAAAD4/QYKVtMFF-gM/s400/fp_ark.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220460415360100866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Today I bought my daughter a Fisher Price Little People: Noah's Ark with Ark Animals set.  She has the farm and loves it so I thought she'd also really like this new one since it has so many cool animals.  But when I got the thing home and started to try to get it out of the box (note that the photo above shows the item completely unboxed and there is no warning on the packaging of the arduous task you face to get it that way!), it was like trying to break out of a maximum security prison.  There were more twisty ties wrapped around plastic anchors bound to cardboard fortified with packing tape than you can imagine.  The thing took me the better part of an hour just to get everything detached!  I'm talking secure!&lt;br /&gt;&lt;br /&gt;Oracle could take a lesson from Fisher Price I think....  If Oracle had half the "unbreakable-ness" that Fisher Price employs in their packaging, Oracle would be unbreakable indeed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2447200657037206965?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2447200657037206965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2447200657037206965' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2447200657037206965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2447200657037206965'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/07/unbreakable.html' title='Unbreakable?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_gB2tAQrrKSw/SHLNFq2G6gI/AAAAAAAAAD4/QYKVtMFF-gM/s72-c/fp_ark.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-607341131592409960</id><published>2008-06-29T13:30:00.000-04:00</published><updated>2008-07-21T17:34:36.151-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics_level'/><category scheme='http://www.blogger.com/atom/ns#' term='tkprof'/><title type='text'>Plan execution statistics</title><content type='html'>I recently saw a thread at &lt;a href="http://asktom.oracle.com/"&gt;AskTom&lt;/a&gt; where someone had asked a question about &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:969160000346108326"&gt;using tkprof for tuning a query&lt;/a&gt;.  Tom provided an example of tracing the execution of a query and then using tkprof to summarize the trace file into a readable report and finally how to interpret what the report shows.&lt;br /&gt;&lt;br /&gt;The part that caught my eye (and the eye of another reader) was the execution plan output display in the report.  It looked like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;Rows       Row Source Operation&lt;br /&gt;---------  ---------------------------------------------------&lt;br /&gt;        1  SORT AGGREGATE (cr=1840797 pr=1840758 pw=0 time=262104893 us)&lt;br /&gt;128000000   TABLE ACCESS FULL BIG_TABLE (cr=1840797 pr=1840758 pw=0 time=384004887 us)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note the statistics (in parentheses) for each row source operation.  The time shown for the first step is time=262104893.  This is also close to the approximate total elapsed time shown for the query (~262 seconds).  But, look at the second step which is a child of step 1.  It shows a time=384004887 (~384 seconds).  How can that be?  Child steps roll their totals into their parents so that the parent totals are all their children plus themselves.  So, there is no way the child took around 384 seconds but the parent took 262 seconds.  Tom offered an explanation of why the numbers were different that basically shows how where instrumentation calls are placed can cause measurement errors to creep in.&lt;br /&gt;&lt;br /&gt;Well, while I know measurement errors do exist, I think the specific problem here isn't related to any type of measurement error.  It has to do with the setting of the STATISTICS_LEVEL parameter.  The STATISTICS_LEVEL parameter is set to TYPICAL by deafult, and at the default level, plan execution statistics are DISABLED.  You can see this with these two queries:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SQL&gt; select value from v$parameter where upper(name) = 'STATISTICS_LEVEL' ;&lt;br /&gt;&lt;br /&gt;VALUE&lt;br /&gt;------------------------------------------&lt;br /&gt;TYPICAL&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT session_status,&lt;br /&gt;  2         system_status,&lt;br /&gt;  3         activation_level,&lt;br /&gt;  4         session_settable&lt;br /&gt;  5  FROM   v$statistics_level&lt;br /&gt;  6  WHERE  statistics_name = 'Plan Execution Statistics'&lt;br /&gt;  7  /&lt;br /&gt;&lt;br /&gt;Session    System     Activation Session&lt;br /&gt;Status     Status     Level      Settable&lt;br /&gt;---------- ---------- ---------- ----------&lt;br /&gt;DISABLED   DISABLED   ALL        YES&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The first query shows my current parameter setting (TYPICAL) and the second shows what setting the plan execution statistics have at this level (DISABLED).  The second query also shows that the activation level for collecting this information is at ALL.&lt;br /&gt;&lt;br /&gt;So, I recreated the same test as Tom used and here's my plan display (note the time= values are "off", just like Tom's):&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;      1  SORT AGGREGATE (cr=120 pr=0 pw=0 time=11988 us)&lt;br /&gt;  28736   INDEX FAST FULL SCAN BIG_TAB_SO_IDX (cr=120 pr=0 pw=0 time=287550 us)(object id 52645)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next, I executed ALTER SESSION SET STATISTICS_LEVEL = ALL and ran the test again.  Now look what I get:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;      1  SORT AGGREGATE (cr=120 pr=113 pw=0 time=148169 us)&lt;br /&gt;  28736   INDEX FAST FULL SCAN BIG_TAB_SO_IDX (cr=120 pr=113 pw=0 time=93170 us)(object id 52645)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After setting the STATISTICS_LEVEL parameter to ALL, my child time is less than the parent indicating that the parent appears to have correctly rolled up the child into its totals.  Therefore, if you want completely correct plan execution statistics, you must have the STATISTICS_LEVEL parameter set to ALL.  Otherwise, the only number that is correct is the topmost step in the plan (id=1).&lt;br /&gt;&lt;br /&gt;I think the plan execution statistics are extremely helpful when evaluating query performance, so I like to have my parameter set to ALL for session testing.  &lt;br /&gt;&lt;br /&gt;However, I'd like to know why Oracle doesn't just show the child steps with null values if they are not correct.  Notice that the cr and pr values seem to be correct in both cases in my example, but I think that's coincidence.  I recall seeing other cases where this hasn't been true (at least in early 10 releases).&lt;br /&gt;&lt;br /&gt;What I'd like to know is what is going on under the covers?  But, lacking that knowledge, I've learned to ignore all the row source operation execution statistics except for the topmost one if the parameter isn't set to ALL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-607341131592409960?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/607341131592409960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=607341131592409960' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/607341131592409960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/607341131592409960'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/plan-execution-statistics.html' title='Plan execution statistics'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7816186935138427352</id><published>2008-06-25T16:00:00.000-04:00</published><updated>2008-06-25T16:00:00.972-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><title type='text'>What technological advances provide</title><content type='html'>There are so many things that technological advances have added to our lives.  I know many of them I take for granted.  My 96 year old grandmother has seen so much change in her lifetime and I often wonder at her perspective on it all.  I asked her once if she could name a thing or two that she thought were the best things she's seen become commonplace in her lifetime and she answered with "indoor plumbing" and "washing machines".  My grandmother was a mother of 6 so both of these "bests" seem quite fitting.  :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SGKILq1GkPI/AAAAAAAAADw/_R9DvHP8W4s/s1600-h/outhouse.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SGKILq1GkPI/AAAAAAAAADw/_R9DvHP8W4s/s400/outhouse.jpeg" alt="" id="BLOGGER_PHOTO_ID_5215881052505411826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;But, since I've always had indoor plumbing and a washing machine handy, I was trying to think what I'd consider my top two things.  I'd certainly not be very happy if I had to head to the outhouse or wash my clothes in a bucket with a scrub board, but I don't think that either of those things is something I'll ever have to revert to doing.  I'll bet, if you've read my recent blog posts, you'd think I'd say the Kindle or the MacBook.  :)   Well, I think I can certainly say that many of the cool gadgets I use every day are in my top 10, I think what is at the top of my list is of a slightly different, although related, caliber.&lt;br /&gt;&lt;br /&gt;First, the explosion of services that allow me to do many of the tasks I used to have to do in person to be done over the internet.  Banking.  Shopping.  Research.  I can't remember the last time I went into a bank.  The closest I've come is the drive-thru ATM.  My paychecks are deposited electronically, I pay all my bills with internet banking.  I can order books, clothes, toys, gifts, movies, music and even order my groceries and have them delivered to my door.  I can research any topic with ease and get piles of information (admittedly, some not so good) within seconds.&lt;br /&gt;&lt;br /&gt;Second, how easily and readily I can communicate with anyone, anywhere.  I have my mobile phone, internet phone, land line phone, email, blogging...  The ability to connect with people is so easy.  Some people feel that we've taken it too far and that the pervasive use of communication technology is taking away from the time we have instead of adding to it.  I think any tool or technology can be misused so that it leads away from the problem or situation it was invented to help.  But, in general terms, having this particular technology available (in my opinion) makes communicating and staying connected with people so much better and easier.&lt;br /&gt;&lt;br /&gt;There are so many things that advances in technology bring and I can't really imagine all the things that I'll see in my lifetime if I live to my grandmother's age.  But, I have to say I'm glad I'm part of this generation and not my grandparent's generation who had the experience of visiting outhouses and doing wash by hand!  If the worst "remember when" I have to share with my daughter is that I once only had a corded telephone, that's OK by me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7816186935138427352?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7816186935138427352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7816186935138427352' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7816186935138427352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7816186935138427352'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/what-technological-advances-provide.html' title='What technological advances provide'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SGKILq1GkPI/AAAAAAAAADw/_R9DvHP8W4s/s72-c/outhouse.jpeg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-3616454287809622777</id><published>2008-06-24T16:27:00.000-04:00</published><updated>2008-06-24T16:48:34.971-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='Amazon Kindle'/><title type='text'>Kindle update</title><content type='html'>I &lt;a href="http://karenmorton.blogspot.com/2008/06/my-new-toy.html"&gt;posted&lt;/a&gt; a couple of weeks ago about my new Kindle.  Since then, I've already come to love the thing so much that I can't imagine life without it.  I've completed three novels and have two more downloaded and ready to read.  Plus, I've purchased several of the books I had in paper copy so I've always got them handy on my Kindle.  I've learned to make notes and highlight the passages that have special meaning to me or have things I want to remember.  And, I've converted a couple of my technical books that were in PDF form to Kindle format and loaded them.&lt;br /&gt;&lt;br /&gt;I had wondered if I was going to miss my books.  Well, I'm still not ready to say I'm off of paper books entirely, but if I can continue to get the books I want in Kindle format, I'm beginning to think that my bookshelf is going to be much less crowded.  I'm not missing my hard copy books so far.  As a matter of fact, I'm really liking the ease of having them so readily available on my Kindle.  I don't have to worry about transporting several books with me as I travel.  For instance, I just made a trip to Dallas for the week and on my flights here, I finished one book and started another and then spent a bit of time reading sections of two others before going back to the main novel I'm engrossed in.  And I did that all without doing anything other than use my thumbs!&lt;br /&gt;&lt;br /&gt;I did check out the features of my Kindle that are under the menu title of "Experimental".  This is where you can use the "free" Amazon Whispernet wireless service to connect to the web.  The browser interface is pretty crude, but if you want to just read your Google, or other web mail, it works OK.  But, I've decided that feature doesn't really "get me" like the book reader does.  I don't envision my Kindle becoming my one do it all device, but for my books, it's aces.&lt;br /&gt;&lt;br /&gt;I've read some reviews of other people's experience and it seems to be much the same as mine.  Once you start using a Kindle, all the reasons you thought you might want to have "real" books start to disappear.  Much like my switch over to a Mac, this switch may be another one that truly changes the way I do things...and very much so for the better!&lt;br /&gt;&lt;br /&gt;---- Update to this post ----&lt;br /&gt;I just read a post at Seth Godin's blog entitled &lt;a href="http://sethgodin.typepad.com/seths_blog/2008/06/random-thoughts.html"&gt;Random Thoughts about the Kindle&lt;/a&gt;.  Some of his ideas are interesting about how he thinks the Kindle could be improved that may appeal to some.  I find I have mixed emotions about these "improvements" he mentions.  As I mentioned above, I like my Kindle because it makes reading easier, faster and it's just cool (I love it when people stop to comment on it when they see me reading it).  Seth talks about having a more interactive component that allows you to comment, see other people's comments, and alot more.  But, when I'm reading an "I don't want to think" novel and just be entertained, I'm not sure the thought of stopping in the middle of a paragraph to comment on the passage and read what 40 other people are saying about it is what I want.  I think I'd like that functionality available for lookup, but not taking up screen real estate on my display as I'm reading.  It'll be interesting to see how Amazon and the public feels about these kinds of features and if any of them get implemented in future Kindle software updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-3616454287809622777?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/3616454287809622777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=3616454287809622777' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3616454287809622777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/3616454287809622777'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/kindle-update.html' title='Kindle update'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-8786086095752913503</id><published>2008-06-18T22:50:00.000-04:00</published><updated>2008-06-19T12:48:54.149-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='root canal'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle performance problem'/><title type='text'>Oracle Performance Problems and Root Canals</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SFnJimOp7JI/AAAAAAAAADo/14QR8Xp4jqA/s1600-h/toothache.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SFnJimOp7JI/AAAAAAAAADo/14QR8Xp4jqA/s400/toothache.jpg" alt="" id="BLOGGER_PHOTO_ID_5213419639872810130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Take a look at this picture.  Would you know if this guy was having a toothache or a bad Oracle performance problem?&lt;br /&gt;&lt;br /&gt;As I had a root canal this morning, I had the opportunity to ponder how a root canal and a nasty Oracle performance problem are alike.  Yes, this is a stretch, but my mouth is sore and I'm in a mood...so this is it.&lt;br /&gt;&lt;br /&gt;Anyway, when you have a problem with a tooth that requires a root canal to alleviate the pain, there are several things going on.&lt;br /&gt;1) The pain is nearing the point where you're fine with any solution that will just &lt;span style="font-style: italic;"&gt;stop the pain&lt;/span&gt;.  You don't really care about what happens afterwards, you just want the current pain to end.&lt;br /&gt;2) There is no amount of money that is &lt;span style="font-style: italic;"&gt;too much&lt;/span&gt; to pay to get the relief you want/need.&lt;br /&gt;3) All the soft, gentle words about how everything's going to be alright from the guy who is going to fix the problem only tick you off.  (Remember #1.)  Just shut up and fix it already!&lt;br /&gt;&lt;br /&gt;Have you ever had a really bad performance problem hit and everyone is having a fit to get it fixed?  Your users are screaming, your management is screaming...you know the drill, right?  Think about it for a second...I think the same 3 things that happen when you're in need of a root canal are the same 3 things that happen when you've got a performance problem and it needs to be solved.  I actually had a colleague say to me "this is about as fun as a root canal" once when we were working on a problem that was a very big pain to the business (and therefore to us).&lt;br /&gt;&lt;br /&gt;Now that I've experienced both, I can say the similarities are so alike as to certainly be in the same category.  But, after today's root canal, I'm of the mind that I'd much rather have the pain of an Oracle performance problem to suffer through.  Well...except for a performance problem they don't give you nice pain killers and anesthetic to get you through it!  Maybe the root canal isn't so bad after all...   :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-8786086095752913503?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/8786086095752913503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=8786086095752913503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8786086095752913503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8786086095752913503'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/oracle-performance-problems-and-root.html' title='Oracle Performance Problems and Root Canals'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SFnJimOp7JI/AAAAAAAAADo/14QR8Xp4jqA/s72-c/toothache.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-2546666757551006475</id><published>2008-06-17T22:22:00.000-04:00</published><updated>2008-06-17T22:25:10.659-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MacBook Pro'/><title type='text'>MacBook convert</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gB2tAQrrKSw/SFhwL8VipTI/AAAAAAAAADg/pTJNMADvnco/s1600-h/macbookpro.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_gB2tAQrrKSw/SFhwL8VipTI/AAAAAAAAADg/pTJNMADvnco/s400/macbookpro.jpg" alt="" id="BLOGGER_PHOTO_ID_5213039919158699314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I used to think Macs were for wimps.  I used to think only graphic designers, artists and school kids used them.  And people used to think the world was flat.&lt;br /&gt;&lt;br /&gt;I have seen the light.  I am now a Mac convert.  I switched over in February to using a MacBook Pro and while it's taken me a while to fully leave behind my Dell laptop, I think I can officially say that I'm there.  I haven't had to use my old laptop to do anything in several weeks.  Everything I need or want to do is getting done on my MacBook.  Yippee!&lt;br /&gt;&lt;br /&gt;This laptop is a thing of beauty.  Every time I sit down in front of it, I get happy.  It just plain looks cool for starters!  It did take me a bit of getting used to being in Mac-land, but now that I've made friends with Finder and got all the applications I need installed and working, I can't ever see myself going back to PC-land.&lt;br /&gt;&lt;br /&gt;Since I didn't get my MacBook with OS X Server, I have loaded VMWare Fusion so I could have virtual machines for Windows and Linux so I could have an Oracle database install handy.  But, that was no big effort and I can easily start/stop an image and even use the Unity feature of VMWare fusion to make my virtual machine "merge" with my Mac desktop so that things look like I'm in a single environment.  I could've gone with BootCamp (comes with Mac OS) or Parallels, but VMWare has been a really good fit for me.&lt;br /&gt;&lt;br /&gt;I've come a long way from the days when I thought Macs were for wimps.  Not only does my MacBook Pro do everything I need it to, it even does stuff I have yet to use.  So, if you're thinking of going Mac, I can highly recommend it.  Once you go Mac, you never go back! &lt;br /&gt;&lt;br /&gt;Cool....just cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-2546666757551006475?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/2546666757551006475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=2546666757551006475' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2546666757551006475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/2546666757551006475'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/macbook-convert.html' title='MacBook convert'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gB2tAQrrKSw/SFhwL8VipTI/AAAAAAAAADg/pTJNMADvnco/s72-c/macbookpro.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-1659983609341918376</id><published>2008-06-13T12:50:00.000-04:00</published><updated>2008-06-13T14:57:45.621-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='holographic conferencing'/><title type='text'>I only thought it was the future of presenting...</title><content type='html'>In my &lt;a href="http://karenmorton.blogspot.com/2008/06/future-of-presenting.html"&gt;post&lt;/a&gt; from a few days ago, I wrote about a cool new software product, &lt;a href="http://www.sliderocket.com/"&gt;SlideRocket&lt;/a&gt;, and the shift I've been making to doing more visually appealing presentations.  I still think SlideRocket is one of the coolest things I've seen in a while (especially now since I've gotten a beta account to play with!) but I saw a demonstration of some new technology that was amazing.&lt;br /&gt;&lt;br /&gt;So, how'd you like to see a presentation delivered using live holographic video feeds from across the world?  It sounds like Star Trek, but it's here now.  Cisco CEO John Chambers, &lt;a href="http://www.musion.co.uk/Cisco_TelePresence.html"&gt;speaking live&lt;/a&gt; on stage in Bangalore, "beamed up" two of his senior VPs from San Jose, CA using new holographic video conferencing and they had a discussion of the future of Cisco TelePresence.  Now that is cool!&lt;br /&gt;&lt;br /&gt;Somehow, I don't think people will want to go to all the trouble and expense of holographic technology to be bored out of their minds with a holographic image in front of a boatload of dull, bullet pointed slides.  It may be one of the ways that the future of presenting will be driven back to a more personal and interactive approach.  Wouldn't it be cool if the hologram looked like it was looking right at you, no matter where you sat in the room?  You'd feel as if you were getting a personal session with the presenter.  Just the two of you sitting down for a chat.  No bullet points needed. &lt;br /&gt;&lt;br /&gt;I'm sure the technology will be a while in filtering it's way to the general public, but I was just thinking that perhaps by the time my daughter goes to college (she's 1 now), that we'll be able to talk using our holographic images.  How cool would that be?  I could see her just like she was standing (or sitting) in the room with me.  I could fuss at her for biting her nails or for coloring her hair fuschia.  No hiding behind voice only communications!  Ah, the possibilities!&lt;br /&gt;&lt;br /&gt;It's amazing to me to think of all the things that technology will bring in my lifetime.  My grandmother, who is soon to be 96, has gone from living in a home with no electricity or indoor plumbing to all the modern conveniences.  I can only imagine what advances I'll look back on if/when I reach her age.  And maybe holographic conferencing will be just another everyday thing in my home by then.   Amazing...simply amazing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-1659983609341918376?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/1659983609341918376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=1659983609341918376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1659983609341918376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/1659983609341918376'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/i-only-thought-it-was-future-of.html' title='I only thought it was the future of presenting...'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-8909793973790509150</id><published>2008-06-12T23:05:00.000-04:00</published><updated>2008-06-12T23:05:26.521-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='Amazon Kindle'/><title type='text'>My new toy</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gB2tAQrrKSw/SFHdtARhsLI/AAAAAAAAADY/C5ZNuw_BBAg/s1600-h/kindle.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_gB2tAQrrKSw/SFHdtARhsLI/AAAAAAAAADY/C5ZNuw_BBAg/s400/kindle.gif" alt="" id="BLOGGER_PHOTO_ID_5211190009081737394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am now the owner of an &lt;a href="http://www.amazon.com/gp/product/B000FI73MA/ref=sv_kinc_0"&gt;Amazon Kindle&lt;/a&gt;, and I am enthralled.  This lovely little device is smaller and lighter weight than every book I'm currently reading in hard copy.  Once you buy a Kindle version of the book you want, it is delivered wirelessly to your unit within a minute.  You can sit it in your lap and click a single button to turn the page.  When you're ready to stop, the unit remembers where you left off and will bring you right back to that spot when you return.  You can have up to 200 books (that's what the specs say anyway) loaded on the unit and add even more with an SD card should you desire. &lt;br /&gt;&lt;br /&gt;I was hesitant about this purchase for multiple reasons.  First, I love books.  Love 'em.  I have shelves of them of all different genres.  I love the feel of books.  I love making them my own with notes and highlights.  I have some books in my library that I've had for 25 years.  So, I wasn't sure about an electronic book.  I have a few technical books in PDF format that I like having for reference use so that I don't always have to turn to the book to find something I'm looking for.  But, the Kindle would mean starting a whole different relationship with my books.  Could I do it?&lt;br /&gt;&lt;br /&gt;Second, is the cost.  It's not a cheap little gadget.  But thanks to a cross country trip to visit family and a deal on my credit card to get triple Amazon points, I ended up with almost enough Amazon bucks to cover the cost.&lt;br /&gt;&lt;br /&gt;So, I took the plunge.  And so far, this little baby is awesome.  I haven't even begun to play with features like access to newspapers, magazines, popular blogs and so forth, but I have downloaded my first book.  Oh joy, oh bliss!  How sweet it is!&lt;br /&gt;&lt;br /&gt;This could be dangerous.  I can carry a boatload of books with me every where I go.  No more trying to figure out which books to carry on the plane with me and which ones to pack.  Everything comes with me in one conveniently small package.  If I want a new book, I just type in the name, click Buy and there it is!  Dangerous...yes, very dangerous.&lt;br /&gt;&lt;br /&gt;Even non-Kindle books can be converted to be used on the Kindle with a simple, free converter program.  So, that means virtually any book I can get in PDF form can go on my Kindle with just minimal effort.  Hmmm...I'm liking this more and more!&lt;br /&gt;&lt;br /&gt;I think I'll still have to buy some books in hard copy.  Not everything has a Kindle version (yet).  And, I don't think I can go completely cold turkey on having my hands on a "real" book.  But, if my first few hours of ownership are any indication, I think I'm going to have a very long and wonderfully meaningful relationship with my new Kindle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-8909793973790509150?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/8909793973790509150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=8909793973790509150' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8909793973790509150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/8909793973790509150'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/my-new-toy.html' title='My new toy'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gB2tAQrrKSw/SFHdtARhsLI/AAAAAAAAADY/C5ZNuw_BBAg/s72-c/kindle.gif' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7182975887102428869</id><published>2008-06-11T17:10:00.000-04:00</published><updated>2008-06-11T17:25:12.610-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle optimizer'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizer statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='NOWORKLOAD statistics'/><title type='text'>Optimizer NOWORKLOAD statistics</title><content type='html'>I am often asked about statistics collection.  People want to know the magic formula for collecting them.  When?  How much?  But, the truth is there isn't one formula, magic or otherwise, that works for everyone.  Think about it...  If there were, Oracle would have already implemented it, don't you think?  But hope is still alive that someday the mystery about it all will be revealed.&lt;br /&gt;&lt;br /&gt;I think Oracle is getting better and better in its attempts to automate the process of statistics collection.  But there continues to be alot of questions and discussion on how to "do it right" in the meantime.&lt;br /&gt;&lt;br /&gt;So, I thought I'd start trying to put together some of the questions I've received and do a little research and testing to see if I can't answer some of them here in the blog.  Today, I wanted to start with a few words about system statistics, particularly about noworkload statistics.  Starting with 10g, noworkload statistics are always available.  Even if you delete them, if the database restarts, then they are automatically regathered.&lt;br /&gt;&lt;br /&gt;The noworkload statistics are basically a few generic benchmarks used as performance measures for your system.  The stats that are maintained are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CPUSPEEDNW&lt;/span&gt;&lt;br /&gt;The number of operations per second (in millions) that a CPU can process.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;IOSEEKTIM&lt;/span&gt;&lt;br /&gt;Average number of milliseconds needed to find data on the disk (default 10).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;IOTFRSPEED&lt;/span&gt;&lt;br /&gt;Average number of bytes per millisecond that can be transferred from the disk (default 4,096).&lt;br /&gt;&lt;br /&gt;I've never touched the noworkload statistics on my laptop test database so I started by checking them to see what they were (they should be the defaults from when my database was first started).  I used dbms_stats.get_system_stats to retrieve the values.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; @getsysstats&lt;br /&gt;iotfrspeed: 4096&lt;br /&gt;ioseektm  : 10&lt;br /&gt;cpuspeednw: 773.806&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;I then executed a single SQL statement and grabbed the execution plan.  The statement was a 4 part UNION.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gB2tAQrrKSw/SFA867mtIpI/AAAAAAAAADI/rxvOGtfCeTM/s1600-h/before.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_gB2tAQrrKSw/SFA867mtIpI/AAAAAAAAADI/rxvOGtfCeTM/s400/before.jpg" alt="" id="BLOGGER_PHOTO_ID_5210731751997776530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Then, I gathered noworkload statistics to see what they would be now.  I started the collection and then executed several queries in another session while they were being collected.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; exec dbms_stats.gather_system_statistics (gathering_mode =&gt; 'noworkload');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using the gathering_mode parameter set to 'noworkload' will collect the values in about a minute.  I'm not totally positive, but I believe the CPU speed is likely measured by executing some sort of calibration operation in a loop and the I/O is measured by doing different sized reads on several different datafiles.&lt;br /&gt;&lt;br /&gt;These were my new values.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; @getsysstats&lt;br /&gt;iotfrspeed: 29126.045&lt;br /&gt;ioseektm  : 14.856&lt;br /&gt;cpuspeednw: 917.075&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;So, I ran the same SQL and checked the plan and you can see the difference the new noworkload statistics made.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/SFA9EsxNTCI/AAAAAAAAADQ/5mLE15ZFBaY/s1600-h/after.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/SFA9EsxNTCI/AAAAAAAAADQ/5mLE15ZFBaY/s400/after.jpg" alt="" id="BLOGGER_PHOTO_ID_5210731919813987362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I notice two key things:  1) the cost for this plan went down, but the estimated %CPU went up.  This makes sense if you look at the new statistics.  The iotfrspeed was significantly larger than my original value.  This would mean that the optimizer now thinks it is much less expensive to transfer data from the disk than it was previously and reduce the cost of those operations.&lt;br /&gt;&lt;br /&gt;In my example, the optimizer still chose the same plan it originally chose, but now, in comparison to any other plan choices, this plan is even more likely to be selected due to the much lower cost.&lt;br /&gt;&lt;br /&gt;Several people have commented to me that they've chosen not to use system stats in their 10 databases because they had trouble initially when upgrading from 9i.  But, what they often don't realize is that they are using system statistics no matter what.  They are simply using the noworkload variety is they disable/delete the others.  And, as you can see in this simple example, noworkload stats can change and cause the optimizer's calculations to change as as result.  This could mean plans change for apparently no reason.  This is one of those cases when someone swears "nothing has changed" but then they tell me that the database had just been restarted for some reason.  When that happened, the noworkload stats could've been recomputed.  Even if that were the only thing that changed, it might be enough to cause some plans to break.&lt;br /&gt;&lt;br /&gt;So, as I've mentioned before in a previous post: instead of insisting nothing has changed, evaluate what might have changed that might not be on your radar.  Something is bound to have changed somewhere.&lt;br /&gt;&lt;br /&gt;More stats stuff to come in later posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7182975887102428869?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7182975887102428869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7182975887102428869' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7182975887102428869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7182975887102428869'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/optimizer-noworkload-statistics.html' title='Optimizer NOWORKLOAD statistics'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gB2tAQrrKSw/SFA867mtIpI/AAAAAAAAADI/rxvOGtfCeTM/s72-c/before.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-7592267511192162541</id><published>2008-06-09T15:45:00.000-04:00</published><updated>2008-06-09T15:45:32.509-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation Zen'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerPoint'/><category scheme='http://www.blogger.com/atom/ns#' term='SlideRocket'/><title type='text'>The Future of Presenting?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gB2tAQrrKSw/SE1oG79jEBI/AAAAAAAAADA/lClp203j2GM/s1600-h/SlideRocket+Logo+on+White.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_gB2tAQrrKSw/SE1oG79jEBI/AAAAAAAAADA/lClp203j2GM/s400/SlideRocket+Logo+on+White.jpg" alt="" id="BLOGGER_PHOTO_ID_5209934812321878034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://carymillsap.blogspot.com/"&gt;Cary&lt;/a&gt; pointed me to an &lt;a href="http://www.fastcompany.tv/video/sliderocket-empowers-a-new-kind-presentation"&gt;interview&lt;/a&gt; with Mitch Grasso, co-founder of &lt;a href="http://www.sliderocket.com/"&gt;SlideRocket&lt;/a&gt;.  It's impressive.  What do they do?  From their web site, they say:&lt;br /&gt;&lt;blockquote&gt;"We make a fully featured, rich internet application (RIA) called SlideRocket (TM). It's offered as a service with a variety of prices to suit different needs, including free!"&lt;/blockquote&gt;I've been seriously working on changing my technical presentation style to be more dynamic and visual.  I posted back on &lt;a href="http://karenmorton.blogspot.com/2008/05/presentation-zen.html"&gt;May 22&lt;/a&gt; about a book by Garr Reynolds called Presentation Zen that has really had a profound effect on the way I look at the content of my presentations.&lt;br /&gt;&lt;br /&gt;Here's an example of how I took one slide out of one of my presentations and converted it to a new, more visual style.&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_456675"&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=exampleofswitch2-1213039493544734-9"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=exampleofswitch2-1213039493544734-9" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border: 0px none ; margin-bottom: -5px;" alt="SlideShare" /&gt;&lt;/a&gt; | &lt;a href="http://www.slideshare.net/krmorton/slide-styles-before-and-after?src=embed" title="View Slide Styles - Before and After on SlideShare"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload?src=embed"&gt;Upload your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;The "After" style requires the speaker to provide the details, but I think that's kinda the point, huh?  I've heard it said before (and agree) that if your slides say everything, then why are you there?  I really like the impact the "After" version will likely have on the audience.  I think they'll be much more engaged with me than if I'd just popped up one detailed slide with alot of text for them to read.&lt;br /&gt;&lt;br /&gt;I use PowerPoint.  I never really thought or knew there was another option.  As long as I've been doing presentations that weren't printed on transparencies (oh yeah, I did a bunch of those), I've used PowerPoint.  I know there is KeyNote for the Mac, but since I've just recently seen the light and converted to a Mac (my MacBook Pro rocks!), it's never been on my radar. &lt;br /&gt;&lt;br /&gt;But, having seen the new SlideRocket, I think they're really on to something.  Creating presentations becomes more about making your point (and making it well) with lots of easy options for formatting, adding photos, dynamic content and a bunch of other nifty stuff. &lt;br /&gt;&lt;br /&gt;What I've noticed for myself is that my presentations were always put together while thinking in bullet points.  So, that's what came out on the slides.  If you shift to thinking about your story...the thing you want to communicate to the audience... you immediately move away from bullet point thinking.  I think SlideRocket will facilitate this process much better.  Take a look at the interview and their web site and see what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-7592267511192162541?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/7592267511192162541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=7592267511192162541' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7592267511192162541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/7592267511192162541'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/future-of-presenting.html' title='The Future of Presenting?'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gB2tAQrrKSw/SE1oG79jEBI/AAAAAAAAADA/lClp203j2GM/s72-c/SlideRocket+Logo+on+White.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-518481768015386858.post-9160796978685588108</id><published>2008-06-04T12:15:00.000-04:00</published><updated>2008-06-04T12:15:01.059-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mistakes'/><title type='text'>Famous last words</title><content type='html'>Jonathan Lewis' recent blog post, entitled &lt;a href="http://jonathanlewis.wordpress.com/2008/05/30/nothing-changed/"&gt;Nothing Changed&lt;/a&gt;, got me to thinking about how frequently I hear "nothing changed" in relation to a performance issue.  I really do think those are quotable (and laughable) famous last words.  Think about it: if &lt;span style="font-style: italic;"&gt;everything&lt;/span&gt; was the same, it's not possible for something to change, right? &lt;br /&gt;&lt;br /&gt;A query plan doesn't change without reason.  Response time doesn't change without reason.  In general terms, it's rare that nothing &lt;span style="font-style: italic;"&gt;ever&lt;/span&gt; changes.  So, instead of immediately asking "why" and claiming "nothing changed", I think it'd be much more productive to start asking "what changed?". &lt;br /&gt;&lt;br /&gt;When we insist on believing nothing changed, we limit our options of what could have happened.  We close off our creativity.  We limit our mind's ability to pursue possibilities. &lt;br /&gt;&lt;br /&gt;I think one of the best skills a good performance analyst has is the ability to see lots of options.  And, I think that the reason why people, like &lt;a href="http://jonathanlewis.wordpress.com/"&gt;Jonathan Lewis&lt;/a&gt;, &lt;a href="http://tkyte.blogspot.com/"&gt;Tom Kyte&lt;/a&gt;, &lt;a href="http://carymillsap.blogspot.com"&gt;Cary Millsap&lt;/a&gt;, and many others, are so good at what they do is that they always stay open to many possibilities.  Skill and knowledge is certainly important, but the ability to look at many alternatives and not get stuck demanding that things must be "just so" is just as critical.&lt;br /&gt;&lt;br /&gt;In the end, those who continue demanding "nothing changed" might find the famous last words of composer Ludwig van Beethoven most fitting:  "Friends applaud, the comedy is finished."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/518481768015386858-9160796978685588108?l=karenmorton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://karenmorton.blogspot.com/feeds/9160796978685588108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=518481768015386858&amp;postID=9160796978685588108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9160796978685588108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/518481768015386858/posts/default/9160796978685588108'/><link rel='alternate' type='text/html' href='http://karenmorton.blogspot.com/2008/06/famous-last-words.html' title='Famous last words'/><author><name>Karen</name><uri>http://www.blogger.com/profile/03309823327597536648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_gB2tAQrrKSw/TCpn4D7ae2I/AAAAAAAAAMo/PVu1G6Uj1AY/S220/KarenMorton_SmallHeadShot.jpg'/></author><thr:total>0</thr:total></entry></feed>
