Usuário com melhor resposta
Especificar Indice em Instrução Select

Pergunta
-
Respostas
-
Olá Pedro,
Pode fazer assim:
Code SnippetSELECT 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
-
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.
Todas as Respostas
-
Olá Pedro,
Pode fazer assim:
Code SnippetSELECT 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
-
-
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.
-
-
-