jump to navigation

Oracle ACE Director Award 2022 March 8, 2023

Posted by Richard Foote in Oracle ACE Director, Richard's Musings.
add a comment

 

I received a very nice surprise in the mail today, my Oracle ACE Director Award for 2022.

A big thank you to Jen and the whole team at Oracle who support all the Oracle ACE folks so well.

Hopefully, I’ll have the opportunity to present at an Oracle conference or two sometime in the near future… 🙂

Possible Impact To Clustering Factor Now ROWIDs Are Updated When Rows Migrate Part II (“Dancing Out In Space”) March 7, 2023

Posted by Richard Foote in 19c, 19c New Features, Attribute Clustering, Autonomous Data Warehouse, Autonomous Database, Autonomous Transaction Processing, CBO, Changing ROWID, Clustering Factor, Data Clustering, David Bowie, Full Table Scans, Index Access Path, Index Internals, Index Rebuild, Index statistics, Leaf Blocks, Migrated Rows, Oracle, Oracle 21c, Oracle Blog, Oracle Cloud, Oracle Cost Based Optimizer, Oracle General, Oracle Indexes, Oracle Statistics, Oracle19c, Performance Tuning, Richard's Musings, ROWID.
1 comment so far

In my previous post, I discussed how the clustering of data can be impacted if rows migrate and how this in turn can have a detrimental impact on the efficiency of associated indexes.

In this post, I’ll discuss what you can do (and not do) to remedy things in the relatively unlikely event that you hit this issue with migrated rows.

I’ll just discuss initially the example where the table is defined without ENABLE ROW MOVEMENT enabled in the Transaction Processing Autonomous Database (and so does NOT update ROWIDs on the fly when a row migrates).

I’ll start by again creating and populating a tightly packed table, with the data inserted in ID column order:

SQL> create table bowie(id number, code1 number, code2 number, code3 number, code4 number, code5 number, code6 number, code7 number, code8 number, code9 number, code10 number, code11 number, code12 number, code13 number, code14 number, code15 number, code16 number, code17 number, code18 number, code19 number, code20 number, name varchar2(142)) PCTFREE 0;

Table BOWIE created.

SQL> insert into bowie SELECT rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, rownum, 'BOWIE' FROM dual CONNECT BY LEVEL <= 200000;

200,000 rows inserted.

SQL> commit;

Commit complete.

I’ll now create an index on this well ordered/clustered ID column:

SQL> create index bowie_id_i on bowie(id);

Index BOWIE_ID_I created.

Next, I’ll update the table, increasing the size of the rows such that I generate a bunch of migrated rows:

SQL> update bowie set name='THE RISE AND FALL OF BOWIE STARDUST AND THE SPIDERS FROM MARS';

200,000 rows updated.

SQL> commit;

Commit complete.

 

If we check the number of migrated rows:

SQL> analyze table bowie compute statistics;

Table BOWIE analyzed.

SQL> select table_name, num_rows, blocks, empty_blocks, avg_space, avg_row_len, chain_cnt from user_tables

where table_name='BOWIE';

   TABLE_NAME    NUM_ROWS    BLOCKS    EMPTY_BLOCKS    AVG_SPACE    AVG_ROW_LEN    CHAIN_CNT
_____________ ___________ _________ _______________ ____________ ______________ ____________
BOWIE              200000      4906              86          414            170        56186

 

We notice there are indeed 56186 migrated rows.

If we check the current Clustering Factor of the index:

SQL> execute dbms_stats.delete_table_stats(ownname=>null, tabname=>'BOWIE');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats(ownname=>null, tabname=>'BOWIE', estimate_percent=> null, no_invalidate=>false);

PL/SQL procedure successfully completed.

SQL> select table_name, num_rows, blocks from user_tables where table_name='BOWIE';

   TABLE_NAME    NUM_ROWS    BLOCKS
_____________ ___________ _________
BOWIE              200000      4906

SQL> select index_name, blevel, leaf_blocks, clustering_factor from user_indexes where table_name='BOWIE';

   INDEX_NAME    BLEVEL    LEAF_BLOCKS    CLUSTERING_FACTOR
_____________ _________ ______________ ____________________
BOWIE_ID_I            1            473                 3250

 

We notice the index still has an excellent Clustering Factor of just 3250. As the ROWIDs are NOT updated in this example when rows migrate, the index retains the same Clustering Factor as before the Update statement.

If we run the following query that returns 4200 rows (as per my previous post):

SQL> select * from bowie where id between 1 and 4200;

4,200 rows selected.

PLAN_TABLE_OUTPUT
_______________________________________________________________________________________________________________
SQL_ID c376kdhy5b0x9, child number 0
-------------------------------------
select * from bowie where id between 1 and 4200

Plan hash value: 1405654398

------------------------------------------------------------------------------------------------------------
| Id | Operation                            | Name       | Starts | E-Rows | A-Rows | A-Time     | Buffers |
------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                     |            |      1 |        |   4200 |00:00:00.01 |    2771 |
|  1 |  TABLE ACCESS BY INDEX ROWID BATCHED | BOWIE      |      1 |   4200 |   4200 |00:00:00.01 |    2771 |
|* 2 |   INDEX RANGE SCAN                   | BOWIE_ID_I |      1 |   4200 |   4200 |00:00:00.01 |      11 |
------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID">=1 AND "ID"<=4200)


Statistics
-----------------------------------------------------------
          2 CPU used by this session
          2 CPU used when call started
          3 DB time
      24901 RM usage
          3 Requests to/from client
          2 SQL*Net roundtrips to/from client
       2762 buffer is not pinned count
       7005 buffer is pinned count
        324 bytes received via SQL*Net from client
     461909 bytes sent via SQL*Net to client
          2 calls to get snapshot scn: kcmgss
          2 calls to kcmgcs
       2771 consistent gets
          1 consistent gets examination
          1 consistent gets examination (fastpath)
       2771 consistent gets from cache
       2770 consistent gets pin
       2770 consistent gets pin (fastpath)
          2 execute count
          1 index range scans
   22700032 logical read bytes from cache
       2770 no work - consistent read gets
         73 non-idle wait count
          2 opened cursors cumulative
          1 opened cursors current
          2 parse count (total)
          1 process last non-idle time
          1 session cursor cache count
          1 session cursor cache hits
       2771 session logical reads
          1 sorts (memory)
       2024 sorts (rows)
       4200 table fetch by rowid
       1366 table fetch continued row
          3 user calls

