Página 1 de 1

Qual é mais rápido?

Enviado: 26 Jan 2020 16:36
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

Qual é mais rápido?

Enviado: 26 Jan 2020 16:51
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.

Qual é mais rápido?

Enviado: 26 Jan 2020 17:32
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.

Qual é mais rápido?

Enviado: 27 Jan 2020 08:47
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);