From time to time I read a question (or, worse, an answer) on OTN and wonder how someone could have managed to misunderstand some fundamental feature of Oracle – and then, as I keep telling people everyone should do – I re-read the manuals and realise that that sometimes the manuals make it really easy to come to the wrong conclusion.
Having nothing exciting to do on the plane to Bucharest today, I decided it (more...)
Some time ago I pulled off the apocryphal “from 2 hours to 10 seconds” trick for a client using a technique that is conceptually very simple but, like my example from last week, falls outside the pattern of generic SQL. The problem (with some camouflage) is as follows: we have a data set with 8 “type” attributes which are all mandatory columns. We have a “types” table with the same 8 columns together with two more columns (more...)
The following requirement appeared recently on OTN:
I have a following query and want to get rid of the "NOT EXISTS' clause without changing the end results.
WHERE NOT EXISTS (SELECT 1
WHERE B.c = A.c AND B.d = A.d AND B.e = A.e);
Inevitably this wasn’t the problem query, and almost inevitably (more...)
There’s a live example on OTN at the moment of an interesting class of problem that can require some imaginative thinking. It revolves around a design that uses a row in one table to hold the low and high values for a range of values in another table. The problem is then simply to count the number of rows in the second table that fall into the range given by the first table. There’s an (more...)
Everyone gets caught out some of the time with NOT IN.
NOT IN is not the opposite of IN.
This came up in a (fairly typical) question on OTN recently where someone had the task of “deleting 6M rows from a table of 18M”. A common, and perfectly reasonable, suggestion for dealing with a delete on this scale is to consider creating a replacement table holding the data you do want rather than deleting the (more...)
Here’s a quirky little bug that appeared on the OTN database forum in the last 24 hours which (in 12c, at least) produces an issue which I can best demonstrate with the following cut-n-paste:
SQL> desc purple
Name Null? Type
----------------------------------- -------- ------------------------
G_COLUMN_001 NOT NULL NUMBER(9)
SQL> select p.*
2 from GREEN g
3 join RED r on g.G_COLUMN_001 = r.G_COLUMN_001
4 join PURPLE p on g.G_COLUMN_001 = p. (more...)
There was a little conversation on Oracle-L about ASH (active session history) recently which I thought worth highlighting – partly because it raised a detail that I had got wrong until Tim Gorman corrected me a few years ago.
Once every second the dynamic performance view v$active_session_history copies information about active sessions from v$session. (There are a couple of exceptions to the this rule – for example if a session has called dbms_lock.sleep() it will appear (more...)
Some time ago I wrote a blog note describing a hack for refreshing a large materialized view with minimum overhead by taking advantage of a single-partition partitioned table. This note describes how Oracle 12c now gives you an official way of doing something similar – the “out of place” refresh.
I’ll start by creating a matieralized view and creating a couple of indexes on the resulting underlying table; then show you three different calls to refresh (more...)
The following question appeared the Oracle-L list-server recently:
In order to resize a datafile to release space at the end, we need to find whatever the last block_id that is at the start of that free contiguous space.
Problem is that we have a very large database such that querying dba_extents to find the last block is probably not an option. The standard query(ies) that make use of dba_extents runs for hours at stretch and also (more...)
One of the waits that is specific to ASSM (automatic segment space management) is the “enq: FB – contention” wait. You find that the “FB” enqueue has the following description and wait information when you query v$lock_type, and v$event_name:
SQL> execute print_table('select * from v$lock_type where type = ''FB''')
TYPE : FB
NAME : Format Block
ID1_TAG : tablespace #
ID2_TAG : dba
IS_USER : NO
DESCRIPTION : Ensures that only one process can format data (more...)