Clipper On Line • Ver Tópico - Trazendo string parcial

Trazendo string parcial

Discussão sobre SQL

Moderador: Moderadores

 

Trazendo string parcial

Mensagempor JoséQuintas » 20 Nov 2019 09:43

Tem uma coisa que eu não tinha pensado antes:

Tenho lá no browse

SELECT CDNOME, CDENDERECO FROM CLIENTES...

Mas na hora de mostrar, mostro Left( nome, 25 ) e Left( endereco, 25 )

Imagino que ficaria melhor/mais rápido assim:

SELECT LEFT( CDNOME, 25 ) AS NOME, LEFT( CDENDERECO, 25 ) AS ENDERECO FROM CLIENTES...

Imagino que, apesar de ter "cálculo", vai ser menos informação trafegando.
Estou certo?
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Trazendo string parcial

Mensagempor sygecom » 20 Nov 2019 13:14

Sim,para mim faz todo sentido, tenho alterado aos poucos algumas sintaxe xbase para uso SQL direto e tenho feito isso também.
Se já pode trazer tudo pronto e ordenado, melhor do que ficar consertando no xbase.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7017
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 133 vezes

Trazendo string parcial

Mensagempor tonicm » 20 Nov 2019 19:32

Sim, também uso assim.

Inclusive quando são dados de diversos campos, uso:
SELECT CONCAT(NUMERO, ' - ', REFERENCIA) AS Nome_Artigo
tonicm
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 55
Data de registro: 08 Mar 2016 21:51
Cidade/Estado: Porto
Curtiu: 12 vezes
Mens.Curtidas: 1 vez

Trazendo string parcial

Mensagempor JoséQuintas » 20 Nov 2019 20:39

O detalhe especial que mencionei é sobre cortar string.

SELECT NOME FROM CLIENTES

Mas vou usar num tbrowse, somente 25 caracteres

SELECT LEFT( NOME, 25 ) FROM CLIENTES

No TBrowse, de qualquer jeito vou usar Pad( nome, 25 ), porque pode vir menor que isso.

Não se trata de trazer pronto do MySQL, mas de economizar rede/internet pra transferir informação.
o Texto NÃO vai vir exatamente do tamanho que vou usar, mas não vou desperdiçar velocidade de transferência com excesso de informação inútil.

A dúvida é:
Estou reduzindo tempo e tamanho de comunicação...
Mas como saber quando isso é ruim para o servidor? (tempo do servidor).
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Trazendo string parcial

Mensagempor alaminojunior » 10 Dez 2019 20:48

Acredito que só num banco com uma massa muito grande de dados possa fazer essa aferição e chegar num veredicto.
Como serão menos bytes para transferir via rede,com certeza haverá economia de tempo, então essa questão está quitada.
Com relação ao "esforço" do servidor, eu costumo testar
(no heidisql) as sentenças antes de embutir no prg, sempre procurando trazer os dados no menor tempo possível. Às vezes um detalhezinho faz enorme diferença.

Não sei como o motor do banco trabalha, se ele pega cada campo e depois tira o pedaço (o que a princípio demanda mais esforço) ou só pega o pedaço requisitado ...
Boa pergunta !
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar de usuário

alaminojunior
Colaborador

Colaborador
 
Mensagens: 1689
Data de registro: 16 Dez 2005 20:26
Cidade/Estado: Ubatuba - SP
Curtiu: 27 vezes
Mens.Curtidas: 11 vezes

Trazendo string parcial

Mensagempor tonicm » 11 Dez 2019 08:06

Fiz um teste com uma bd com mais de 1 milhão de registos.
Ficou mais rápido com o left.

Retornar apenas os 3 primeiros carateres:
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,000 sec. (+ 1,593 sec. network) */
SELECT LEFT(m.N_SERIE,3)
FROM movimentos m
INNER JOIN movimentos_tipos t ON t.NUMERO=m.TIPO
;
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,015 sec. (+ 1,578 sec. network) */
SELECT LEFT(m.N_SERIE,3)
FROM movimentos m
INNER JOIN movimentos_tipos t ON t.NUMERO=m.TIPO
;
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,000 sec. (+ 1,515 sec. network) */
SELECT LEFT(m.N_SERIE,3)
FROM movimentos m
INNER JOIN movimentos_tipos t ON t.NUMERO=m.TIPO
;
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,000 sec. (+ 1,516 sec. network) */
SELECT LEFT(m.N_SERIE,3)
FROM movimentos m
INNER JOIN movimentos_tipos t ON t.NUMERO=m.TIPO
;