We can see the query currently uses 2771 consistent gets, which is significantly higher than it could be, as Oracle has to visit the original table block and then follow the pointer to the new location for any migrated row that needs to be retrieved.

However, if we look at the cost of the current plan:

SQL> SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(sql_id=>'c376kdhy5b0x9',format=>'ALLSTATS LAST +cost +bytes'));

PLAN_TABLE_OUTPUT
____________________________________________________________________________________________________________________________________
SQL_ID c376kdhy5b0x9, child number 0

-------------------------------------

select * from bowie where id between 1 and 4200

Plan hash value: 1405654398

---------------------------------------------------------------------------------------------------------------------------------
| Id | Operation                            | Name       | Starts | E-Rows |E-Bytes| Cost (%CPU)| A-Rows | A-Time     | Buffers |
---------------------------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                     |            |      1 |        |       |    80 (100)|   4200 |00:00:00.01 |    2771 |
|  1 |  TABLE ACCESS BY INDEX ROWID BATCHED | BOWIE      |      1 |   4200 |   684K|      80 (0)|   4200 |00:00:00.01 |    2771 |
|* 2 |   INDEX RANGE SCAN                   | BOWIE_ID_I |      1 |   4200 |       |      11 (0)|   4200 |00:00:00.01 |      11 |
---------------------------------------------------------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT
_____________________________________________________________________________________________________
Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID">=1 AND "ID"<=4200)

 

We can see it only has a cost of 80, as Oracle does not consider the additional accesses required now for these migrated rows. With such a perfect Clustering Factor, this cost is not particularly accurate and does not represent the true cost of the 2771 consistent gets now required.

Now there are various ways we can look at fixing this issue with all these migrated rows requiring additional consistent gets to access.

One method is to capture all the ROWIDs of the migrated rows, copy these rows to a temporary holding table, delete these rows and then re-insert them all back into the table from the temporary table.

We can identify the migrated rows by creating the CHAIN_ROWS table as per the Oracle supplied UTLCHAIN.SQL script and then use the ANALYZE command to store their ROWIDs in this CHAIN_ROWS table:

SQL> create table CHAINED_ROWS (
2 owner_name varchar2(128),
3 table_name varchar2(128),
4 cluster_name varchar2(128),
5 partition_name varchar2(128),
6 subpartition_name varchar2(128),
7 head_rowid rowid,
8 analyze_timestamp date
9* );

Table CHAINED_ROWS created.

SQL> analyze table bowie list chained rows;

Table BOWIE analyzed.

SQL> select table_name, head_rowid from chained_rows where table_name='BOWIE' and rownum<=10;

   TABLE_NAME            HEAD_ROWID
_____________ _____________________
BOWIE         AAAqFjAAAAAE6CzAAP
BOWIE         AAAqFjAAAAAE6CzAAR
BOWIE         AAAqFjAAAAAE6CzAAU
BOWIE         AAAqFjAAAAAE6CzAAW
BOWIE         AAAqFjAAAAAE6CzAAZ
BOWIE         AAAqFjAAAAAE6CzAAb
BOWIE         AAAqFjAAAAAE6CzAAe
BOWIE         AAAqFjAAAAAE6CzAAg
BOWIE         AAAqFjAAAAAE6CzAAj
BOWIE         AAAqFjAAAAAE6CzAAl

 

Another method we can now utilise is to simply MOVE ONLINE the table:

SQL> alter table bowie move online;

Table BOWIE altered.

 

If we now look at the number of migrated rows after the table reorg:

SQL> analyze table bowie compute statistics;

Table BOWIE analyzed.

SQL> select table_name, num_rows, blocks, empty_blocks, avg_space, avg_row_len, chain_cnt from user_tables where table_name='BOWIE';

   TABLE_NAME    NUM_ROWS    BLOCKS    EMPTY_BLOCKS    AVG_SPACE    AVG_ROW_LEN    CHAIN_CNT
_____________ ___________ _________ _______________ ____________ ______________ ____________
BOWIE              200000      4936              56          838            169            0

 

We can see we no longer have any migrated rows.

BUT, if we now look at the Clustering Factor of this index:

SQL> execute dbms_stats.delete_table_stats(ownname=>null, tabname=>'BOWIE');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats(ownname=>null, tabname=>'BOWIE', estimate_percent=> null, no_invalidate=>false);

PL/SQL procedure successfully completed.

SQL> select table_name, num_rows, blocks from user_tables where table_name='BOWIE';

   TABLE_NAME    NUM_ROWS    BLOCKS
_____________ ___________ _________
BOWIE              200000      4936

SQL> select index_name, blevel, leaf_blocks, clustering_factor from user_indexes where table_name='BOWIE';

   INDEX_NAME    BLEVEL    LEAF_BLOCKS    CLUSTERING_FACTOR
_____________ _________ ______________ ____________________
BOWIE_ID_I            1            473               114560

 

We can see it has now significantly increased to 114560 (previously it was just 3250).

The problem of course is that if the ROWIDs now represent the correct new physical location of the migrated rows, the previously perfect clustering/ordering of the ID column has been impacted.

If we now re-run the query returning the 4200 rows:

SQL> select * from bowie where id between 1 and 4200;

4,200 rows selected.

PLAN_TABLE_OUTPUT
_____________________________________________________________________________________________________
SQL_ID c376kdhy5b0x9, child number 0
-------------------------------------
select * from bowie where id between 1 and 4200

Plan hash value: 1845943507

---------------------------------------------------------------------------------------------
| Id | Operation                  | Name  | Starts | E-Rows | A-Rows | A-Time     | Buffers |
---------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT           |       |      1 |        |   4200 |00:00:00.02 |    4857 |
|* 1 |  TABLE ACCESS STORAGE FULL | BOWIE |      1 |   4200 |   4200 |00:00:00.02 |    4857 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - storage(("ID"<=4200 AND "ID">=1))
       filter(("ID"<=4200 AND "ID">=1))

