28 февраля 2011 г.

oracle: catalog.sql


$ORACLE_HOME/rdbms/admin/catalog.sql - создаёт представления словаря данных, динамические представления производительности и публичные синонимы для большинства представлений.

Необходимо запускать, если создаём базу из командной строки.

$sqlplus '/as sysdba'
sql> @catalog.sql

oracle: Выполнить команду ОС из sqlplus

Unix
Для этого нужно поставить знак ! перед командой:
sql> !ls -l
sql> !pwd

Windows
Написать host перед командой:
sql> host dir
sql> host ipconfig

22 февраля 2011 г.

oracle: SID, SERVICE NAME

Детально тут: SID, SERVICE NAME - что это такое?


SID (System IDentifier – системный идентификатор) является уникальным именем, которое однозначно идентифицирует экземпляр/базу данных. Хранится в переменной среды ORACLE_SID и используется утилитами и сетевыми компонентами для доступа к базе данных.

SERVICE_NAME (имя сервиса) – это сравнительно новое понятие, введенное начиная с СУБД Oracle 8i. SERVICE_NAME определяет одно или ряд имен для подключения к одному экземпляру базы данных. Возможные значения SERVICE_NAME указываются в сетевых установках Oracle и регистрируются в качестве службы БД процессом listener.

Итог: Если база данных зарегистрирована листенером, как службу с определенным SERVICE_NAME, тогда в tnsnames.ora можно использовать значение параметра SERVICE_NAME, иначе нужно будет использовать значение SID.

oracle: NULL

Поле со значением NULL никогда не будет равно полю с тем же значением

Чтобы найти значения NULL можно использовать разные подходы:


1. Использовать ф-цию NVL(exp1,exp2)
если exp1 = NULL, то ф-ция возвращает exp2


oracle: сортировка

Совсем немного о сортировке
Сортировка, параметры SORT_AREA_SIZE, SORT_AREA_RETAINED_SIZE, PGA_AGGREGATE_TARGET, WORKAREA_SIZE_POLICY

Сортировку в основном порождают: операторы Create Index, Select .... Order By, Distinct, Group By, Union, а также неиндексированные соединения.
Оракл пытается выполнить сортировку в памяти. Если памяти недостаточно, то выполняется дисковая сортировка.

Какая сортировка чаще происходит можно посмотреть так:
select * from v$sysstat where name like 'workarea executions%'

oracle: datablock, extent, segment

Хорошая статья Формат блока в ORACLE

Storage Hierarchy Summary
In summary, the hierarchy of storage in Oracle is as follows:
1. A database is made up of one or more tablespaces.
2. A tablespace is made up of one or more data files. These files might be cooked
files in a file system, raw partitions, ASM managed database files, or a file on a
clustered file system. A tablespace contains segments.
3. A segment (TABLE, INDEX, and so on) is made up of one or more extents. A
segment exists in a tablespace, but may have data in many data files within
that tablespace.
4. An extent is a logically contiguous set of blocks on disk. An extent is in a single
tablespace and, furthermore, is always in a single file within that tablespace.
5. A block is the smallest unit of allocation in the database. A block is the smallest
unit of I/O used by a database.


Segment Space Managment
Manual - вручную устанавливаются параметры FREELISTS, FREELIST GROUPS, PCTUSED и другие.
Automatic (ASSM) - устанавливается только один параметр PCTFREE. ASSM появился в Oracle 9i.


PCTUSED -  процент заполнения блока данных, выше которого блок считается заполненным
PCTFREE -  процент свободного места в блоке данных, которое удерживается на случай дальнейших апдейтов строк в этом блоке.

21 февраля 2011 г.

oracle: sequence

Sequence (последовательность)
A sequence is a database object that generates unique numbers, mostly used for primary key values.

В Oracle для поля нет атрибута AUTO_INCREMENT как в MySQL.
Вместо этого используются последовательности.

18 февраля 2011 г.

oracle: transaction level SERIALIZABLE

Уровни изолированности транзакций
Это самая высокая степень изолированности, имитация однопользовательской среды. Для транзакции база данных выглядит как моментальный снимок. Все изменения проведенные другими транзакциями не видны. В Oracle это реализовано путем распространения согласованности по чтению на уровне оператора на уровень транзакции. То есть из сегментов отката ORACLE восстанавливает данные не на начало оператора, а на начало транзакции. Но есть один неприятный момент: при попытке обновления строки измененной после начала транзакции будет получена ошибка ORA-08177.

