none
Especificar Indice em Instrução Select RRS feed

  • Pergunta

  • Caros colegas;

     

    é possivel numa simples instrução de Select, especificar que indice gostaria de usar de uma determinada tabela se ela possuir mais de um indice?

     

    Pode me dar um exemplo de como fazer isso ?

     

    Estou usando MS Sql Server 2000.

    terça-feira, 11 de setembro de 2007 20:08

Respostas

  •  

    Olá Pedro,

     

    Pode fazer assim:

     

    Code Snippet

    SELECT Campos

    FROM SuaTabela WITH (INDEX (NomeDoIndice))

     

     

     

    Claro, tens que cuidar muito ao fazer a utilização desse recurso, que é chamado de hint (dica de consulta). O SQL possue um mecanismo muito complexo de consulta, chamado de otimizador de consulta. Passando um Hint, nós estamos desautorizando o otimizador. Basicamente, pode ficar mais lento, pois o SQL consegue (na maioria das vezes) selecionar qual a melhor opção de índice usar.

     

     

    Abraço

    terça-feira, 11 de setembro de 2007 20:20
  • Concordo totalmente com o Alexandre, eu nunca precisei usar este recurso.

    Eu pra falar a verdade nem recomendaria usar, no caso de uma view se estiver usando 2005, pode criar indices.

     

    Se sua clusula estiver lenta, da uma olhada no plano de execução, veja se não tem table scans, veja se está usando indices clustered (q são mais rapidos), e veja se mesmo usando clustered você nao tem nenhum Index Scan, embora mais rapidos que um table scan o ideal seria ter somente index seek.

     

    Note também que quando houver joins talves você tenha Bookmark Lookup, isto tb torna a cláusula mais lenta, mas ha situações que não temos como fugir.

     

    Para melhorar o plano de consulta e obter dados reais, tanto de compilação quanto de alocação de memória sempre use os comandos abaixo antes de rodar a query para analisar:

     

    DBCC DROPCLEANBUFFERS (Limpa os buffers de memória)

    DBCC FREEPROCCACHE (Limpa o cache de procedures, força a recompilação)

    Usando estes comandos você sempre terá um plano de consulta daquilo que realmente sua query/sp está fazendo.

     

    Em 90% dos casos de lentidão o problema é índice, note que não é recomendado a utilização de expressões como "<>" e "or" (tem outros mas essas são as mais viciantes), este tipo de instrução nas clusulas where acaba com sua estrutura de indices.

     

    Se você tiver FK's crie indices para eles.

     

    Veja como está a fragmentação de seus indices e se necessário reconstrua-os (cuidado para não parar seu banco enquanto os usuários estiverem usando).

     

    Depois disto tudo você pode tentar forçar o uso de um índice como está querendo, mas acho praticamente impossível conseguir um desempenho melhor do que o engine do SQL.

    terça-feira, 11 de setembro de 2007 20:42

Todas as Respostas

  •  

    Olá Pedro,

     

    Pode fazer assim:

     

    Code Snippet

    SELECT Campos

    FROM SuaTabela WITH (INDEX (NomeDoIndice))

     

     

     

    Claro, tens que cuidar muito ao fazer a utilização desse recurso, que é chamado de hint (dica de consulta). O SQL possue um mecanismo muito complexo de consulta, chamado de otimizador de consulta. Passando um Hint, nós estamos desautorizando o otimizador. Basicamente, pode ficar mais lento, pois o SQL consegue (na maioria das vezes) selecionar qual a melhor opção de índice usar.

     

     

    Abraço

    terça-feira, 11 de setembro de 2007 20:20
  • E se estivermos usando uma View ao invés de uma Tabela?

     

    terça-feira, 11 de setembro de 2007 20:23
  • Concordo totalmente com o Alexandre, eu nunca precisei usar este recurso.

    Eu pra falar a verdade nem recomendaria usar, no caso de uma view se estiver usando 2005, pode criar indices.

     

    Se sua clusula estiver lenta, da uma olhada no plano de execução, veja se não tem table scans, veja se está usando indices clustered (q são mais rapidos), e veja se mesmo usando clustered você nao tem nenhum Index Scan, embora mais rapidos que um table scan o ideal seria ter somente index seek.

     

    Note também que quando houver joins talves você tenha Bookmark Lookup, isto tb torna a cláusula mais lenta, mas ha situações que não temos como fugir.

     

    Para melhorar o plano de consulta e obter dados reais, tanto de compilação quanto de alocação de memória sempre use os comandos abaixo antes de rodar a query para analisar:

     

    DBCC DROPCLEANBUFFERS (Limpa os buffers de memória)

    DBCC FREEPROCCACHE (Limpa o cache de procedures, força a recompilação)

    Usando estes comandos você sempre terá um plano de consulta daquilo que realmente sua query/sp está fazendo.

     

    Em 90% dos casos de lentidão o problema é índice, note que não é recomendado a utilização de expressões como "<>" e "or" (tem outros mas essas são as mais viciantes), este tipo de instrução nas clusulas where acaba com sua estrutura de indices.

     

    Se você tiver FK's crie indices para eles.

     

    Veja como está a fragmentação de seus indices e se necessário reconstrua-os (cuidado para não parar seu banco enquanto os usuários estiverem usando).

     

    Depois disto tudo você pode tentar forçar o uso de um índice como está querendo, mas acho praticamente impossível conseguir um desempenho melhor do que o engine do SQL.

    terça-feira, 11 de setembro de 2007 20:42
  • Boa noite Pedro, algumas vezes é importante utilizar o hint, mas antes da sua utilização sempre

    utilize o Execution Plan, para verificar a real necessidade de utilizar ou não.

     

     

     

     

     

    Espero ter ajudado

    terça-feira, 11 de setembro de 2007 21:12
  •  

    Rick,

     

    Descrição perfeita. Deu gosto de ler. Parabéns.

     

     

    Grande abraço

    quarta-feira, 12 de setembro de 2007 01:53
  • Opa, vlw

     

    Abraço.

    quarta-feira, 12 de setembro de 2007 13:22