Tabela Dual
Olá Pessoal,
Vou falar um pouco sobre a tabela dual, para que ela serve e como ela vem otimizada na versão 10g.
A tabela Dual é muito utilizada pelos desenvolvedores, DBAs e pela própria Oracle para fazer operações com select aonde não é necessário fazer extração de dados em tabelas. Basicamente ela ajuda a manter a sintaxe correta de um select aonde não teremos uma tabela na consulta.
Observem a consulta abaixo executada no 9i
SQL> SELECT SYSDATE 2 FROM dual; 1 row selected.
Execution Plan
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=8168) 1 0 TABLE ACCESS (FULL) OF 'DUAL' (Cost=5 Card=8168)
Statistics
1 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 194 bytes sent via SQLNet to client 341 bytes received via SQLNet from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
Agora vamos executar a mesma consulta no 10g
SQL> set autotrace traceonly SQL> SELECT SYSDATE 2 FROM dual; 1 row selected.
Execution Plan
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1) 1 0 FAST DUAL (Cost=2 Card=1)
Statistics
1 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 203 bytes sent via SQLNet to client 342 bytes received via SQLNet from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
Na consulta efetuada no 9i vemos um “access Full” na tabela dual, e nas estastisticas aparecem 3 “consistent gets” do qual os dba´s tentam se livrar utilizanos várias técnicas que agora com a versão 10g se tornaram dispensáveis. Na consulta realizada no 10g não há “consistent gets” e o custo é mais baixo.