A natural extension of the argument that you shouldn't
necessarily strive for 'database independence' is the idea that
you should understand exactly what your specific database has to
offer and make full use of it. This is not a section on all of
the features that Oracle 8i has to offer. That would be an
extremely large book in itself. The new features of Oracle 8i
themselves fill a book in the Oracle documentation set. With
about 10,000 pages of documentation provided by Oracle, covering
each and every feature and function would be quite an
undertaking. Rather, this is a section on why it would benefit
you to get at least a cursory knowledge of what is provided.
As I've said before, I answer questions about Oracle on the web.
I'd say that 80 percent of my answers are simply URLs to the
documentation. People are asking how they might go about writing
some complex piece of functionality in the database (or outside
of it). I just point them to the place in the documentation that
tells them how Oracle has already implemented it, and how to use
it. Replication comes up this way frequently. I'll receive the
question 'I would like to keep a copy of my data elsewhere. I
would like this to be a read-only copy. I need it to update only
once a day at midnight. How can I write the code to do that?' The
answer is as simple as a CREATE SNAPSHOT command. This is what
built-in functionality in the database.
It is true you can write your own replication, it might even be
fun to do so, but at the end of the day, it would not be the
smartest thing to do. The database does a lot of stuff. In
general, it can do it better then we can ourselves. Replication
for example is internalized in the kernel, written in C. It's
fast, it's fairly easy, and it is robust. It works across
versions, across platforms. It is supported, so if you hit a
problem, Oracle's support team will be glad to help. If you
upgrade, replication will be supported there as well, probably
with some new features. Now, consider if you had developed your
own. You would have to provide support for all of the versions
you wanted to support. Inter-operability between 7.3 and 8.0 and
8.1 and 9.0, and so on — this would be your job. If it
'broke', you won't be calling support. At least, not until you
can get a test case that is small enough to demonstrate your
basic issue. When the new release of Oracle comes out, it will be
up to you to migrate your replication code to that release.
Not having a full understanding of what is available to you can
come back to haunt you in the long run. I was recently talking
with some developers and their management. They were
demonstrating a 'very cool' piece of software they had developed.
It was a message-based system that solved the database queue
problem. You see this normally in a database if you wanted many
people to use a table as a 'queue'. You would like many people to
be able to lock the next record in the queue, skipping over any
previously locked records (these queue records are being
processed already). The problem you encounter is that there is no
documented syntax in the database for skipping locked rows. So,
if you didn't know anything about Oracle's features, you would
assume that if you wanted queuing software on top of the
database, you would have to build it (or buy it).
That is what these developers did. They built a series of
processes, and developed APIs for doing message queuing on top of
the database. They spent quite a bit of time on it, and used
quite a few man-hours to achieve it. The developers were quite
sure it was unique. Immediately after seeing it, and hearing of
its functionality, I had one thing to say — Advanced
Queues. This is a native feature of the database. It solves the
'get the first unlocked record in the queue table and lock it for
me' problem. It was right there all along. Their developers, not
knowing that this feature existed, spent a lot of time and energy
writing their own. In addition to spending lots of time in the
past on it, they would be spending lots of time maintaining it in
the future. Their manager was less than impressed upon
discovering the unique piece of software in effect emulated a
native database feature.
I have seen people in an Oracle 8i database set up daemon
processes that reads messages off of pipes (a database IPC
mechanism). These daemon processes execute the SQL contained
within the pipe message, and commit the work. They did this so
that they could execute auditing in a transaction that would not
get rolled back if the bigger transaction did. Usually, if a
trigger or something were used to audit an access to some data,
but a statement failed later on, all of the work would be rolled
back (see Chapter 4 on Transactions, we discuss this statement
level atomicity in some detail). So, by sending a message to
another process, they could have a separate transaction do the
work and commit it. The audit record would stay around, even if
the parent transaction rolled back. In versions of Oracle before
Oracle 8I, this was an appropriate (and pretty much the only) way
to implement this functionality. When I told them of the database
feature called autonomous transactions (we will take a detailed
look at these in Chapter 15), they were quite upset with
themselves. Autonomous transactions, implemented with a single
line of code, do exactly what they were doing. On the bright
side, this meant they could discard a lot of code and not have to
maintain it. In addition, the system ran faster overall, and was
easier to understand. Still, they were upset at the amount of
time they had wasted reinventing the wheel. In particular the
developer who wrote the daemon processes was quite upset at
having just written a bunch of 'shelf-ware'.
The above list of examples is something I see repeated time, and
time again — large complex solutions to problems that are
already solved by the database itself. Unless you take the time
to learn what is available, you are doomed to do the same thing
at some point. In the second section of this book, Database
Structures and Utilities, we are going to take an in-depth look
at a handful of functionality provided by the database. I
picked and chose the features and functions that I see people
using frequently, or in other cases, functionality that should be
used more often but is not. It is only the tip of the iceberg
however. There is so much more to Oracle than can be presented in
a single book.