DicasSQL
25 pág.

DicasSQL


DisciplinaBancos de Dados para Redes90 materiais676 seguidores
Pré-visualização4 páginas
de cima para baixo).
Leading(tab) - induz o Oracle iniciar o join com a tabela \u2018tab\u2019.
3.5 Parallel Query (PQ)
Parallel (tab,degree[,inst]) \u2013 induz o Oracle a paralelizar a consulta a tabela \u2018tab\u2019 pelo grau de paralelismo \u2018degree\u2019 com \u2018inst\u2019 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 \u2018tab\u2019 em uma PQ entre produtores e consumidores. Os valors para \u2018out\u2019 (outer table) e \u2018in\u2019 (inner table) podem ser: hash, none, broadcast ou partition.
Noparallel(tab) \u2013 evita a paralelização do acesso a tabela \u2018tab\u2019
Noparallel_Index(tab) \u2013 evita o parallel index scan
3.7 Variados
Rewrite(v1[,v2]) \u2013 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 \u2013 não permite que a query seja reescrita
\ufffd
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
\ufffd
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(\u201810/10/2003\u2019,\u2018dd/mm/yyyy\u2019);
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(\u201810/10/2003\u2019,\u2018dd/mm/yyyy\u2019)
 and data < to_date(\u201810/10/2003\u2019,\u2018dd/mm/yyyy\u2019) + 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
\ufffd
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.
\ufffd
 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