Retornar todos os dados do campo:
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,000 sec. (+ 1,516 sec. network) */
SELECT m.N_SERIE
FROM movimentos m
INNER JOIN movimentos_tipos t ON t.NUMERO=m.TIPO
;
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,000 sec. (+ 1,609 sec. network) */
SELECT m.N_SERIE
FROM movimentos m
INNER JOIN movimentos_tipos t ON t.NUMERO=m.TIPO
;
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,000 sec. (+ 1,609 sec. network) */
SELECT m.N_SERIE
FROM movimentos m
INNER JOIN movimentos_tipos t ON t.NUMERO=m.TIPO
;
/* Affected rows: 0  Found rows: 1.661.102  Warnings: 0  Duration for 1 query: 0,000 sec. (+ 1,610 sec. network) */
tonicm
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 55
Data de registro: 08 Mar 2016 21:51
Cidade/Estado: Porto
Curtiu: 12 vezes
Mens.Curtidas: 1 vez

Trazendo string parcial

Mensagempor JoséQuintas » 11 Dez 2019 08:39

/* Affected rows: 0 Found rows: 1.661.102 Warnings: 0 Duration for 1 query: 0,000 sec. (+ 1,593 sec. network) */
/* Affected rows: 0 Found rows: 1.661.102 Warnings: 0 Duration for 1 query: 0,000 sec. (+ 1,516 sec. network) */

Não entendi porque somente em um deles mostra 15 milésimos de segundo pro comando.

/* Affected rows: 0 Found rows: 1.661.102 Warnings: 0 Duration for 1 query: 0,015 sec. (+ 1,578 sec. network) */

Tá aí uma boa comparação com DBF
Processou 1.6 milhões de registros, trouxe 1.6 milhões de séries, e demorou 1.5 segundos pela rede.

Pra quem tem dúvida:
1.6 milhões x 3 caracteres x 8 bits = 38.4Mb... numa rede de 100Mb.... 1.5 segundos poderia até ser considerado demorado.

Agora vai processar 1.6 milhões de registros com DBF pra ver o que acontece.... nem faz diferença se é 1 caractere ou o registro inteiro...

E sem filtro, se trouxer só uma parte então... mais rápido ainda.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Trazendo string parcial

Mensagempor susviela@bol.com.br » 11 Dez 2019 09:38

tonicm escreveu:Tá aí uma boa comparação com DBF
Processou 1.6 milhões de registros, trouxe 1.6 milhões de séries, e demorou 1.5 segundos pela rede.

Pra quem tem dúvida:
1.6 milhões x 3 caracteres x 8 bits = 38.4Mb... numa rede de 100Mb.... 1.5 segundos poderia até ser considerado demorado.

Agora vai processar 1.6 milhões de registros com DBF pra ver o que acontece.... nem faz diferença se é 1 caractere ou o registro inteiro...

E sem filtro, se trouxer só uma parte então... mais rápido ainda.


Opa ........
Mas ai a tua comparação está meia injusta, esse processo em um SGBD (todos os índices, tabelas referênciadas, integridade referencial, usuário, permissões , e Tigers estão ativos e em processamento )
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 236
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 153 vezes
Mens.Curtidas: 24 vezes

Trazendo string parcial

Mensagempor JoséQuintas » 11 Dez 2019 10:50

susviela@bol.com.br escreveu:Mas ai a tua comparação está meia injusta, esse processo em um SGBD


Não está não.
O objetivo é justamente chamar a atenção para a diferença do uso da rede.

Na prática... é pior... esqueci desta parte:
Vamos considerar 10 terminais emitindo um relatório...
Num relatório de 15 minutos em DBF, os 10 terminais vão estar usando a rede durante os 15 minutos, consultando até o que não interessa, e um atrasando o outro.
Em SQL vai levar esses 1.5 segundos... significa que a rede vai ficar mais de 14 minutos totalmente livre, aguardando mais comandos SQL.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 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