DicasSQL
25 pág.

DicasSQL

Disciplina:Bancos de Dados para Redes81 materiais667 seguidores
Pré-visualização4 páginas
de cima para baixo).

Leading(tab) - induz o Oracle iniciar o join com a tabela ‘tab’.

3.5 Parallel Query (PQ)

Parallel (tab,degree[,inst]) – induz o Oracle a paralelizar a consulta a tabela ‘tab’ pelo grau de paralelismo ‘degree’ com ‘inst’ instâncias.

Parallel_Index(table,[index,[degree[,inst]]]) - induz o oracle a paralelizar o acesso de índice particionado.

Pq_Distribute(tab,out,in)- indica como distribuir os registros da tabela ‘tab’ em uma PQ entre produtores e consumidores. Os valors para ‘out’ (outer table) e ‘in’ (inner table) podem ser: hash, none, broadcast ou partition.

Noparallel(tab) – evita a paralelização do acesso a tabela ‘tab’

Noparallel_Index(tab) – evita o parallel index scan

3.7 Variados

Rewrite(v1[,v2]) – permite que uma query compatível com a consulta de uma materialized view (v1,v2,...) seja reescrita de forma que aproveite os dados pré processados da materialized view.

	Obs: versão posterior a 8.1

Norewrite – não permite que a query seja reescrita

�

4. Dicas

	Abaixo seguem as tabelas que usaremos nos exemplos.

 tab_loc: tabela local
índices : tab_loc_pk (codigo)

 tab_loc_ind (data )

registros: 500.000

SQL> desc tab_loc

 Name Null? Type

 ------------------------ -------- --------------

 CODIGO NOT NULL VARCHAR2(10)

 DESCRICAO NOT NULL VARCHAR2(50)

 DATA NOT NULL DATE

 VALOR NOT NULL NUMBER

 tab_loc_peq: tabela local pequena

índices : tab_loc_peq_pk (codigo)

registros: 50

SQL> desc tab_loc_peq

 Name Null? Type

 ------------------------ -------- --------------

 CODIGO NOT NULL VARCHAR2(10)

 DESCRICAO NOT NULL VARCHAR2(50)

 DATA NOT NULL DATE

 VALOR NOT NULL NUMBER

 tab_loc_gra: tabela local grande

índices : tab_loc_gra_pk (codigo)

registros: 3.070.307

SQL> desc tab_loc_peq

 Name Null? Type

 ------------------------ -------- --------------

 CODIGO NOT NULL NUMBER(10)

 DESCRICAO NOT NULL VARCHAR2(50)

 DATA NOT NULL DATE

 VALOR NOT NULL NUMBER

 tab_rem@link_bci: tabela remota

índices : tab_rem_pk (codigo)

registros: 500.000

SQL> desc tab_rem@link_bci

 Name Null? Type

 ------------------------ -------- ------------

 CODIGO NOT NULL VARCHAR2(10)

 DESCRICAO NOT NULL VARCHAR2(50)

 DATA NOT NULL DATE

 VALOR NOT NULL NUMBER

�

4.1 Evitar função em coluna indexada

Exemplo: consultar todos registros de um determinado dia

Consulta ineficiente

 select count(*)

 from tab_loc

 where trunc(data) = to_date(‘10/10/2003’,‘dd/mm/yyyy’);

Resultado

 Tempo: 2,5s

 OPERATION OPTIONS OBJECT_NAME

 ------------------------------ -------------------- ------------------

 0 SELECT STATEMENT .

 1 SORT AGGREGATE .

 2 INDEX FAST FULL SCAN TESTE.TAB_LOC_DATA

 Statistics

 ---------------------------------------------------

 0 recursive calls

 6 db block gets

 1196 consistent gets

 1196 physical reads

 0 redo size

 205 bytes sent via SQL*Net to client

 261 bytes received via SQL*Net from client

 3 SQL*Net roundtrips to/from client

 1 sorts (memory)

 0 sorts (disk)

 1 rows processed

