Qual é mais rápido?

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Qual é mais rápido?

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Qual é mais rápido?

Mensagem por JoséQuintas »

Comparando com DBF:

O primeiro seria algo do tipo

Código: Selecionar todos

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

Código: Selecionar todos

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Qual é mais rápido?

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Qual é mais rápido?

Mensagem por bencz »

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:

Código: Selecionar todos

CREATE FULLTEXT INDEX IDX_JPTRANSA ON JPTRANSA(TRREACAO);
Imagem
Responder