is null performance
-
- Rank: Programador Júnior
- Mensagens: 28
- Registrado em: Sex, 09 Dez 2005 9:17 am
- Localização: Itajai-SC
_______________________________________
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
alguém saberia me explicar porque o uso do 'is null' em uma consulta SQL diminui bastante a performance do banco, fazendo uso excessivo do processador?
- dr_gori
- Moderador
- Mensagens: 5024
- Registrado em: Seg, 03 Mai 2004 3:08 pm
- Localização: Portland, OR USA
- Contato:
Thomas F. G
Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered
Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered
Eu posso estar enganado, mas que eu saiba, o NULL não entra nos índices. Tipo, o oracle só coloca no índice valores NOT NULL. Por isso, quando você busca os NULL, ele tem que fazer um FULL SCAN...
Alguém sabe se minha resposta confere ?
Esse é um bom tema pra discussão aqui!...
Alguém sabe se minha resposta confere ?
Esse é um bom tema pra discussão aqui!...
-
- Rank: Programador Júnior
- Mensagens: 28
- Registrado em: Sex, 09 Dez 2005 9:17 am
- Localização: Itajai-SC
_______________________________________
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
Realmente eu tinha muito interesse em saber sobre isso...
e como será que a gente consegue resolver isso?
e como será que a gente consegue resolver isso?
-
- Rank: DBA Sênior
- Mensagens: 372
- Registrado em: Ter, 24 Jan 2006 3:33 pm
- Localização: Palmas - TO
- Contato:
Talvez este link http://www.dba-oracle.com/oracle_tips_null_idx.htm possa ajudar. Outra coisa, eu costumo criar minhas colunas com um valor default.
Gilberto
Gilberto
-
- Rank: Programador Júnior
- Mensagens: 28
- Registrado em: Sex, 09 Dez 2005 9:17 am
- Localização: Itajai-SC
_______________________________________
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
sim...eu tb crio as minhas colunas sempre com default.
o que eu quero dizer é o seguinte
ex:
entendeu?
como eu faço pra otimizar isto?
o que eu quero dizer é o seguinte
ex:
select * from teste
where
(campo1 = :parametro1 or :parametro1 is null)
como eu faço pra otimizar isto?
-
- Rank: DBA Sênior
- Mensagens: 372
- Registrado em: Ter, 24 Jan 2006 3:33 pm
- Localização: Palmas - TO
- Contato:
select * from teste
where
(campo1 = :parametro1 or :parametro1 is null)
nomedacouluna = :parametro
Acho que nenhum driver jdbc ira reconhecer somente este comando :parametro. você quer montar uma sql dinamica passando a coluna que você precisa usar?
Como você viu, não!entendeu?
- dr_gori
- Moderador
- Mensagens: 5024
- Registrado em: Seg, 03 Mai 2004 3:08 pm
- Localização: Portland, OR USA
- Contato:
Thomas F. G
Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered
Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered
Esse comando é bem comum sim, quando se tem parâmetros opcionais.gilbertoca escreveu:Este comando não está errado?
Exemplo:
Todos registros da EMP:
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> var vjob varchar2(20)
SQL> select * from emp where job = :vjob;
no rows selected
Como VJOB está nulo, tem que trazer tudo da tabela.
SQL> select * from emp where (job = :vjob or :vjob is null);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> begin
2 :vjob :='SALESMAN';
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> select * from emp where (job = :vjob or :vjob is null);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
4 rows selected.
SQL>
Acho que pra resolver o problema do nosso amigo, temos que descobrir se a coluna dele tem índice, se as estatísticas do banco foram coletadas recentemente, os outros relacionamentos da tabela, etc...
Acho que um trace ajudaria a saber qual é o join que está lento.
-
- Rank: Programador Júnior
- Mensagens: 28
- Registrado em: Sex, 09 Dez 2005 9:17 am
- Localização: Itajai-SC
_______________________________________
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
Thiago Antonio
SCJP - Sun Certified Java Programer
SCJA - Sun Certified Java Associate
na verdade, o problema é sempre com os is nulll....se você fizer um teste ira verificar a diferença que acontece no banco.
Eu gostaria de saber o porque disso? e como eu resolveria
Eu gostaria de saber o porque disso? e como eu resolveria
-
- Rank: DBA Sênior
- Mensagens: 372
- Registrado em: Ter, 24 Jan 2006 3:33 pm
- Localização: Palmas - TO
- Contato:
Pode usar bastante recurso do banco e causar um problemão para fazer tunning. Bom, é a opnião de um newbie !Esse comando é bem comum sim, quando se tem parâmetros opcionais.
Para mim neste comando,
SQL> select * from emp where (job = :vjob or :vjob is null);
SQL> select * from emp where (job = null or null is null);
falso verdadeiro
select * from emp where (job = null or 1=1);
select * from emp where (1=1);
Ao passo que
SQL> select * from emp where (job = :vjob or :vjob is null);
SQL> select * from emp where (job = 'SALESMAN' or SALESMAN is null);
verdadeiro falso
vjob := 'SALESMAN'.
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 24 visitantes