Buscar mesmos dados com SQL diferente resultando em resposta muito mais rápida, não entendi a lógica.
Olá meus amigos, estava fazendo uma pesquisa no BD e fiz o SQL de duas formas, seguem os exemplos:
Este primeiro é o padrão que eu deveria usar, então fiz este segundo sql:
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?
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
Curtidas 0
Respostas
Matheus Luis
29/07/2019
Olá meus amigos, estava fazendo uma pesquisa no BD e fiz o SQL de duas formas, seguem os exemplos:
Este primeiro é o padrão que eu deveria usar, então fiz este segundo sql:
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?
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
29/07/2019
Olá meus amigos, estava fazendo uma pesquisa no BD e fiz o SQL de duas formas, seguem os exemplos:
Este primeiro é o padrão que eu deveria usar, então fiz este segundo sql:
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?
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
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?
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
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
29/07/2019
só pra desencargo de consciência, tente assim:
ou assim:
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).
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
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.
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
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.
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
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?
Nunca usei o Progress. então não posso opinar.
ODBC é de 32 ou 64?
GOSTEI 0
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?
Nunca usei o Progress. então não posso opinar.
ODBC é de 32 ou 64?
É de 64
GOSTEI 0
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
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