Statistics
-----------------------------------------------------------
          3 CPU used by this session
          3 CPU used when call started
       4849 Cached Commit SCN referenced
          2 DB time
      25870 RM usage
          3 Requests to/from client
          2 SQL*Net roundtrips to/from client
          2 buffer is not pinned count
        324 bytes received via SQL*Net from client
     461962 bytes sent via SQL*Net to client
          2 calls to get snapshot scn: kcmgss
          9 calls to kcmgcs
       4857 consistent gets
       4857 consistent gets from cache
       4857 consistent gets pin
       4857 consistent gets pin (fastpath)
          2 execute count
   39788544 logical read bytes from cache
       4850 no work - consistent read gets
         72 non-idle wait count
          2 opened cursors cumulative
          1 opened cursors current
          2 parse count (total)
          2 process last non-idle time
          1 session cursor cache count
       4857 session logical reads
          1 sorts (memory)
       2024 sorts (rows)
       4850 table scan blocks gotten
     200000 table scan disk non-IMC rows gotten
     200000 table scan rows gotten
          1 table scans (short tables)
          3 user calls

 

Oracle is now performing a Full Table Scan (FTS). The number of consistent gets now at 4857 is actually worse than when we had the migrated rows (previously at 2771)

The Clustering Factor of the ID column is now so bad, that returning 4200 rows via such an index is just too expensive. The FTS is now deemed the cheaper option by the CBO.

If we look at the CBO cost of using this FTS plan:

SQL> SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(sql_id=>'c376kdhy5b0x9',format=>'ALLSTATS LAST +cost +bytes'));

PLAN_TABLE_OUTPUT
_____________________________________________________________________________________________________________________
SQL_ID c376kdhy5b0x9, child number 0
-------------------------------------
select * from bowie where id between 1 and 4200

Plan hash value: 1845943507

------------------------------------------------------------------------------------------------------------------
| Id | Operation                  | Name  | Starts | E-Rows |E-Bytes| Cost (%CPU)| A-Rows | A-Time     | Buffers |
------------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT           |       |      1 |        |       |  1340 (100)|   4200 |00:00:00.02 |    4857 |
|* 1 |  TABLE ACCESS STORAGE FULL | BOWIE |      1 |   4200 |   684K|    1340 (1)|   4200 |00:00:00.02 |    4857 |
------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - storage(("ID"<=4200 AND "ID">=1))
       filter(("ID"<=4200 AND "ID">=1))

 

We can see the cost of this plan is 1340.

If we compare this with the cost of using the (now deemed) inefficient index:

SQL> select /*+ index (bowie) */ * from bowie where id between 1 and 4200;

4,200 rows selected.

PLAN_TABLE_OUTPUT
_______________________________________________________________________________________________________________
SQL_ID 9215hkzd3v1up, child number 0
-------------------------------------
select /*+ index (bowie) */ * from bowie where id between 1 and 4200

Plan hash value: 1405654398

------------------------------------------------------------------------------------------------------------
| Id | Operation                            | Name       | Starts | E-Rows | A-Rows | A-Time     | Buffers |
------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                     |            |      1 |        |   4200 |00:00:00.01 |    2784 |
|  1 |  TABLE ACCESS BY INDEX ROWID BATCHED | BOWIE      |      1 |   4200 |   4200 |00:00:00.01 |    2784 |
|* 2 |   INDEX RANGE SCAN                   | BOWIE_ID_I |      1 |   4200 |   4200 |00:00:00.01 |      11 |
------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID">=1 AND "ID"<=4200)


Statistics
-----------------------------------------------------------
          2 CPU used by this session
          2 CPU used when call started
       2741 Cached Commit SCN referenced
          2 DB time
      12633 RM usage
          3 Requests to/from client
          2 SQL*Net roundtrips to/from client
       2775 buffer is not pinned count
       5626 buffer is pinned count
        345 bytes received via SQL*Net from client
     462170 bytes sent via SQL*Net to client
          2 calls to get snapshot scn: kcmgss
          2 calls to kcmgcs
       2784 consistent gets
          1 consistent gets examination
          1 consistent gets examination (fastpath)
       2784 consistent gets from cache
       2783 consistent gets pin
       2783 consistent gets pin (fastpath)
          2 execute count
          1 index range scans
   22806528 logical read bytes from cache
       2783 no work - consistent read gets
         72 non-idle wait count
          2 opened cursors cumulative
          1 opened cursors current
          2 parse count (total)
          4 process last non-idle time
          1 session cursor cache count
          1 session cursor cache hits
       2784 session logical reads
          1 sorts (memory)
       2024 sorts (rows)
       4200 table fetch by rowid
          3 user calls

SQL> SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(sql_id=>'9215hkzd3v1up',format=>'ALLSTATS LAST +cost +bytes'));

PLAN_TABLE_OUTPUT
____________________________________________________________________________________________________________________________________
SQL_ID 9215hkzd3v1up, child number 0

-------------------------------------

select /*+ index (bowie) */ * from bowie where id between 1 and 4200

Plan hash value: 1405654398

---------------------------------------------------------------------------------------------------------------------------------
| Id | Operation                            | Name       | Starts | E-Rows |E-Bytes| Cost (%CPU)| A-Rows | A-Time     | Buffers |
---------------------------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                     |            |      1 |        |       |  2418 (100)|   4200 |00:00:00.01 |    2784 |
|  1 |  TABLE ACCESS BY INDEX ROWID BATCHED | BOWIE      |      1 |   4200 |   684K|    2418 (1)|   4200 |00:00:00.01 |    2784 |
|* 2 |   INDEX RANGE SCAN                   | BOWIE_ID_I |      1 |   4200 |       |      11 (0)|   4200 |00:00:00.01 |      11 |
---------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - access("ID">=1 AND "ID"<=4200)

 

We can see the CBO cost of the index is now 2418, more than the 1340 cost of using the FTS.

So in the scenario where by migrating a significant number of rows, we impact the Clustering Factor and so the efficiency of vital indexes in our applications, we need to eliminate the migrated rows in a more thoughtful manner.

An option we have available is to first add an appropriate Clustering Attribute before we perform the table reorg:

SQL> alter table bowie add clustering by linear order (id);

Table BOWIE altered.

SQL> alter table bowie move online;

Table BOWIE altered.

 

If we now look at the Clustering Factor of this important index:

SQL> exec dbms_stats.gather_table_stats(ownname=>null, tabname=>'BOWIE', estimate_percent=> null, no_invalidate=>false);

PL/SQL procedure successfully completed.

SQL> select table_name, num_rows, blocks from user_tables where table_name='BOWIE';

   TABLE_NAME    NUM_ROWS    BLOCKS