ses1> set transaction isolation level serializable;
ses2> update t set user_id='200' where username='SYS';
ses1> update t set user_id='100' where username='SYS';
ses1 зависает
ses2> commit;
ses1> развисает с ошибкой
ORA-08177: can't serialize access for this transaction


oracle: SELECT FOR UPDATE

Уровни изолированности транзакций
oracle: transaction level SERIALIZABLE

Для обеспечения повторяемости при чтении в Oracle не нужно использовать SELECT FOR UPDATE — это делается только для обеспечения последовательного доступа к данным.

Уровни изолированности транзакций

oracle: get current SCN

SELECT dbms_flashback.get_system_change_number FROM dual;

17 февраля 2011 г.

oracle: включение/выключение режима flashback


В Oracle Database 10g появилась технология flashback, и в частности новая возможность – flashback database. При активации этой опции, ведутся дополнительные журналы операций над базой данных. Эти журналы называются flashback logs, и они создаются во время ведения обычных архивных журналов.
Как узнать включена опция flashback или нет?

SQL> SELECT FLASHBACK_ON FROM V$DATABASE;
FLASHBACK_ON
------------------
YES


Если вернется значение YES, то база данных находится в режиме flashback, если NO, то база данных в обычном режиме.

Перевод базы данных в режим flashback

oracle: узнать включен ли flashback


SELECT FLASHBACK_ON FROM V$DATABASE;

oracle: insert как select из другой таблицы


Вставка как select из другой таблицы:


1. insert into guppi.managers (empno) (select empno from guppi.emp);
2. insert into guppi.managers (empno, lname) (select empno, ename from guppi.emp);
3. insert /*+ APPEND */ into ARBOR.WP_USER_DATA select * from GUPPI.WP_USER_DATA;

oracle: flashback table

Откатить таблицу на какой нибудь момент времени

oracle: узнать включен ли flashback

!!! нужно разобраться

1. Используем SCN:

flashback table t to scn :scn;

Выскочила ошибка: ORA-08189: cannot flashback the table because row movement is not enabled

Нужно сделать

alter table t enable row movement;

и после

flashback table t to scn :scn;

Выдало ошибку: ORA-30055: NULL snapshot expression not allowed here

Но когда указал конкретный SCN, не через переменную, то получилось

flashback table t to scn 528407;

Получить таблицу на момент какого то SCN

Получить таблицу на момент какого то SCN:

select * from t as of scn :scn;
select * from t as of scn 141434762;

unix: kill all procceses


Убить процессы:
$ kill -9 `ps -ef|grep DUPdelete|grep -v grep|awk ‘{print $2}’`

где DUPdelete - имя процесса, который нужно убить

oracle: условие where 1=0

the “where” clause returnes a boolean value…so if you out 1=1 this is a true condition and you will take all the recors…for 1=0 this is a false condition and will not return records….so :-)

1.
select * from emp where 1=0;

возвращает заголовок таблицы(имена столбцов)

2.
select * from emp where 1=1;
возвращает всю таблицу

oracle: План выполнения запроса

Полезно почитать официальную доку по DBMS_XPLAN.
из инета dbms_xplan 

План выполнения запроса

Расшифровка значений плана:

Cost - стоимость, совокупная стоимость строки плана - это время, потраченное на одноблочные чтения, плюс время, потраченное на многоблочные чтения, плюс необходимое процессорное время, и всё это делённое на время, необходимое для выполнения одноблочного чтения.
Таким образом, стоимость - это суммарное прогнозируемое время выполнения оператора, выраженное в единицах времени выполнения одноблочного чтения. 

Card - кардинальность, количество записей, которое будет сгенерировано каждой строкой плана.

Bytes - байт, общий объём данных, который будет сгенерирован каждой строкой плана.

oracle: bind variables

Связанные переменные
Пример:
CREATE OR REPLACE procedure GUPPI.proc1
 as
begin
 for i in 1 .. 10000
 loop
 execute immediate
 ’insert into t values ( :x )’ using i;
 end loop;
end;

oracle: locks

Блокировки (locks)


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


Принципы блокирования в СУБД Oracle.
• Oracle блокирует данные на уровне строк и только при изменении. Эскалация блокировок до уровня блока или таблицы никогда не выполняется.
• Oracle никогда не блокирует данные с целью считывания. При обычном чтении блокировки на строки не устанавливаются.
• Сеанс, записывающий данные, не блокирует сеансы, читающие данные.
• Сеанс записи данных блокируется, только если другой сеанс записи уже заблокировал строку, которую предполагается изменять. Сеанс считывания данных никогда не блокирует сеанс записи.