Turkcell: Миграция 250TB хранилища на Exadata

В Европе Exadata стоит в каждой подворотне. Я не мог понять почему в СНГ это редкость, пока не начал работать с английскими заказчиками -- сразу все стало ясно. В Европе умеют считать деньги -- в России не умеют не хотят :^)

Пока Москва стоит в пробках коллеги из Turkcell мигрировали на Exadata 250TB хранилище. Как Вы знаете, хранилища сотовых операторов впечатляют своими размерами, так как приходится хранить все звонки с целью анализа всевозможных тенденций. Качественное хранилище представляет большую ценность и существенное конкурентное преимущество для сотового оператора. Хранилища размером 0.5PB - 2PB не являются в этой индустрии чем-то из ряда вон выходящим. Но ханилище должно быстро работать и не быть при этом дороже самой сотовой компании :^) Так вот, наши турецкие друзья мигрировали одно из хранилищ такого класса на Exadata. На самом деле, случилось это давно, еще во времена Exadata V2, но техническая информация от администраторов появилась только в сентябре.

Я уважаю Турцию. Это технологически продвинутая страна. Ведь даже наши друзья турки понимают, что получается в 10 раз быстрее и одновременно на порядки дешевле по всем направлениям: на порядки дешевле железо, на порядки меньше места в серверной, на порядки меньше электроэнергии и охлаждения, отсутсвуют коммерческие файловые системы, volume-менеджеры и что там еще влияет на конечную стоимось владения? -- ну да -- инженеры. Storage administrator? О чем Вы? Такой профессии в Turkcell больше нету. Теперь обыкновенный DBA вполне нормально администрит эти несчастные 25 TB (это не очепятка, это просто технология HCC сжала данные в 10 раз).

МТСы, Билайны, Мегафоны! Где Вы? Уже Турция сделала это. Вдумайтесь хорошенько: Т-У-Р-Ц-И-Я.

Disclaimer

После миграции на Exadata ни один Storage инженер не пострадал. Turkcell заблаговременно отправил их на курсы MBA и теперь они трудятся на благо компании на top-менеджерских позициях :^)


Читать дальше...

Материалы Developer Day 18.11.2010

Материалы с семинара "Oracle Developer Day", который прошел 18.11.2010 в отеле "Катерина", можно скачать по этой ссылке (zip - 24Mb).

Отдельным постом будут ответы на вопросы, на которые мы не смогли с ходу ответить ... :-)


Читать дальше...

11g R2: Deferred Segment Creation

Предлагаю вашему вниманию свою небольшую презентацию посвященную новой возможности 11g R2 - отложенному созданию сегментов.
Вроде простая технология, но позволяет сделать интересные вещи ..




P.S. Контент входит в мою презентацию посвященную новым фичам 11g, которая будет читаться 18.11.2010 в "культовом" отеле Катерина (на фото).


Читать дальше...

Global Context work in RAC 11.2 !!!

Помимо массы архитектурных изменений, RAC в версии 11g Release 2 принес еще одну хорошую новость: теперь в RAC работают глобальные контексты (Global Application Context)
Вообще, глобальные контексты, как таковые, работали в RAC и до версии 11.2, но с одним "нехорошим" поведением: значения параметров не синхронизировались между узлами кластера. То есть: если значение параметра в контекст записала сессия на одном узле, а другая сессия пытается прочитать его на другом - значение параметра будет пустым!

Те, кто был на нашем семинаре RAC DD4D, хорошо это знают - я демонстрировал пример этой неприятной особенности контекстов в RAC.
Но теперь это в прошлом: начиная с 11.2 глобальные контексты полностью поддерживаются в RAC!

Как насчет pipe-ов в RAC?
Нет, нет: к сожалению, pipe-ы до сих пор в РАКе не работают.
- Но у нас есть обходное решение ! :-)
На семинаре оно тоже демонстрировалось.


node1-> sqlplus rscott/rtiger@orcl1

SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 16 18:23:45 2010

Copyright (c) 1982, 2009, Oracle. All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> select dbms_utility.current_instance from dual;

CURRENT_INSTANCE
----------------
1

SQL> create context my_context using set_rac_context
accessed globally;

Context created.

SQL> create or replace procedure set_rac_context(v_pName in varchar2,
v_pValue in varchar2) is
begin
dbms_session.set_context('MY_CONTEXT',v_pName, v_pValue);
end;
/
show errors;

Procedure created.

No errors.

SQL> exec set_rac_context('Hello','World');

PL/SQL procedure successfully completed.

SQL> select sys_context('MY_CONTEXT','Hello') from dual;



SYS_CONTEXT('MY_CONTEXT','HELLO')
--------------------------------------------------------------------------------
World

SQL> conn rscott/rtiger@orcl2
Connected.
SQL> select dbms_utility.current_instance from dual;

