Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André Marcondes

performance na seleção de campos

Recommended Posts

Olá.

 

Recentemente, durante o desenvolvimento de uma aplicação, ao testar uma query, vi que ela solicitava do banco de dados varias colunas com dados que não seriam exibidos, isso de 2 tabelas diferentes, usando JOINS. Decidi então fazer com que apenas uma coluna de uma das tabelas fosse requisitada pela query, mas ao fazer isso, mesmo tendo os mesmos resultados, a query mostrou-se bem mais lenta do que o esperado. Na verdade, eu esperava que ele ficasse até mais rápida, afinal, estou selecionando apenas um campo, certo? Então deveria, teoricamente, ser mais leve, mas não foi isso que aconteceu. Alguém sabe me explicar o que acontece?

 

Grato desde já.

 

André Marcondes Teixeira.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não pois se uma das colunas removidas era chave de algum índice a query pode perder a eficiência.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, para uma query ficar eficiente eu posso fazer ela selecionar todas as chaves apenas?

 

Ex:

 

SELECT
   a.campoPK1,
   a.campoPK2,
   b.campoPK1,
   b.campoPK2,
   b.campoPK3
FROM
   tabela1 AS a,
   tabela2 AS b
WHERE
   a.campoPK1 = b.campoPK1 AND
   a.campoPK2 = b.campoPK2
ORDER BY
   b.campoPK3

 

Esta certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se possível use os campos que estão relacionados a índices, mas isto nem sempre é possível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imagine uma tabela assim

 

BOLETO
------
SEQUENCIAL
DATA_VENCIMENTO
CLIENTE
VALOR
...

 

e que seja preciso listar todos o boletos acima de x reais, não faz sentido criar um índice para isto (campo valor), será sempre um FULL TABLE SCAN.

 

===========================================================

Ainda em seu caso, imagime outra tabela

 

tabela
=======
campo1
campo2
campo3

 

tem o indice

(campo3,campo1)

 

mas o campo3 sempre vale "X"

 

a sql estava

 

select * from tabela where campo3="X" and campo1=<parametro>

a mesma foi "otimizada"

 

select * from tabela where campo1=<parametro>

 

perdeu o índice, logo ficou mais lenta.

 

De acordo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmm. Acho que entendi. Quer dizer que é sempre bom especificar os valores de índice quando possível, mesmo que o resultado seja o mesmo se não especificar, afinal o sql server vai ter de procurar os dados do mesmo jeito e quanto mais específica for a consulta, mais rápida ele fica, certo? :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.