_____________ ___________ _________
BOWIE              200000      4936

SQL> select index_name, blevel, leaf_blocks, clustering_factor from user_indexes where table_name='BOWIE';

   INDEX_NAME    BLEVEL    LEAF_BLOCKS    CLUSTERING_FACTOR
_____________ _________ ______________ ____________________
BOWIE_ID_I            1            473                 4850

 

The Clustering Factor has been reduced down to the almost perfect 4850, down from the previous 114560.

If we now re-run the query:

SQL> select * from bowie where id between 1 and 4200;

4,200 rows selected.

PLAN_TABLE_OUTPUT
_______________________________________________________________________________________________________________
SQL_ID c376kdhy5b0x9, child number 0
-------------------------------------
select * from bowie where id between 1 and 4200

Plan hash value: 1405654398

------------------------------------------------------------------------------------------------------------
| Id | Operation                            | Name       | Starts | E-Rows | A-Rows | A-Time     | Buffers |
------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                     |            |      1 |        |   4200 |00:00:00.01 |     102 |
|  1 |  TABLE ACCESS BY INDEX ROWID BATCHED | BOWIE      |      1 |   4200 |   4200 |00:00:00.01 |     102 |
|* 2 |   INDEX RANGE SCAN                   | BOWIE_ID_I |      1 |   4200 |   4200 |00:00:00.01 |      11 |
------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID">=1 AND "ID"<=4200)


Statistics
-----------------------------------------------------------
          1 CPU used by this session
          1 CPU used when call started
         89 Cached Commit SCN referenced
          1 DB time
      11249 RM usage
          3 Requests to/from client
          2 SQL*Net roundtrips to/from client
         93 buffer is not pinned count
       8308 buffer is pinned count
        324 bytes received via SQL*Net from client
     462165 bytes sent via SQL*Net to client
          2 calls to get snapshot scn: kcmgss
          2 calls to kcmgcs
        102 consistent gets
          1 consistent gets examination
          1 consistent gets examination (fastpath)
        102 consistent gets from cache
        101 consistent gets pin
        101 consistent gets pin (fastpath)
          2 execute count
          1 index range scans
     835584 logical read bytes from cache
        101 no work - consistent read gets
         72 non-idle wait count
          2 opened cursors cumulative
          1 opened cursors current
          2 parse count (total)
          1 process last non-idle time
          1 session cursor cache count
          1 session cursor cache hits
        102 session logical reads
          1 sorts (memory)
       2024 sorts (rows)
       4200 table fetch by rowid
          3 user calls

We can see the query now automatically uses the index and only requires just 102 consistent gets (down from 4857 when it performed the FTS and down from 2771 when we had the migrated rows).

If we look at the cost of this new plan:

SQL> SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(sql_id=>'c376kdhy5b0x9',format=>'ALLSTATS LAST +cost +bytes'));

PLAN_TABLE_OUTPUT
____________________________________________________________________________________________________________________________________
SQL_ID c376kdhy5b0x9, child number 0

-------------------------------------

select * from bowie where id between 1 and 4200

Plan hash value: 1405654398

---------------------------------------------------------------------------------------------------------------------------------
| Id | Operation                            | Name       | Starts | E-Rows |E-Bytes| Cost (%CPU)| A-Rows | A-Time     | Buffers |
---------------------------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                     |            |      1 |        |       |   113 (100)|   4200 |00:00:00.01 |     102 |
|  1 |  TABLE ACCESS BY INDEX ROWID BATCHED | BOWIE      |      1 |   4200 |   684K|     113 (0)|   4200 |00:00:00.01 |     102 |
|* 2 |   INDEX RANGE SCAN                   | BOWIE_ID_I |      1 |   4200 |       |      11 (0)|   4200 |00:00:00.01 |      11 |
---------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - access("ID">=1 AND "ID"<=4200)

 

We can see the plan has a cost of just 113, which is both much more accurate and close to the 102 consistent gets and much less than the previous cost of 1340 for the FTS plan.

So in specific scenarios where by having migrated rows we significantly impact the Clustering Factor of indexes important to our applications, we have to be a little cleverer in how we address the migrated rows.

This can also the case in the new scenario where Oracle automatically updates the ROWIDs of migrated rows, as I’ll discuss in my next post…

Merry Christmas and Happy New Year!! (“The Jean Genie”) December 22, 2022

Posted by Richard Foote in Christmas, David Bowie, Richard's Blog, Richard's Musings, The Jean Genie.
1 comment so far

I would like to take this opportunity to wish all my readers who celebrate the festive season a very Merry Christmas and a most happy, peaceful and prosperous New Year.

2023 promises to be a big year for me, in that I’ll be officially retiring from work early in the year, after close to 40 years working in IT. I’ve had an absolute blast and met and worked with some truly amazing people, but it’s time to move on and enjoy other things that life has to offer.

But I’ll hopefully keep my hand in enough to perhaps attend the odd Oracle conference during the year and say my farewells and have a quiet drink with as many of my many Oracle-related friends and colleagues as I can. So you haven’t perhaps heard the last from me quite yet.

My Christmas gift this year is of course David Bowie related. 50 years ago, Bowie had a huge hit in the UK (and elsewhere) with the glam rock classic that is “The Jean Genie”. 50 years ago to the day, it was sitting in the UK 1972 Christmas charts at No. 16, but would reach as far as No. 2 in the coming weeks.

This is the official video, directed by the late, great Mick Rock. Enjoy !!

 

Indexing Seminar: Why Small Classes? (A Small Plot Of Land) October 5, 2017

Posted by Richard Foote in Index Internals, Index Internals Seminar, Oracle Indexes, Richard Foote Consulting, Richard's Musings.
4 comments

outside2

Firstly, a huge thank-you to everyone who has enroled in one of my “Indexing Internals and Best Practices” Seminars running soon is Australia. The feedback and overall reaction has been extremely positive and I can’t wait to present all the material I’ve been putting together these past few weeks.

There are currently limited places still available at each of the 6 venues, but places are selling out fast. All enrolment details can be found here: https://www.eventbrite.com.au/o/richard-foote-consulting-pty-ltd-15076769762

