30 апреля 2011 г.

oracle: dbms_stats

9i DBMS_STATS
9i Gathering Optimizer Statistics

10g DBMS_STATS
Managing Optimizer Statistics


Установить статистику
-- Установить произольную статистику кол-во строк
exec DBMS_STATS.set_table_stats (ownname=>'ARBOR',tabname=>'ORD_ORDER',numrows => 4452760 );

-- Установить произольную статистику кол-во строк и кол-во блоков
exec dbms_stats.set_table_stats( ownname=>'ARBOR',tabname=>'ORD_ORDER, numrows => 10000, numblks => 1000 );


Удалить статистику
-- Удалить статистику для таблицы
exec DBMS_STATS.delete_table_stats (ownname=>'ARBOR',tabname=>'ORD_ORDER');

-- Удалить статистику для индекса
EXEC DBMS_STATS.delete_index_stats('SCOTT', 'EMPLOYEES_PK');

--
-- Export/Import статистики
--


28 апреля 2011 г.

google: поиск в гугле по определённому сайту

Если нужно найти  DBMS_STATS.AUTO_SAMPLE_SIZE на сайте asktom.oracle.com,
то в гугле вводим:
DBMS_STATS.AUTO_SAMPLE_SIZE site:asktom.oracle.com

27 апреля 2011 г.

oracle: Consistent gets and Current gets

1. CONSISTENT(согласованный на какой то момент)
блок запрашивается в режиме consistent - если его нет в буфере
- блок считывается с диска (physical reads++), помещается в буфер
- выбирается из буфера, при необходимости к нему применеются undo (consistent gets++)

2.  CURRENT(текущая версия блока, используется когда DML операция изменяет данные)
блок запрашивается в режиме CURRENT - если его нет в буфере
- блок считывается с диска (physical reads++), помещается в буфер
- вытаскивается в режиме CURRENT (db block gets++)

3. процесс считывает блоки минуя буфер - physical reads direct
- physical reads ++

26 апреля 2011 г.

oracle:db link

Примечание. Если параметр global_names=TRUE, то имя линка должно совпадать с именем базы, на которыйй этот линк идёт, чтобы обойти это нужно сделать:
alter system set global_names=false;

--Посмотреть линки:
select * from dba_db_links;

От юзера SYS можно использовать:
sys.link$
ku$_dblink_view
--Через эти представления можно узнать пароли пользователей под которыми эти линки 
--ходят, является дыркой безопасности:
select NAME,USERID, PASSWORD from sys.link$;

-- узнать это PUBLIC link или нет
-- все PUBLIC линки принадлежат схеме PUBLIC, поэтому:
select OWNER from dba_db_links where DB_LINK = 'MYLINK';

-- узнать это SHARED link или нет
-- SHARED link всегда создаётся с кляузой AUTHENTICATED BY 
-- поэтому чтобы узнать:
select NAME from sys.link$ where AUTHUSR is not null;


21 апреля 2011 г.

oracle: pl/sql tips & tricks

 Создать 10 таблиц с именами Т1...Т10
scott%ORA11GR2> begin
2 for i in 1 .. 10
3 loop
4 for x in (select * from user_tables where table_name = 'T'||i )
5 loop
6 execute immediate 'drop table ' || x.table_name;
7 end loop;
8 execute immediate 'create table t' || i || ' ( x int )';
9 end loop;
10 end;
11 /

oracle: различиях Analyze и DBMS_STATS

Дядю Тома спросили о различиях Analyze и DBMS_STATS:

Том,

Не мог бы ты объяснить, есть ли еще существенные отличия или преимущества пакета DBMS_STATS над оператором ANALYZE, кроме следующих:

    - DBMS_STATS позволяет выполнять сбор статистики параллельно
    - С помощью DBMS_STATS можно выполнять мониторинг статистики и получать устаревшую статистику для измененных строк.

и он ответил

oracle: определение размеров табличных пространств, таблиц и т.д.

--
-- Свободное место в табличных пространствах
--
set linesize 200
set pagesize 49999
set serveroutput on size 1000000

20 апреля 2011 г.

oracle: блокировки (locks), защёлки (latches), enqueues

Блокировки 
Типы блокировок
Где хранится информация о блокировках? ITL, INITRANS, MAXTRANS 
Выполнение блокировок с помощью защелок 

Принципы блокирования в СУБД Oracle. 


Разница между блокировками и защёлками.

Защелка (latch) – устанавливается, если кто-то работает с определенным участком памяти, и, как следствие, никто другой теперь в этот участок не попадет.

Блокировка – никого не допускает к строкам таблицы, если Вы меняете ее.

Блокировка реализуется с помощью защёлки 
Мы работаем с записью. Она уже находится в буфере в SGA. Запись эту нужно заблокировать, чтобы никакая другая сессия не заблокировала ее.

Наш серверный процесс вешает защелку на буфер с записью, читает буфер, находит нужную запись, ставит отметочку о том, что эта запись заблокирована нами. Таким образом, блокировка создана. Снимаем защелку. Работаем с записью.

Все прочие сессии, пока защелка закрыла буфер, ждали ее снятия. Как только защелка снята, очередной процесс устанавливает защелку на этот буфер, читает, находит запись, обнаруживает нашу блокировку, снимает свою защелку и ждет, когда мы снимем блокировку.



Типы блокировок

0 - none
1 - null (NULL)
2 - row-S (SS) разделяемая блокировка строки (RS) при выполнении select for update;
3 - row-X (SX) монопольная блокировка строки (RX) при выполнении операторов insert, delete, update;
4 - share (S) разделяемая блокировка таблицы share mode, генерируется, например, оператором lock table <…> in share mode;
5 - S/Row-X (SSX) (разделяемая блокировка таблицы и монопольная блокировка строк share row exclusive; генерируется, например, оператором lock table <…..> in share row exclusive mode;
6 - exclusive (X) монопольная блокировка ( X) при выполнении lock table.

Режимы  4 - share (S) и 5 - S/Row-X (SSX) встречаются крайне редко.



Блокировки DML


TX - блокировка транзакций
устанавливается при выполнении следующих операторов insert, delete, update, select for update. Блокировки транзакций работают только в режиме (lmode) - 6 exclusive (X) монопольная блокировка. Блокировки транзакций всегда осуществляются на уровне строк: блокируется строка и предотвращается изменение строки другими транзакциями до тех пор, пока не буде выполнен откат текущей транзакции или транзакция не будет зафиксирована. Чтобы была установлена блокировка TX, сначала устанавливается блокировка TM для таблицы в режиме 3 (RX). Затем устанавливается блокировка TX в режиме 6 (X). Блокировка TX не будет установлена, если другая транзакция установила блокировку TX на эту же строку.

TM - блокировки очерёдности DML
применяются, если в транзакции выдается один из операторов insert, delete, update, select for update, lock table. Таблицы блокируются ораклом, чтобы зарезервировать доступ к таблице и предотвратить конкуренцию между операторами DDL за таблицу. Проще говоря, блокировка таблиц (TM) позволяет быть уверенным, что структура таблицы не изменится при изменении её содержимого.

Блокировки TM могут быть в следующих режимах (lmode) : 3- row exclusive монопольная блокировка строки (RX) при выполнении операторов insert, delete, update; 2- row share разделяемая блокировка строки (RS) при выполнении select for update; 6 – exclusive монопольная блокировка ( X) при выполнении lock table. 

На рисунке показаны режимы блокировки таблиц и операции, которые эти блокировки разрешают и запрещают

Следующий рисунок показывает, что будет если один процесс держит блокировку, а второй пытается её получить на один и тот же ресурс:



Блокировки DDL 

19 апреля 2011 г.

oracle: Database Resident Connection Pooling (DRCP)

Database Resident Connection Pooling (DRCP)
Database Resident Connection Pooling (DRCP) is an optional, new method of connecting to the
database and establishing a session. It is designed as a more efficient method of connection pooling
for application interfaces that do not support efficient connection pooling natively–such as PHP, a
general purpose web scripting language. DRCP is a mixture of dedicated server and shared server
concepts. It inherits from shared server the concept of server process pooling, only the processes being
pooled will be dedicated servers not shared servers; it inherits from the dedicated server the concept
of–well–being dedicated.

18 апреля 2011 г.

oracle: блоки каких объектов в buffer_cache

Недокументированная таблица X$BH содержит информацию о заголовках буферов в буферном кеше.

Посмотреть блоки каких объектов находятся в буферном кеше:

select
 s.owner owner,
 object_name objname,
 subobject_name subobjname,
 substr(object_type,1,10) objtype,
 ts.block_size / 1024 blockkb,
 buffer.blocks blocks,
 s.blocks totalblocks,
 (buffer.blocks * ts.block_size / 1024) memkb,
 (buffer.blocks/decode(s.blocks, 0, .001, s.blocks))*100 bufferpercent
from
 (select o.owner, o.object_name, o.subobject_name,
         o.object_type object_type, count(*) blocks
  from dba_objects o, v$bh bh
  where o.object_id = bh.objd and o.owner not in ('SYS','SYSTEM')
  group by o.owner, o.object_name, o.subobject_name, o.object_type) buffer,
  dba_segments s,
 dba_tablespaces ts
where s.tablespace_name = ts.tablespace_name
  and s.owner = buffer.owner
  and s.segment_name = buffer.object_name
  and s.SEGMENT_TYPE = buffer.object_type
  and (s.PARTITION_NAME = buffer.subobject_name or buffer.subobject_name is null)
order by memkb desc;

14 апреля 2011 г.

unix: tar

1. Создать
tar -cvf file.tar /full/path - создать .tar

tar -czvf file.tar.gz /full/path - создать .tar.gz (архив)
tar -cjvf file.tar.bz2 /full/path - создать .tar.bz2 (архив)

Синтаксис этих примеров:
tar [-ключи] [название архива] [путь, что запаковать]

oracle: Time Model Statistics


http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2087.htm
Описание статистик DB Time, DB CPU, SQL execute elapsed time и т. д.

13 апреля 2011 г.

oracle: аудит SYS.AUD$

Проверить установлен ли аудит в базе
select name,value from v$parameter where name like 'audit%';

Установить аудит, если не установлен
  1. Установить параметр в init.ora
    audit_trail=true
    # может принимать значения AUDIT_TRAIL = { none | os | db | db,extended | xml | xml,extended }
    Или установить параметр в spfile:
    SQL> ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE;
  2. Рестарт базы
Установить аудит на user connections
SQL> connect / as sysdba
SQL> audit connect 
 
Смотрим рез-тат
select * from dba_audit_session order by sessionid desc;
select * from  sys.aud$ order by sessionid desc;


Посмотреть параметры аудита
select * from DBA_STMT_AUDIT_OPTS;

select * from DBA_PRIV_AUDIT_OPTS;

select * from DBA_OBJ_AUDIT_OPTS;


11 апреля 2011 г.

oracle: работа с датой

1. Системная дата
select sysdate from dual;

2. Текущая дата в сессии
select current_date from dual;

3. Какая дата будет завтра или через несколько дней, месяцев
-- завтра
select sysdate + 1 from dual;

4 апреля 2011 г.

oracle: статистики redo

Статистики REDO из представлений V$SESSTAT and V$SYSSTAT

redo log space requests 
Number of times the active log file is full and Oracle must wait for disk space to be allocated for the redo log entries. Such space is created by performing a log switch. Log files that are small in relation to the size of the SGA or the commit rate of the work load can cause problems. When the log switch occurs, Oracle must ensure that all committed dirty buffers are written to disk before switching to a new log file. If you have a large SGA full of dirty buffers and small redo log files, a log switch must wait for DBWR to write dirty buffers to disk before continuing. Also examine the log file space and log file space switch wait events in V$SESSION_WAIT