Consulta eficiente

 select count(*)	

 from tab_loc

 where data >= to_date(‘10/10/2003’,‘dd/mm/yyyy’)

 and data < to_date(‘10/10/2003’,‘dd/mm/yyyy’) + 1;

Resultado

 Tempo: 0,1s

 OPERATION OPTIONS OBJECT_NAME

 ------------------------------ -------------------- ------------------

 0 SELECT STATEMENT .

 1 SORT AGGREGATE .

 2 INDEX RANGE SCAN TESTE.TAB_LOC_DATA

 Statistics

 ---------------------------------------------------

 0 recursive calls

 0 db block gets

 3 consistent gets

 0 physical reads

 0 redo size

 205 bytes sent via SQL*Net to client

 310 bytes received via SQL*Net from client

 3 SQL*Net roundtrips to/from client

 1 sorts (memory)

 0 sorts (disk)

 1 rows processed

�

4.2 Join com colunas do mesmo tipo

Se isto for inevitável, converta (aplique uma função to_char, to_number, to_date,...) no lado do join que não prejudique o plano de execução. A conversão implícita é custosa, além de ter o mesmo efeito que a utilização de funções em campos indexados.

Consulta ineficiente

 select count(*)

 from tab_loc l,

 tab_loc_gra g

 where l.codigo = g.codigo /* l.codigo é VARCHAR2 e g.codigo é NUMBER */
 and g.data = to_date('10/10/2003','dd/mm/yyyy');

Resultado

 Tempo: 1s

 OPERATION OPTIONS OBJECT_NAME

 ------------------------------ -------------------- ----------------------

 0 SELECT STATEMENT .

 1 HASH JOIN .

 2 TABLE ACCESS BY INDEX ROWID TESTE.TAB_LOC_GRA

 3 INDEX RANGE SCAN TESTE.TAB_LOC_GRA_DATA

 4 TABLE ACCESS FULL TESTE.TAB_LOC

 Statistics

 ---------------------------------------------------

 0 recursive calls

 4 db block gets

 1061 consistent gets

 0 physical reads

 0 redo size

 207 bytes sent via SQL*Net to client

 378 bytes received via SQL*Net from client

 3 SQL*Net roundtrips to/from client

 0 sorts (memory)

 0 sorts (disk)

 1 rows processed

Inclusão da conversão explícita de tipo

 select count(*)

 from tab_loc_gra g,

 tab_loc l

 where l.codigo = to_char(g.codigo,'fm99999999') /* ambos VARCHAR2 */
 and g.data = to_date('10/10/2003','dd/mm/yyyy');

Resultado

 Tempo: 0,4s

Obs: Apenas incluindo a conversão de tipo, o tempo foi reduzido pela metade. Note que o plano de execução não foi alterado.

�

 OPERATION OPTIONS OBJECT_NAME

 ------------------------------ -------------------- -----------------------

 0 SELECT STATEMENT .

 1 SORT AGGREGATE .

 2 HASH JOIN .

 3 TABLE ACCESS BY INDEX ROWID TESTE.TAB_LOC_GRA

 4 INDEX RANGE SCAN TESTE.TAB_LOC_GRA_DATA

 5 INDEX FAST FULL SCAN TESTE.TAB_LOC_PK

 Statistics

 -----------------------------------------------------

 0 recursive calls

 4 db block gets

 1061 consistent gets

 0 physical reads

 0 redo size

 206 bytes sent via SQL*Net to client

 360 bytes received via SQL*Net from client

 3 SQL*Net roundtrips to/from client

 0 sorts (memory)

 0 sorts (disk)

 1 rows processed

Consulta incluindo a conversão de tipo e Hints

 select /*+ ordered use_nl(l) */ count(*)

 from tab_loc_gra g,

 tab_loc l

 where l.codigo = to_char(g.codigo,'fm9999999') /* ambos c/ tipo VARCHAR2 */
 and g.data = to_date('10/10/2003','dd/mm/yyyy');

Resultado

 Tempo: 0,01s

 OPERATION OPTIONS