Clipper On Line • Ver Tópico - Qual é mais rápido?

Qual é mais rápido?

Discussão sobre SQL

Moderador: Moderadores

 

Qual é mais rápido?

Mensagempor JoséQuintas » 26 Jan 2020 16:36

Não testei, apenas imagino que seja mais rápido.
Tenho lá na transação a configuração do que se trata: VENDA,COMPRA,etc. mas sem lugar definido, pode ser em qualquer posição

Comecei usando assim: transação com o texto, direto no pedido

SELECT IDPEDIDO FROM JPPEDIDO
LEFT JOIN JPTRANSA ON JPTRANSA.IDTRANSA = JPPEDIDO.PDTRANSA
WHERE JPTRANSA.TRREACAO LIKE '%VENDA%'

Mas pensando bem.... porque não já trazer todos os códigos de transação referente a venda?

SELECT IDPEDIDO FROM PEDIDO
WHERE PDTRANSA IN ( SELECT IDTRANSA FROM JPTRANSA WHERE TRREACAO LIKE '%VENDA%'" )

Qual a diferença?

No primeiro caso, eu tenho que pesquisar cada transação, pra saber se é o que eu quero.

No segundo caso, eu pego uma lista de todas que quero, e apenas vejo se o código nos pedidos está na lista.

ACHO que o segundo é mais rápido, já que pesquisa transações uma única vez.
Na prática nem sei a diferença, porque o servidor agiliza muita coisa.

Talvez possa fazer diferença conforme o tipo de banco de dados.

Por enquanto fica aí como uma possibilidade, a mesma coisa de dois jeitos diferentes.

Notas:
- É parecido com o que usei pra selecionar CNPJ matriz/filial.
- Os dois funcionam
- Criar uma lista pelo Harbour.... nem precisa, o próprio comando já pode fazer isso
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Qual é mais rápido?

Mensagempor JoséQuintas » 26 Jan 2020 16:51

Comparando com DBF:

O primeiro seria algo do tipo

USE JPTRANSA NEW INDEX JPTRANSA 
USE JPPEDIDO NEW
SET RELATION TO PDTRANSA INTO JPTRANSA
LIST FOR "VENDA" $ JPTRANSA->TRREACAO


o segundo, seria algo como primeiro criar uma lista

USE JPPEDIDO
LIST FOR ASCan( { lista }, PDTRANSA ) != 0


Em DBF, trabalhar só com um arquivo vai ser mais rápido do que os dois, pesquisando cada transação.
Em SQL, pelo menos no MySQL, parece não fazer muita diferença.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Qual é mais rápido?

Mensagempor JoséQuintas » 26 Jan 2020 17:32

Uma coisa que gostei, mas só tem no MySQL 8, é o uso de CTE - Common Table Expression

WITH
LISTA AS ( SELECT IDTRANSA FROM JPTRANSA WHERE TRREACAO LIKE '%VENDA%' )
SELECT IDPEDIDO FROM JPPEDIDO WHERE PDTRANSA IN ( LISTA )

É a mesma coisa que antes, mas o comando parece mais "legível".

Lembram que já comentei:

As mudanças das linguagens de programação vém pra tornar as coisas mais "humanas".
É um recurso novo do MySQL 8, mas de certa forma é só um jeito de facilitar a "leitura humana".

Provavelmente já existe em outras bases de dados, talvez até no MariaDB.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Qual é mais rápido?

Mensagempor bencz » 27 Jan 2020 08:47

Bom dia José!
É um fato conhecido, que se você utiliza a clausula "IN" com um grande numero de parâmetros, a query fica muito lenta... mas, se você utilizar o IN junto com uma sub-query ( que é o que você está fazendo ), a velocidade se torna muito, mas, muito maior...
O que vai afetar mesmo a sua query, é o "LIKE", isso enforca o gerenciador do banco de dados, pois isso obriga o sistema a pesquisar todas as linhas do seu banco de dados e analisar absolutamente TODOS os caracteres da sua coluna string.
Isso afeta somente o caso de LIKE "%<string>%", se o seu like fosse dessa maneira, LIKE "<string>%", bastaria criar um index comum na coluna.
Para otimizar a pesquisa com LIKE na sua tabela, utilize essa técnica: https://mariadb.com/kb/en/full-text-indexes/

É bem simples criar esse index, veja:

CREATE FULLTEXT INDEX IDX_JPTRANSA ON JPTRANSA(TRREACAO);
Imagem
Avatar de usuário

bencz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 517
Data de registro: 28 Abr 2012 17:36
Curtiu: 6 vezes
Mens.Curtidas: 34 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro