.comment-link {margin-left:.6em;}

Thursday, February 23, 2006

Ver Plataforma no SQL*Plus

Va versão 10g existe uma nova coluna na v$database: PLATFORM_NAME.

SQL> select platform_name from v$database;

PLATFORM_NAME
------------------------------------------------------------------------
Microsoft Windows IA (32-bit)

1 row selected.

SQL> select platform_name from v$database;

PLATFORM_NAME
-------------------------------------------------------
10 Linux IA (32-bit)

1 row selected.

Mas na 9i - NÃO.

SQL> select platform_name from v$database;
select platform_name from v$database
*
ERROR at line 1:
ORA-00904: "PLATFORM_NAME": invalid identifier

Para 9i e 8i usamos o

SQL> select dbms_utility.port_string from dual;

PORT_STRING
--------------------------------------------------------
Linuxi386/Linux-2.0.34-8.1.0

1 row selected.

Sunday, February 19, 2006

Stored Outlines

Esta semana lidei com um problema cuja solução foi congelar o plano de execução em RBO e passá-lo a CBO. Um de nossos parceiros possui um sistema fechado (pacote), portanto, não podíamos fazer nada com relação às queries. O problema era a ordem com que o result set era gerado. O sistema usa o primeiro registro para habilitar os grupos de contas que o usuário pode ver. Quando analisamos as tabelas, obviamento o CBO usava um plano melhor, porém a ordem do result set vinha alterada e o administrador não podia ver TODAS as contas.

Solução: Stored Outlines.

Stored Outlines é, em minha opinião, uma máquina fotográfica. Ele tira fotos de um plano de execução. Mas para que serve? Eu já tinha me feito essa pergunta. Pensei que nunca iria usar essa feature do Oracle. Para que vou congelar um plano de execução? Mas... eu estava enganado. Melhor! Resolvemos o problema. Nas próximas semanas, o sistema será testado em ambiente de aceite (UAT) e muito provavelmente será implementado em produção.

Isso me ensinou uma lição - nunca é uma palavra que nunca deve ser usada :-)

Demonstrando!

Primeiro vamos preparar uma tabela para exemplo. Sabemos que se um índice cobre 25% da tabela, ele não tem seletividade boa, portanto, não deveria ser considerado pelo otimizador, certo? Sim, se o otimizador for o CBO, caso contrário o RBO pensa: tenho índice, oba! Tenho a solução, vou pelo índice. Então, a tabela abaixo tem 100 mil registros dividos em 25 mil para o campo id (10, 20, 30 e 40). Vou criar um índice nesse campo e veremos os planos.

SQL> create table t as
2 select case mod(rownum,4)
3 when 0 then 10
4 when 1 then 20
5 when 2 then 30
6 when 3 then 40 end id,
7 rpad('x', 100, 'x') pad
8 from dual connect by level <= 100000 9 / Table created. SQL>
SQL> create index t_idx on t(id);

Index created.

Ok, vamos analizar agora os planos de execução para RBO e CBO.

SQL> set autotrace traceonly explain
SQL>
SQL> select * from t where id = 10
2 /

Execution Plan
----------------------------------------------------------
Plan hash value: 470836197

---------------------------------------------
| Id | Operation | Name |
---------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| T |
|* 2 | INDEX RANGE SCAN | T_IDX |
---------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("ID"=10)

Note
-----
- rule based optimizer used (consider using cbo)

SQL>
SQL> set autotrace off
SQL>
SQL> begin
2 dbms_stats.gather_table_stats(
3 user, 'T',
4 cascade => true,
5 method_opt => 'for all indexed columns'
6 );
7 end;
8 /

PL/SQL procedure successfully completed.

SQL>
SQL> set autotrace traceonly explain
SQL>
SQL> select * from t where id = 10;

Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 26096 | 1401K| 344 (1)| 00:00:05 |
|* 1 | TABLE ACCESS FULL| T | 26096 | 1401K| 344 (1)| 00:00:05 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("ID"=10)

SQL>
SQL> set autotrace off
SQL>
SQL> exec dbms_stats.delete_table_stats( user, 't' )

PL/SQL procedure successfully completed.

Como demonstrado acima, com o RBO (sem estatísticas) o otimizador escolheu o índice e com o CBO full table scan. A migração do RBO para o CBO é um dos exemplos para o uso do Outlines. Às vezes é necessário congelar um plano do RBO para que seja usado no CBO. Então vamos tirar um foto do plano de execução para a query "select * from t where id = 10"

Seguindo o exemplo, vamos criar o stored outlines.

SQL> create or replace outline rbo_plan
2 for category rbo_plan on
3 select * from t where id = 10;

Outline created.