CURRENT_INSTANCE
----------------
2

SQL> select sys_context('MY_CONTEXT','Hello') from dual;

SYS_CONTEXT('MY_CONTEXT','HELLO')
--------------------------------------------------------------------------------
World

SQL> --!!!


Читать дальше...

Oracle Technology Day in Samara

Презентацию с Oracle Technology Day in Samara можно скачать здесь.

P.S. Качественной фотографии Самары как-то не нашлось в нашем архиве :)


Читать дальше...

PL/SQL Inline Optimization in 11g

Недавно с Геннадием Сигалаевым мы обсуждали технологию inline-подстановки в хранимых PL/SQL-процедурах TimesTen. Но вообще говоря, эта технология появилась в Oracle Database 11g, и уже потом весь "движок" PL/SQL был портирован в TimesTen.

Inline-подстановка хорошо знакома программистам, которые пишут на C/C++ и Delphi.

Начиная с 11g теперь такая возможность есть и у PL/SQL-разработчиков.

Рассмотрим следующий пример кода:

create or replace procedure test

authid definer is

function getTrimLine(pLine in varchar2) return varchar2 is

begin
return '' trim(pLine) '';
end;

begin

for xIndex in 1..100

loop
dbms_output.put_line(getTrimLine(dbms_random.string('p',xIndex)));
end loop;

end;
Функция getTrimLine вызывается в теле цикла много раз, и мы несем заметные накладные расходы на вызов этой функции, передачу параметров и возврат результата. Хотелось бы сразу вставить тело функции в цикл не меняя PL/SQL-код. Для этого в 11g появилась директива PL/SQL-компилятора pragma inline.

Перед вызовом, который мы хотим заменить на тело вызываемой подпрограммы, нужно вставить эту директиву:
SQL> rem Включаем вывод предупреждений от PL/SQL-компилятора

SQL> alter session set plsql_warnings='ENABLE:ALL';

Session altered.

SQL> create or replace procedure test

authid definer is

function getTrimLine(pLine in varchar2) return varchar2 is

begin
return '' trim(pLine) '';
end;

begin

for xIndex in 1..100

loop
pragma inline(getTrimLine,YES);
dbms_output.put_line(getTrimLine(dbms_random.string('p',xIndex)));
end loop;

end;
/

show errors;

SP2-0804: Procedure created with compilation warnings

SQL> Errors for PROCEDURE TEST:

LINE/COL ERROR

-------- -----------------------------------------------------------------
4/3 PLW-06006: uncalled procedure "GETTRIMLINE" is removed.
13/5 PLW-06005: inlining of call of procedure 'GETTRIMLINE' was done
13/38 PLW-06004: inlining of call of procedure 'GETTRIMLINE' requested


SQL>
Как Вы видите, подстановка была успешно выполнена. Обратите внимание, что оптимизатор PL/SQL вообще удалил функцию getTrimLine, поскольку теперь она стала "мертвой", - то есть нигде не вызывается!

"Ну хорошо" - скажете Вы.
"Но ведь для того, чтобы этим воспользоваться, надо проанализировать весь код, и там, где это необходимо, вставить директиву pragma inline.
- Это все очень трудоемко !"

Не волнуйтесь - разработчки оптимизатора PL/SQL продумали это. :-)
В 11g появился новый уровень оптимизации PL/SQL - третий уровень, который собственно включает автоматическую inline-подстановку на фазе оптимизации кода. То есть оптимизатор сам принимает решение о необходимости подстановки того или иного вызова.
Проверим третий уровень на нашем примере (убираем из исходного кода директиву подстановки! ):
SQL> rem Включаем 3-ий уровень оптимизации PL/SQL

SQL> alter session set plsql_optimize_level=3;

Session altered.

SQL> create or replace procedure test

authid definer is

function getTrimLine(pLine in varchar2) return varchar2 is

begin
return '' trim(pLine) '';
end;

begin

for xIndex in 1..100

loop
dbms_output.put_line(getTrimLine(dbms_random.string('p',xIndex)));
end loop;

end;
/

show errors;

SP2-0804: Procedure created with compilation warnings

SQL> Errors for PROCEDURE TEST:

LINE/COL ERROR

-------- -----------------------------------------------------------------
4/3 PLW-06006: uncalled procedure "GETTRIMLINE" is removed.
12/5 PLW-06005: inlining of call of procedure 'GETTRIMLINE' was done


SQL>
Как видите оптимизатор "увидел", что вызов функции getTrimLine происходит в цикле и решил сделать ее подстановку вместо вызова.

Подстановка - очень полезная технология оптимизации ващего PL/SQL кода, для ее использования вам не надо модифицировать код приложения, а всего лишь нужно установить третий уровень оптимизации PL/SQL (plsql_optimize_level=3) и перекомпилировать свой код.


Читать дальше...