Buscar mesmos dados com SQL diferente resultando em resposta muito mais rápida, não entendi a lógica.

SQL

29/07/2019

Olá meus amigos, estava fazendo uma pesquisa no BD e fiz o SQL de duas formas, seguem os exemplos:

select dado1, dado2, dado3, dado4 from tabela tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

Este primeiro é o padrão que eu deveria usar, então fiz este segundo sql:
select * from (select dado1, dado2, dado3, dado4 from tabela) as tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

O que não estou entendendo é que o segundo sql está retornando quase que instantaneamente enquanto o primeiro demora cerca de 4 minutos.
Alguém saberia me dizer o motivo pelo qual o segundo sql retorna mais rapidamente os dados?
Jonatas Teodoro

Jonatas Teodoro

Curtidas 0

Respostas

Matheus Luis

Matheus Luis

29/07/2019

Olá meus amigos, estava fazendo uma pesquisa no BD e fiz o SQL de duas formas, seguem os exemplos:

select dado1, dado2, dado3, dado4 from tabela tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

Este primeiro é o padrão que eu deveria usar, então fiz este segundo sql:
select * from (select dado1, dado2, dado3, dado4 from tabela) as tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

O que não estou entendendo é que o segundo sql está retornando quase que instantaneamente enquanto o primeiro demora cerca de 4 minutos.
Alguém saberia me dizer o motivo pelo qual o segundo sql retorna mais rapidamente os dados?


Provavelemente pq vc usou o * no select. O * faz retornar todos os campos e quando você os informa provavelmente pegara menos campos.
GOSTEI 0
Jonatas Teodoro

Jonatas Teodoro

29/07/2019

Olá meus amigos, estava fazendo uma pesquisa no BD e fiz o SQL de duas formas, seguem os exemplos:

select dado1, dado2, dado3, dado4 from tabela tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

Este primeiro é o padrão que eu deveria usar, então fiz este segundo sql:
select * from (select dado1, dado2, dado3, dado4 from tabela) as tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

O que não estou entendendo é que o segundo sql está retornando quase que instantaneamente enquanto o primeiro demora cerca de 4 minutos.
Alguém saberia me dizer o motivo pelo qual o segundo sql retorna mais rapidamente os dados?


Provavelemente pq vc usou o * no select. O * faz retornar todos os campos e quando você os informa provavelmente pegara menos campos.


Então.. é justamente o que eu uso o * que é mais rápido.

select * from (select dado1, dado2, dado3, dado4 from tabela) as tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

Esse me retorna muito mais rápido.
GOSTEI 0
Jothaz

Jothaz

29/07/2019

Como foi feita a medição de tempo?

Qual a diferença de tempo?

A tabela possui algum índice?

O srcipts são idênticos mesmo só alterando que o segundo busca de uma subquery?
GOSTEI 0
Jonatas Teodoro

Jonatas Teodoro

29/07/2019

A pesquisa é idêntica, não possui índices, a medição foi feita pelo SGBD que utilizamos, a diferença é notável, uns 3 minutos e meio, a que possui a subquery retorna "Instantaneamente" enquanto a outra retorna em uns 3 minutos e meio ou até 4 minutos.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/07/2019

só pra desencargo de consciência, tente assim:
select tb.dado1, tb.dado2, tb.dado3, tb.dado4 from tabela tb where tb.dado1="algo" and tb.dado2="algo" order by tb.dado3

ou assim:
select dado1, dado2, dado3, dado4 from tabela where dado1="algo" and dado2="algo" order by dado3

e qual a diferença destas para aquela que você postou?
na primeira estou selecionando todos os campos com indicação do nome/apelido da tabela, e na segunda não uso em nenhum campo (sequer dei um apelido pra tabela).
GOSTEI 0
Jothaz

Jothaz

29/07/2019

Essa medição foi feita no "back-end" ou em alguma IDE para banco de dados? Se for no "back-end" tenta rodar direto no BD.

Qual o banco de dados vc esta usando?

O servidor é de produção? Roda outros processos?

Trabalho com SQL a muito tempo e nunca vi nada parecido, inclusive subquery tende a ser menos performática.

Fiz um teste com 500.000 registros e o resultado foi idêntico.

GOSTEI 0
Jonatas Teodoro

Jonatas Teodoro

29/07/2019

Essa medição foi feita no "back-end" ou em alguma IDE para banco de dados? Se for no "back-end" tenta rodar direto no BD.

Qual o banco de dados vc esta usando?

O servidor é de produção? Roda outros processos?

Trabalho com SQL a muito tempo e nunca vi nada parecido, inclusive subquery tende a ser menos performática.

Fiz um teste com 500.000 registros e o resultado foi idêntico.



Foi feita no "back-end", usamos o Progress (Conexão ODBC), servidor de produção, servidor roda somente o banco.
GOSTEI 0
Jothaz

Jothaz

29/07/2019

Fiz uns testes aqui e com SQL Server, MariaDb e Oracle e os resultados foram idênticos, mas usei as IDE´s.

Nunca usei o Progress. então não posso opinar.

ODBC é de 32 ou 64?
GOSTEI 0
Jonatas Teodoro

Jonatas Teodoro

29/07/2019

Fiz uns testes aqui e com SQL Server, MariaDb e Oracle e os resultados foram idênticos, mas usei as IDE´s.

Nunca usei o Progress. então não posso opinar.

ODBC é de 32 ou 64?


É de 64
GOSTEI 0
Jothaz

Jothaz

29/07/2019

Realmente intrigante.
Vamos aguardar alguém com experiência em Progress se manifestar, mas pela minha vivência isto não faz muito sentido!

Eu faria os seguintes testes;

1 - Testaria em várias máquinas diferentes para verificar se o cenário se repete.
2 - Retirava todas as condições do Where e iria acrescentando aos poucos.
3 - Tentaria rodar diretamente no banco de dados, sei que as vezes isto não é possível.
4 - Se persistir o mesmo cenário, usaria o de melhor performance e me conformaria! kkkkkkkkkkkkkkkkkkk

GOSTEI 0
POSTAR