A question I’ve been asked a couple of times is why the insistence on only running small classes? I’ve previously run similar events overseas to large audiences, I’ve had classes of 40+ a number of times in Europe and I’ve run a one day version of this at Hotsos last year to more people than I could count (I’m guessing 80+). And while they were all highly successful, I will be restricting classes to much smaller class sizes in this Australia tour and into the future.  There are a number of reasons for this, with the key points being:

  • The seminar has been fully revised and updated and is packed with heaps of new content. I want to be able to cover as much material as is practical and this is only possible with small classes. The more I cover, the more attendees have the opportunity to learn.
  • I really want these seminars to be interactive events, with attendees having plenty of opportunity to ask questions. This makes it a more valuable experience as any ambiguities, doubts, environment specific questions, important bits that people don’t get first time, etc. etc. can clarified and addressed.
  • The seminar goes for 2 days, but if I had 50 people and each person asked 15 mins of questions that needed answering, that’s almost the entire time gone. So larger class sizes makes it impractical to have any meaningful Q&A
  • Attendees bring vast amounts of experiences and solutions to Oracle Indexing related scenarios as all Oracle databases out there utilise indexes. Even on Exadata. Even in future autonomous databases. Small classes gives me the opportunity to tap into this.
  • I want to learn just as much as everybody else and if I do all the talking, I’ll learn nothing new. Small classes gives me the opportunity to learn, based on questions asked and experiences shared.
  • All attendees have their own requirements and expectations from attending the seminar. If someone has specific issues at their environments, what a wonderful opportunity to learn and perhaps get these issues addressed by attending the seminar. Again only practical in small class environments.
  • I will be contacting all attendees BEFORE the seminars to determine what their individual expectations are from the seminars. I will then ensure that any appropriate material is fully covered to meet those expectations. This again is only practical with small class sizes.
  • Finally, you’re spending 2 days with the one and only Richard Foote 🙂 As well as learning more about indexes than you thought possible, as well as learning how an appropriate indexing strategy can dramatically improve database/application performance, as well as discovering an appreciations for the works of David Bowie, it’s also an opportunity to have a sense of 1 on 1 with myself  and that I’m there to directly assist “you” with truly understanding how Oracle indexes should be properly utilised. There is little sense of 1 on 1 with large class sizes.

 

So these seminars are designed very intentionally to be “premium” events, offering a training experience that really is second to none. These seminars have always been very well received so I’m truly excited that I’ll be running these events with the best content I’ve ever compiled. Small class settings gives all attendees the very best opportunity to absorb it all in and apply directly what they’re learnt to improving the performance of their database/application environments..

Like I said, there are only limited places now remaining for the Australian Tour so get in early or else risk missing out.

Events in other parts of our beautiful planet are currently being planned and will be announced in the near future. If you have any questions or requests on where to run these seminars, just ask: richard@richardfooteconsulting.com

Goodbye Oracle Corporation (Modern Love) August 14, 2017

Posted by Richard Foote in Richard's Musings.
8 comments

 

It’s with a mixture of excitement, trepidation and a touch of sorrow that I today handed in my resignation after 6 years at Oracle Corporation.

My plans at this stage are to take a bit of time-off initially, before going back to providing Oracle Database consulting and training services as I’ve done in the past. Stay tuned for some exciting offerings !!

It’s truly been a great pleasure and honour to have worked with such a fantastic team at Oracle Australia. I sincerely wish Oracle continued success into the future.

Big Announcement – New Job, New Country (A New Career In A New Town) April 1, 2017

Posted by Richard Foote in Richard's Blog, Richard's Musings.
20 comments

washington

APRIL FOOLS

After 5 1/2 years at Oracle Corporation, I’ve decided to leave and take on a very exciting new challenge !!

President Trump’s office have accepted my nomination to head their IT department in Washington DC, where I’ll be responsible for ensuring all USA government data is stored in a extremely efficient and secure manner. So secure, that hopefully all those other US agencies (FBI, CIA, New York Times, etc.) that are trying to get access to it won’t be able to 🙂

Russia also expressed an interest in my services, but the beauty with this opportunity is that I’ll be able to work for both countries at the same time (obviously in a discreet, unofficial basis if you know what I mean).

I‘ll be in charge of all IT related matters with regard the new USA presidential administration, ensuring all White House related data is stored appropriately and securely (e.g. Fake News, Real News, Real Fake News, Fake Fake News, Fake News That Seems Fake But Is Really True, Real News Which Must Surely Be Fake But Is Remarkably True But Is To Be Marked Fake Regardless, Russian News Which Is Obviously True But Is Fake – Honest, etc. etc.). The tricky bit of course will be keeping all the inside leaks secret and working out what news belongs in what category. Unless it’s fake but sounds better if it were true (or fake), in which case it’s unclassified and to be replicated in the Fox News website.

Love to say I’ll miss Australia but to be honest, I’m getting a little worried about health services here as I unfortunately get older. That’s why I want to move to the USA, where they have a great universal health insurance system and I know if ever my luck is down and I can’t afford health insurance, I’ll still be well looked after.

For obvious reasons, I will have to live in Washington DC to perform my new role. Well I don’t actually have to be in Washington, I have Russian friends who say it’s dead easy to login into the USA Government systems from wherever. But if all the travel bans ever get implemented, I might not then be able to get into the US so it’s best I get in while I still can. I’m not Muslim which helps no end, but once the fake news gets out that I am Muslim with Mexican parents, well you see the problem here don’t you.

Only regret I do have in my new role will be having to stand occasionally behind President Trump and be photographed while he signs a presidential executive order. What can I say, the money is good and if the planet gets a little warmer, well won’t that mean more temperate winters and fewer mosquitos which has got to be a good thing right ?

Of course, one of my big responsibilities as head of IT in Washington is “modernizing” the computing infrastructure. That said, there does seem to be a culture of perhaps going back and doing things as they did in the past, so I’m kinda hoping my plan to implement Real Application Clusters using a bunch of re-processed Sinclair ZX81s will both work and fit in with my coal loving colleagues in the administration.

Love golf, I really do and to be perfectly honest this is my main motivation for taking on this job. My hours are basically to work for just a couple of mornings each week and spend the rest of the time playing golf and watching all that fantastic American TV. We’re under strict orders to only watch Fox News of course, but there are some really cool Russian dramas and reality TV shows we’re allowed to watch as well.

So exciting times ahead, looking forward to it all. Assuming of course the world doesn’t end first.

APRIL FOOLS

Richard Foote’s Art Work (Art Decade) May 5, 2014

