[firebase-br] Melhor opção para Select

Gabriel Bonzanini gabriel.bonzanini em gmail.com
Sex Jan 11 17:54:31 -03 2019


Boa tarde Cantu!

Gostei da sua análise, mas fiquei com uma dúvida: você mencionou que o
Firebird não tem como "enfiar" o where na procedure; Quando estamos falando
de views, isso é possível?

Exemplo: digamos que o select da view "crua" (sem where) retorne 1.000
registros, e o where adicionado externamente limite o resultado a 10
registros; A performance será a mesma se eu copiar o select que está
contido na view e adicionar o where ao mesmo?

Abraço.



Em qui, 10 de jan de 2019 às 16:38, Carlos H. Cantu <listas em warmboot.com.br>
escreveu:

> EJ> (Estou meio sumido... mas lá vão meus 0.02C)
>
> Bem vindo de volta :-)
>
> []s
> Carlos H. Cantu
> eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
> www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br
>
> EJ> (Estou meio sumido... mas lá vão meus 0.02C)
>
>
> EJ> Existem muitas coisa em jogo nesta discussão... cache hit/miss,
> EJ> velocidade e latência de rede, quantidade de memória tanto no
> EJ> cliente quanto nos servidores de banco e aplicação... então nunca
> existe uma resposta fácil...
>
>
>
> EJ> Mas algumas métricas ajudam...
>
> EJ> A pior coisa que existe é trafegar coisas numa rede lenta, depois
> EJ> ler coisas do disco (especialmente quando os discos são lentos)...
> EJ> então existem muitas aplicações com níveis (tamanhos/locais/
> EJ> prioridades e técnicas diferentes) de cache... O protocolo/formato
> EJ> utilizado para transportar os dados, muitas vezes pode ter um
> EJ> impacto extremamente agressivo (seja positivo quanto negativo).
>
>
>
> EJ> Lembre-se que "geralmente" CPU é barato e abundante...
>
>
>
>
> EJ> Mas pense comigo...
>
>
> EJ> - Quanto menos dados sua consulta retornar, menos CPU e tráfego
> EJ> de rede serão necessário entre o servidor de banco e o servidor de
> EJ> aplicação, e menos memória será necessário em todos os locais.
>
> EJ> - Quanto mais requisições buscarem o mesmo range de dados, maior será
> CACHE HIT.
> EJ> - Requisições muito pequenas dificilmente terão um bom CACHE HIT
> EJ> (exceto se sempre serão poucos usuários/processos concorrentes),
> EJ> requisições muito grandes podem não compensar o OVERHEAT.
> EJ> - Algumas consultas exigem dados de várias tabelas, com
> EJ> diferentes níveis de dependência. fazer tudo numa única consulta
> EJ> SQL pode "literalmente" deixar a performance do banco pobre. fazer
> EJ> tudo no servidor de aplicação irá desperdiçar as maiores vantagens e
> recursos do SGDB.
> EJ> - Views simples raramente representam ganhos perceptíveis na
> EJ> performance... wheres complexas podem forçar um FULL-SCAN piorando a
> resposta...
> EJ> - select from procedures para consultas extremamente simples
> EJ> podem não compensar o custo (da performance, mas talvez ajude na
> EJ> padronização e qualidade)... mas talvez permitam consultas com índices
> ótimos pela segmentação.
> EJ> - é relativamente mais fácil medir a performance do banco de
> EJ> dados (e criar/dropar índices, refatorar tabelas e procedures) do
> EJ> que monitorar gargalos num servidor de aplicação.
>
>
>
> EJ> Se tudo (cliente, aplicação e banco de dados) estiver num único
> EJ> computador, 80% destas considerações serão inúteis. Se forem web,
> EJ> latência e banda contam muito, se for rede local é um pouco menos
> crítico.
>
>
>
>
>
>
> EJ> ==========================
> EJ> Eduardo Jedliczka
> EJ> Curitiba - Pr
> EJ> ==========================
>
>
> EJ> Em qui, 10 de jan de 2019 às 11:18, Carlos H. Cantu
> EJ> <listas em warmboot.com.br> escreveu:
>
> EJ> Qualquer comando SQL será processado no servidor, e não no cliente.
>
> EJ>  Opção 1) Somente 3 campos sendo trafegados entre servidor e cliente,
> EJ>  quanto menos trafego, mais rapido obtem-se o retorno total dos dados
> EJ>  no cliente.
>
> EJ>  Opção 2) Também somente 3 campos sendo trafegados, mas nesse exemplo,
> EJ>  vc colocou um WHERE que provavelmente restringirá o número de
> EJ>  registros retornados, portanto, menos trafego.
>
> EJ>  Opção 3) Se tivesse colocado o WHERE no select (como no exemplo 2), a
> EJ>  performance seria um pouco pior, já que o Firebird não teria a
> EJ>  capacidade de "enfiar" o WHERE no select que está dentro da procedure.
> EJ>  Não vejo vantagem no uso de procedure nesse exemplo.
>
> EJ>  Tem outras coisas a serem analisadas, e o exemplo usado nas 3 opções
> EJ>  não é o mesmo... duas não tem where, uma tem... isso torna difícil
> EJ>  fazer uma comparação justa. A decisão de usar procedures e views não
> EJ>  deve ser tomada apenas se baseando em consumo de recursos... tem
> EJ>  muitos outros fatores que podem influenciar mais essa decisão do que o
> EJ>  próprio fator "consumo"... por exemplo, controle de acessos, etc.
>
> EJ>  []s
> EJ>  Carlos H. Cantu
> EJ>  eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
> EJ> www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br
>
>  CA>> Olá a todos! Depois de umas aulas sobre administração de banco de
> dados
>  CA>> na faculdade, surgiu a curiosidade em pesquisar mais sobre como
> melhorar
>  CA>> a performance do Servidor durante as consultas ao Firebird. Minha
> dúvida
>  CA>> é a seguinte: Qual é a forma mais apropriada e que utilize menos
>  CA>> recursos de processamento e memória ao realizar Select na aplicação
> da
>  CA>> máquina cliente? O "Select" é melhor ficar na Aplicação, criar uma
>  CA>> "View" ou "Stored Procedure"? Das situações que tenho em mente e que
>  CA>> venho testando, qual destas seria a melhor opção?
>
>  CA>> Opção 1:
>  CA>> Na Aplicação: " select ID, NOME, CPF from TB_CLIENTES "
>  CA>> (Neste caso, é verdade que o processamento é feito mais na máquina
>  CA>> cliente, economizando recursos no Servidor?)
>
>  CA>> Opção 2:
>  CA>> Na Aplicação: " select ID, NOME, CPF from VW_CLIENTES where (NOME
>  CA>> starting with 'CARLOS') "
>  CA>> No Servidor: VW_CLIENTES  -> "select ID, NOME, DATA_NASC, SEXO, RG,
> CPF,
>  CA>> FONE1, FONE2 from TB_CLIENTES"
>  CA>> (Neste caso, o fato de que a View esteja selecionando 8 campos e na
>  CA>> Aplicação somente 3 campos e com filtro, haveria processamento
>  CA>> desnecessário no Servidor?)
>
>  CA>> Opção 3:
>  CA>> Na Aplicação: " select ID, NOME, CPF from SP_CLIENTES "
>  CA>> No Servidor: SP_CLIENTES  -> "select ID, NOME, DATA_NASC, SEXO, RG,
> CPF,
>  CA>> FONE1, FONE2 from TB_CLIENTES"
>  CA>> (Neste caso, a SP utiliza mais, menos ou o mesmo recurso de
>  CA>> processamento que uma View? É mais adequado ou não?)
>
>  CA>> Existe mais alguma opção que seria mais apropriado que essas três,
>  CA>> visando claro menos utilização de recurso e processamento do
> Servidor?
>
>
> EJ>  ______________________________________________
> EJ>  FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> EJ>  Para saber como gerenciar/excluir seu cadastro na lista, use:
> EJ> http://www.firebase.com.br/fb/artigo.php?id=1107
> EJ>  Para consultar mensagens antigas:
> EJ> http://www.firebase.com.br/pesquisa_lista.html
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>



Mais detalhes sobre a lista de discussão lista