Oracle Stuff I Should Have Known !

Oracle, the obvious, and the not so Obvious …

Quick Note

with one comment

Just noticed this on the Apress site, looks like can expect a new book from Tom Kyte in the summer …

http://apress.com/book/view/9781430229469

Thought he had been quiet recently.

Written by Andy Campbell

22 January, 2010 at 18:59

Posted in Oracle

Has there been a big change in data volume ?

with 2 comments

Ever get requests from users/developers complaining that queries or feeds are suddenly running slower – and claiming nothing has changed ?  Are you  pretty sure its just going to data volume or some sort of change in table statistics?

One of the useful features introduced in 10g was DBMS_STATS automatically saving old statistics before it replaces them, this allows you run a query to see the history of the number of rows and sample size for a table and spot sudden changes or patterns.

SELECT  obj.owner
       ,obj.object_name                   table_name
       ,NVL(obj.subobject_name,'GLOBAL')  partition_name
       ,TO_CHAR(hist.savtime)             save_time
       ,rowcnt
       ,DECODE( rowcnt,0,100, ROUND( samplesize / rowcnt  * 100 )) SampleSize
  FROM  dba_objects obj
       ,sys.wri$_optstat_tab_history hist
 WHERE  hist.obj#          = obj.object_id
   AND  owner              LIKE  '%&OWNER%'
   AND  object_name        LIKE  '%&TABLE_NAME%'
 ORDER  BY obj.owner,
            obj.object_name,
            obj.subobject_name,
            hist.savtime;

Which would could produce output something like the following ( edited to fit ) …

OWNER      Table Name SAVE_TIME                               ROWCNT SAMPLESIZE
---------- ---------- ----------------------------------- ---------- ----------
TST        MYTABLE    21-DEC-09 10.48.49.657130 PM -08:00    4599783         35
                      22-DEC-09 08.51.03.804101 PM -08:00    4609457         35
                      22-DEC-09 10.25.03.426489 PM -08:00    4606449         35
                      23-DEC-09 10.53.17.058652 PM -08:00    4602537         35
                      24-DEC-09 11.01.33.769205 PM -08:00    4609786         35
                      25-DEC-09 10.29.19.524311 PM -08:00    4608197         35
                      26-DEC-09 10.29.57.033672 PM -08:00    4607169         35
                      27-DEC-09 08.42.30.261394 PM -08:00    4608031         35
                      28-DEC-09 09.01.04.458258 AM -08:00    4610931         35
                      28-DEC-09 08.58.45.685068 PM -08:00    4611994         35
                      29-DEC-09 08.54.35.136462 PM -08:00    4610089         35
                      <snip>
                      19-JAN-10 08.48.50.453766 PM -08:00    4621849         35
                      19-JAN-10 08.51.17.329342 PM -08:00    4625629         35
                      19-JAN-10 10.04.42.517133 PM -08:00    4625584        100
                      20-JAN-10 09.53.32.024996 PM -08:00    4622763         35
                      20-JAN-10 10.59.40.301349 PM -08:00    4627791        100
                      21-JAN-10 09.01.01.591324 PM -08:00    4624446         35

Here the data volumes aren’t changing much although steadily increasing, but you can see gather stats is getting run twice on days without much change in data volume, but with different sample sizes. It needs a little more investigation but this probably the scheduled automatic job (SYS.GATHER_STATS_JOB ) and a manually submitted gather_stats from a batch job or app support.

How much history is kept?  By default 31 days, but this can be increased.

SELECT  'History Retention'</pre>
       ,TO_CHAR(dbms_stats.get_stats_history_retention)
  FROM  dual

How much does space my stats history take ?

SELECT  occupant_name
       ,schema_name
       ,space_usage_kbytes Used_kb
  FROM  v$sysaux_occupants
 WHERE  OCCUPANT_NAME  = 'SM/OPTSTAT'
OCCUPANT_NAME        SCHEMA_NAME        USED_KB
-------------------- --------------- ----------
SM/OPTSTAT           SYS                1616384

I've used the history a number of times to spot sudden changes in data, and is a useful script to have in your back pocket.

Andy

Written by Andy Campbell

22 January, 2010 at 11:08

Posted in Oracle, Oracle DBA

Not So Read Only …

with 4 comments

I’ve always assume making a tablespace READ ONLY meant NO changes could happen to its contents.  So for example if I create new tablespace, put a table in it and set it to be READ ONLY …


1:27:43 ops$oracle@ORA10204> create tablespace TEST;

Tablespace created.

11:27:58 ops$oracle@ORA10204> create table andy tablespace test as select * from dba_objects;

Table created.

11:28:21 ops$oracle@ORA10204> alter tablespace TEST READ ONLY;

Tablespace altered.

So I can’t change the rows in the table, good …


11:28:35 ops$oracle@ORA10204> update andy set object_name = NULL;
update andy set object_name = NULL
 *
ERROR at line 1:
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: '/db1/oradata/ORA10204/datafile/o1_mf_test_5oft5vpq_.dbf'

But I can drop the table !


11:38:34 ops$oracle@ORA10204> drop table andy;

Table dropped.

One workaround for this could be to disable DDL locks on the tables to make dropping tables harder …


11:43:48 ops$oracle@ORA10204> alter table andy disable table lock;

Table altered.

11:45:37 ops$oracle@ORA10204> drop table andy;
drop table andy
 *
ERROR at line 1:
ORA-00069: cannot acquire lock -- table locks disabled for ANDY

Written by Andy Campbell

20 January, 2010 at 12:55

Posted in Oracle, Oracle DBA