Posted by Richard Foote in Richard's Art, Richard's Musings.
add a comment

Just a quick note to say I have a new tab on the blog called “Richard Foote’s Art” where I’ll periodically upload a new piece of my art work.

As the page says, they highlight both what’s in my mind (so beware) and how I like to relax in the evenings.

All pieces are for sale for $1 Million (or nearest offer) 🙂 Actually, they’re not really, the one below has already gone to a good home.

Enjoy !!

Random Reads

“Random Reads” 2014

Modify Primary Key Using Index (Learning To Fly) February 27, 2014

Posted by Richard Foote in 12c, Modify Primary Key Using Index, Oracle Indexes, Primary Key, Richard's Musings.
1 comment so far

One of the things I love about working with Oracle Database technologies is that there’s just so much one can learn. I make it an active goal of mine to try to learn something new at work each and every day, no matter how big or small. One of these days, I might blog about a presentation I put together a while ago on the common habits of highly successful DBAs (or technologists in general). One of these key habits I believe is the constant need to keep learning and to keep growing professionally.

One of the places I constantly turn to in order to learn something new is Jonathan Lewis’s Oracle Scratchpad blog. I doubt many folks who read my blog don’t already know what a fantastic source of information this is. Reading a recent posting of his on Modifying Primary Keys was one such moment where I went “wow, I didn’t know you could do that” !!

I previously blogged about the new 12c capability of having Multiple Indexes On The Same Column List and demonstrated how it was now possible to “quickly” swap the index on say a Primary Key constraint by pre-building a new index (say a Unique index to replace an existing Non-Unique index), then drop/disable the constraint and old index, make the new index visible and re-applying the PK constraint.

Well, as Jonathan described, there’s an easier alternative that doesn’t require so much stuffing around with the PK constraint.

I’m just going to setup the same demo as I used in the initial multiple indexes discussion where I have a Non-Unique index policing the PK constraint of a table:

SQL> create table ziggy (id number, name varchar2(30))
 partition by range (id)
(partition ziggy1 values less than (1000),
 partition ziggy2 values less than (2000),
 partition ziggy3 values less than (maxvalue));

Table created.  

SQL> insert into ziggy select rownum, 'DAVID BOWIE' from dual connect by level <=5000;  

5000 rows created.  

SQL> commit;  

Commit complete.  

SQL> create index ziggy_id_i1 on ziggy(id);                

Index created.  

SQL> alter table ziggy add constraint ziggy_pk primary key(id);  

Table altered.

I then subsequently decide to replace the existing Non-Unique index policing the PK constraint with say a Unique Index instead. (Note the following also applies for Unique constraints as well). With 12c, I can pre-create another index with a different characteristic on the same column, I just have to initially make it Invisible:

SQL> create unique index ziggy_id_i2 on ziggy(id) invisible online;  

Index created.

Now comes the interesting bit (for me anyways). I can simply modify the PK or Unique Key constraint to use the new index with the USING INDEX clause:

SQL> alter table ziggy modify constraint ziggy_pk using index ziggy_id_i2;

Table altered.

And then switch the visibility of the two indexes:

SQL> alter index ziggy_id_i1 invisible;

Index altered.

SQL> alter index ziggy_id_i2 visible;

Index altered.

SQL> drop index ziggy_id_i1 online;

Index dropped.

Thereby changing the index policing the PK constraint without having to drop/disable the PK constraint in the process. I do have both indexes invisible for a brief period of time, so still exercise some caution, although the PK business rule is safe at all times without having to lock the table.

Obviously, if you wish to switch the index with one that uses a different column list (for example, if you wish to remove an unnecessary column from the policing index), then the indexes can simply be switched without having to alter their visibility attributes.

As Jonathan pointed out in his post, this capability dates back to later versions of 9i.

I wonder what I’ll learn tomorrow …

Merry Christmas !! (Love Is Lost) December 23, 2013

Posted by Richard Foote in Christmas, Kaleidoscope, Richard's Musings.
add a comment

It’s been a pretty good year all round really.

I had the most perfect holiday in Hawaii, the mighty Crystal Palace won promotion to the English Premier League, we’ve finally won back The Ashes from England and David Bowie released the most brilliant “The Next Day” album right out of the blue. Oh and the Oracle 12c Database was finally released as well 🙂

Next year promises to be just as exciting with the eagerly anticipated Oracle Database “In-Memory” Option due to be released sometime in 2014. I’m sure to have quite a bit to talk about on that subject when it finally gets released, considering the impact on database indexing strategies it will have 🙂

After a relatively quiet year on the conference front, I’m planning to get out a little more next year. As an example, I’m really looking forward in June to presenting at the excellent ODTUG Kaleidoscope 2014 conference in beautiful Seattle. I have a couple of papers accepted so I hope to catch up with many of you there, a city I loved when I visited previously. More details to come.

Let me take this opportunity to wish everyone a very Merry Christmas and the very best of New Years. Stay safe and stay happy.

As a treat this year, a fantastic digital art video of one of the tracks from “The Next Day”, a re-mixed version of “Love Is Lost” by James Murphy.

Enjoy !!

Top 100 Books Of All Time (I Can’t Read) November 23, 2013

Posted by Richard Foote in Richard's Musings, Top 100 Books.
18 comments

And now for something completely different.

David Bowie recently revealed a list of his top 100 books. It was a really interesting list, especially considering that being such a huge David Bowie fan for so many years, I had only actually read 2 of the books on his list (“Nineteen Eighty-Four” by George Orwell and “A Clockwork Orange” by Anthony Burgess). So as an avid reader, this got me thinking, what would be in my list of top 100 books and thought it would be a bit of fun to compile and share my own list.

Well after lots of consideration and much dwelling back into my distant past, I’ve come up with a list of my favourite 100 books of all time. I’ve tackled this a little differently in that I’ve tried to view this from the perspective of my feelings and impressions of when I actually first read a book, rather than how I might view a particularly book now. So for example, it was the joy and excitement of a nine year old Richard Foote reading “Comet In Momminland” over a couple of dark winter evenings in Manchester that has an equal vote to the somewhat older current version.

I also decided to treat a series of books as being the one logical book, a “partitioned book” if you like, but only when such a complete series deserves credit (for example “The Lord of the Rings”) but not so if the series doesn’t hold up as a whole (such as with the “Dune” series and the less inspiring follow-ups after the brilliant original novel).