Pronto, temos a fotogratia. Agora vamos converter a CBO coletando estatísticas, depois vamos usar o explain plan para verificar o plano da primeira query após a coleta. Será Full table scan, porque para que possamos usar a stored outlines, necessitamos alterar a sessão e indicar ao otimizador que existe a foto.

SQL> begin
2 dbms_stats.gather_table_stats(
3 user, 'T',
4 cascade => true,
5 method_opt => 'for all indexed columns'
6 );
7 end;
8 /

PL/SQL procedure successfully completed.

SQL>
SQL> set autotrace traceonly explain
SQL> select * from t where id = 10;

Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 25092 | 1347K| 344 (1)| 00:00:05 |
|* 1 | TABLE ACCESS FULL| T | 25092 | 1347K| 344 (1)| 00:00:05 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("ID"=10)

SQL>

Acima CBO com full table scan. Abaixo, vamos alterar a sessão para o uso da stored outlines.

SQL> alter session set use_stored_outlines = rbo_plan;

Session altered.

SQL> select * from t where id = 10;

Execution Plan
----------------------------------------------------------
Plan hash value: 470836197

-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 25092 | 1347K| 1574 (1)| 00:00:19 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 25092 | 1347K| 1574 (1)| 00:00:19 |
|* 2 | INDEX RANGE SCAN | T_IDX | 25092 | | 51 (2)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("ID"=10)

Note
-----
- outline "RBO_PLAN" used for this statement

Então, da próxima vez que eu vir uma feature nova, vou pensar mais para dizer que NUNCA usarei.

Labels:


Monday, February 13, 2006

Practical Learning Oracle

Voce já se perguntou: Como voce aprende?

Para responder essa pergunta, voltamos um pouco no tempo (para aqueles que, assim como eu, tenham tirado sua carteira de habilitação a um bom tempo atrás). Como aprendemos a dirigir? Vou revelar meu caso: foi com bastante excitação, eu mal podia esperar o momento de "pegar" o carro. Formalmente, vem as aulas teóricas, depois as aulas práticas e ai o dia-a-dia. No cotidiano, se aprende de verdade, quando somos obrigados a resolver problemas reais e quando nem nos damos conta, já estamos mudando de marcha sem pensar nisso. Quando escutamos o motor sabemos o momento certo de engatar, acelar mais, menos - é natural, é fácil. Temos um propósito ao dirigir, o carro precisa nos conduzir de um ponto a outro e isso acontece naturalmente sem precisar consultar o manual.

Analisando o exemplo da condução de veículos, podemos traçar um paralelo no aprendizado:
Basicamente, voce aprende usando o conjuto dessas fases: motivação, experimento, teoria, prática e cotidiano.

Prosseguindo...
Já se perguntou quantas vezes assistiu a um curso e percebeu que estava sem a menor direção?

Sim! Bem vindo ao clube. Porque isso acontece? Muitas vezes acontece porque os cursos vão até a fase da teoria. Não passam para a prática. Não desenham o curso voltado para cidade, eles desenham o curso voltado para o pátio onde será realizada a prova de habilitação. Mas e ai? Quando voce tirar seu OCP, digo, sua habilitação, vai dirigir somente dentro do pátio onde se realizou a prova ou vai para cidade? Mesma coisa com o banco de dados!

O Curso: Practical Learning Oracle

Decidi escrever esse curso para tentar suprir algo que notei na maioria dos cursos que frequentei. Muita teoria, muita matéria. Mas cadê os exemplos práticos? Tá, o instrutor brilhantemente me explica tudo sobre Flash Recovery Area, mas onde eu aplico isso e como? As new features entre duas versões. Lindo! Mas e ai? No meu caso, o que eu ganho com a novidade? Não vejo um ambiente, uma aplicação com inicio, meio e fim.

O Practical Learning Oracle tenta suprir essa ausência, que entendo, ocorre na maioria dos cursos ministrados sobre Oracle. A idéia é apresentar o curso na prática e em três partes. A primeira mandatória para as outras, onde será visto a instalção e toda a arquitetura do Oracle 10g. A segunda, será orientada a Aplicação, onde será visto desenho, pl/sql, índices e performance e, completando, a última Administração da Base (DBA), aqui o foco é onde o DBA não pode se perder: recuperação de ambiente, monitoração e definição de métricas (SGA, datafiles, etc).

O curso pode ser ministrado em módulos: - Completo, Módulo Aplicação (1ª e 2ª partes) ou Modulo DBA (1ª e 3ª partes).

No módulo de Aplicação a turma desenvolverá um sistema pequeno porém real. No caso do módulo DBA, o sistema já estará instalado para a administração. Não importa o módulo eleito, todo o curso é voltado para PERFORMANCE, ou seja, tudo que será discutido levará em conta desempenho. Abaixo, a planilha tráz o conteúdo dos módulos.



Labels:


This page is powered by Blogger. Isn't yours?