Getting to the 70-80 mark wasn’t actually too difficult but deciding which books get to fill the remaining slots was really quite tricky with various books and authors being in then out then in again. Then I remembered an important book or two which meant something else had to go. But in the end, I think the final 100 I’ve selected is a pretty good overall reflection of what I considered to be a really good read at the time.

Finally, the books are ordered alphabetically as it was just a task too far to try and order them in order of preference. However, there is one notable exception as I do have a clear favourite, that being J. R. R. Tolkien’s classic “The Lord of the Rings”. I remember as if it was only yesterday having a week off school, sick in bed with tonsillitis, when my parents bought me “The Fellowship of the Ring” to cheer me up. Not only did it cheer me up but my introduction to the land of Middle-Earth in many ways changed my life as so many fantasy based novels in my list will testify. It’s also about the only book on the list that I’ve repeated read over the years.

I guess that’s why all the books ultimately made it on the list, having helped in some way (some more than others) to mould me into who I am today. That and considering them a damn fine read at the time of course.

So here they are, my top 100 books of all time. I wonder how many you’ve read 🙂

1 “The Lord of the Rings” J.R.R. Tolkien 1954-1955
2 “The 7 Habits of Highly Effective People” Stephen R. Covey 1989
3 “The Adventures of Tintin” Herge  1929-1976
4 “Alias David Bowie” Peter and Leni Gillman 1987
5 “Animal Farm” George Orwell 1945
6 “Asterix the Gaul”  Rene Goscinny and Albert Uderzo 1961-1977
7 “The Axis Trilogy” Sara Douglass 1995-1996
8 “The Belgariad Series” David Eddings 1982-1984
9 “The Bitterbynde Trilogy” Cecilia Dart-Thornton 2001-2002
10 “The Book of Words Trilogy” J. V. Jones 1995-1997
11 “Casino Royale” Ian Flemming 1953
12 “The Cat in the Hat” Dr Seuss 1957
13 “Charlotte’s Web” E. B. White 1952
14 “The Chronicles of Narnia” C. S. Lewis 1950-1956
15 “A Clockwork Orange” Anthony Burgess 1962
16 “The Complete Tales of Hans Christian Andersen” Christian Anderson 1835-1845
17 “The Complete Tales of Mystery and Imagination” Edgar Allan Poe 1839-1943
18 “The Da Vinci Code” Dan Brown 2003
19 “Dali” Max Gerard 1986
20 “The Dark Tower Series” Stephen King 1982-2012
21 “David Bowie – The Pitt Report” Kenneth Pitt 1983
22 “David Bowie Black Book” Miles 1980
23 “David Robert Jones Bowie: The Discography Of A Generalist, 1962-1979” David Jeffrey Fletcher 1979
24 “The Day of the Triffids” John Wyndham 1951
25 “Dune” Frank Herbert 1965
26 “Effective Oracle By Design” Tom Kyte 2003
27 “Ender’s Game Series” Orson Scott Card 1985-1996
28 “Far from the Madding Crowd” Thomas Harding 1874
29 “The Far Side Gallery Series” Gary Larson 1984-1995
30 “The Farseer Trilogy” Robin Hobb 1995-1997
31 “The First Chronicles of Thomas Covenant” Stephen R. Donaldson 1977-1979
32 “The First Law Trilogy” Joe Abercrombie 2006-2008
33 “Footrot Flats Series” Murray Ball 1975-1994
34 “The Foundation Trilogy” Isaac Asimov 1951-1953
35 “The Gap Series” Stephen Donaldson 1991-1996
36 “The Grapes of Wrath” John Steinbeck 1939
37 “Great Escape Stories” Eric Williams 1958
38 “The Green Mile” Stephen King 1996
39 “Greg Mandel Series” Peter F. Hamilton 1993-1995
40 “Gulliver’s Travels” Jonathan Swift 1726
41 “The Hamlyn Children’s Animal World Encyclopedia in Colour”  1967
42 “The Original Hardy Boys Mystery Stories” Franklin W. Dixon 1927-1979
43 “Harry Potter Series” J. K. Rowling 1997-2007
44 “The Hitchhiker’s Guide to the Galaxy” Douglas Adams 1979
45 “HMS Ulysses” Alistair MacLean 1955
46 “The Hobbit” J.R.R. Tolkien 1937
47 “The Hound of the Baskervilles” Arthur Conan Doyle 1902
48 “I, Robot” Iasaac Asimov 1950
49 “The Importance of Being Earnest” Oscar Wilde 1895
50 “Inside Out – A Personal History of Pink Floyd” Nick Mason 2004
51 “Islands In The Sky” Arthur C. Clarke 1954
52 “It” Stephen King 1986
53 “James and the Giant Peach” Roald Dahl 1961
54 “John Lennon – The Life” Philip Norman 2008
55 “Jonathan Livingston Seagull” Richard Bach 1970
56 “Killers of Eden” Tom Mead 1961
57 “Life on Earth”  David Attenborough 1979
58 “Lord of the Flies” William Golding 1954
59 “Magician” Raymond E. Feist 1982
60 “The Midwich Cuckoos” John Wyndham 1957
61 “The Millennium Trilogy” Stieg Larsson 2005-2007
62 “The Mists of Avalon” Marion Zimmer Bradley 1983
63 “Moby-Dick” Herman Melville 1851
64 “Moomin Series” Tove Jansson 1945-1970
65 “Mordant’s Need” Stephen Donaldson 1986-1987
66 “The Name of the Wind” Patrick Rothfuss 2007
67 “The Night’s Dawn Trilogy” Peter F. Hamilton 1996-1999
68 “Nineteen Eighty-Four” George Orwell 1949
69 “The Observer’s Book of Birds” S. Vere Benson 1972
70 “Of Mice and Men” John Steinbeck 1937
71 “Optimizing Oracle Performance” Cary Millsap and Jeff Holt 2003
72 “Oracle 7 Database Concepts Manual” Oracle Corporation 1996
73 “The Original Shannara Trilogy” Terry Brooks 1977-1985
74 “Pigs Might Fly. The Inside Story of Pink Floyd” Mark Blake 2007
75 “Practical Oracle 8i – Building Efficient Databases” Jonathan Lewis 2000
76 “The Pythons Autobiography” The Pythons 2003
77 “The Rain Wilds Chronicles” Robin Hobb 2009-
78 “Rainbows End” Vernor Vinge 2006
79 “The Saga of Pliocene Exile” Julian May 1981-1984
80 “Saucerful of Secrets: The Pink Floyd Odyssey” Nicholas Schaffner 1991
81 “The Second Chronicles of Thomas Covenant” Stephen R. Donaldson 1980-1983
82 “The Silmarillion” J. R. R. Tolkien 1977
83 “The Silver Sword” Ian Serraillier 1956
84 “Soldier Son Trilogy” Robin Hobb 2005-2008
85 “A Song of Ice and Fire Series” Gearge R. R, Martin 1991-
86 “The Stand” Stephen King 1978
87 “Syd Barrett – A Very Irregular Head” Rob Chapman 2010
88 “The Tale of Peter Rabbit” Beatrix Potter 1902
89 “Tales of the OakTable” Various Oracle Experts 2003
90 “The Thirty-Nine Steps” John Buchan 1915
91 “The Time Machine” H. G. Wells 1895
92 “Tinker, Tailer, Soldier, Spy” John le Carre 1974
93 “Treasure Island” Robert Louis Stevenson 1881
94 “The View from the Mirror Quartet” Ian Irvine 1998-1999
95 “Void Trilogy” Peter F. Hamilton 2007-2010
96 “The War of the Worlds” H. G. Wells 1898
97 “Watership Down” Richard Adams 1972
98 “The Wheel of Time Series” Robert Jordan 1990-2013
99 “Where Eagles Dare” Alistair MacLean 1967
100 “The Wind In The Willows” Kenneth Grahame  1908

OTWUK13 (Battle For Britain) November 14, 2013

Posted by Richard Foote in OTWUK13, Richard's Musings.
add a comment

I’ve been fortunate to attend and present at many Oracle conferences over the years but the one I would love to get to one year is the UKOUG conference. It always seems to have a great line-up of speakers and I’ve heard lots of positive feedback. Unfortunately, it’s a long long way from home, but it might be a good way to get to also see my beloved Crystal Palace football team live in action 🙂

For those attending this year, there’s a extra treat in that running in parallel literally across the road will be the OakTable World UK 2013 conference. It has a fantastic line-up of speakers including:

James Morle
Jonathan Lewis
Alex Gorbachev
Iloon Ellen-Wolff
Niall Litchfield
Doug Burns
Joel Goodman
Marcin Przepiorowski
Christian Antognini (now the latest Oracle ACE Director)
Pete Finnigan
David Kurtz
Moans Nogood

The event is free to all those attending the UKOUG conference but you need to register here first.

Maybe next year I’ll finally have a crack at getting to the UK and attending …

1,000,000 Blog Visits (How I Made My Millions) April 30, 2013

Posted by Richard Foote in Richard's Musings.
add a comment

Things have certainly been busy lately so I haven’t had much of a chance to get back here for a while. Busy at work, busy at home, busy at play and even busy with a new David Bowie album to enjoy !! And yes, “The Next Day” is an absolutely stunning album by the great man 🙂

While answering a backlog of questions today however, I noticed the blog has recently just passed a rather significant milestone. A little like driving the car and being too busy listening to David Bowie on the stereo to notice that the odometer has just passed 200,000 kms (yes my car is getting on a bit), I missed out on seeing the blog visit counter go past 1,000,000 visits. I kinda get excited by these milestones, see how I was when I passed 10,000, so I’m a little sad to have missed the party. That said, 1 million is quite a number for a humble little blog that doesn’t discuss Lady Gaga or religion (very often).

So thank-you to everyone that has visited and contributed to all the various discussions over the years.

The good news, I have a couple of new articles that will hopefully make an appearance in the next few days so the drought is nearly over 🙂 But first, I have a new episode of Game of Thrones Season III to get through 🙂

I’m Back !! Oracle Index Internals Seminar Scheduled in Europe For June. April 3, 2013

Posted by Richard Foote in Oracle Index Seminar, Richard's Musings.
5 comments

It’s been quite a while but I’ve recently been asked to present my Indexing Seminar in Europe for Oracle University and at this stage, all the planets seem to be aligning themselves to make this a distinct possibility.

Seminar details are as follows:

Location: Bucharest, Romania

When: 17-18 June 2013

Cost: 2000 RON (approx. 450 EUR)

Enrolment: Follow this link

This will be a unique opportunity as I just don’t get the chance in my schedule to present this any more, to learn some rather interesting and useful information on all things to do with Oracle indexes. Note there are currently no plans to schedule other events in the foreseeable future, this is it.

Hopefully you’ll get the opportunity to attend and I’ll get to meet you in beautiful Bucharest 🙂

5 Year Anniversary (5 Years) December 20, 2012

Posted by Richard Foote in Richard's Musings.
13 comments

It’s just occurred to me that I’ve just recently past the 5 year anniversary of when I started this humble little blog !!

My first real post on Invisible Indexes was written back on 11 December 2007. Some 256 posts later and I’m still here, posting occasionally on Oracle Indexes with as many David Bowie references as I can manage 🙂

There have been roughly 923,000 page views in that time and more importantly some 3,000+ comments in total, some of them driving shall we say “interesting and lively” debates. The entry with the most comments is this one on how execution plans can suddenly when the statistics remain unchanged, although this one on rebuilding indexes every Sunday afternoon was up there as well.

The most views on any given day was back on March 13, 2010 with 3606 views, when this entry on block and tree dumps was particularly hammered. The most popular blog entry of all time however goes to this one on the change of behaviour of dbms_stats with 10g, with this one on the differences between an index rebuild, coalesce and shrink a very close second.

My all-time favourite blog entry however is this April Fool’s one on my retirement announcement and plans to work in the adult film industry. Some of the comments on this one are just classic 🙂

A very sincere thank-you to all my loyal readers and to everyone who has contributed to this blog over the years, I hope you’ve learnt something new along the way. I certainly have !! With the Oracle 12c database due for release sometime in 2013, I’m sure there will be lots to write about for a while longer yet 🙂

Pushing through the market square, so many mothers sighing, news had just come over we had 5 years left to cry in

250 Posts !! October 5, 2012

Posted by Richard Foote in Richard's Musings.
7 comments

WordPress reported that my last post on Exadata Storage Indexes was my 250th !!

Who would have thought …

🙂