Como usar o índice na instrução select?

97

Digamos que na tabela de funcionários, criei um índice (idx_name) na emp_namecoluna da tabela.

Preciso especificar explicitamente o nome do índice na cláusula select ou ele será usado automaticamente para acelerar as consultas.

Se for necessário especificá-lo na cláusula select, qual é a sintaxe para usar o índice na consulta selecionada?

Vivek
fonte

Respostas:

86

Se você deseja testar o índice para ver se funciona, aqui está a sintaxe:

SELECT *
FROM Table WITH(INDEX(Index_Name))

A instrução WITH forçará o índice a ser usado.

Jason
fonte
82
Esta postagem não responde à pergunta. A resposta é, em resumo: você não precisa especificar o índice na consulta. É usado (ou não) de forma automática. Você pode forçá-lo, no entanto. Mais detalhes (quando e por que fazer isso) em outros posts abaixo.
Rast
34

Boa pergunta,

Normalmente, o mecanismo de banco de dados deve selecionar automaticamente o índice a ser usado com base nos planos de execução de consulta que cria. No entanto, existem alguns casos bastante raros em que você deseja forçar o banco de dados a usar um índice específico.

Para responder à sua pergunta específica, você deve especificar o banco de dados que está usando.

Para MySQL, você deseja ler a documentação da sintaxe de dicas de índice sobre como fazer isso

Tudor Constantin
fonte
30

Como usar o índice na instrução select?
deste jeito:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

E muitas outras maneiras de verificar isso

Eu preciso especificar explicitamente?

  • Não, não é necessário especificar explicitamente.
  • O mecanismo de banco de dados deve selecionar automaticamente o índice a ser usado com base nos planos de execução de consulta que constrói a partir da resposta de @Tudor Constantin.
  • O otimizador julgará se o uso de seu índice tornará sua consulta mais rápida e, se for, usará o índice. de @niktrl resposta
VdeX
fonte
13

Em geral , o índice será usado se o custo presumido de uso do índice e, possivelmente, de realizar mais pesquisas de favoritos for menor do que o custo de apenas digitalizar a tabela inteira.

Se sua consulta for do formulário:

SELECT Name from Table where Name = 'Boris'

E 1 linha em 1000 tem o nome Boris, é quase certo que será usado. Se o nome de todos for Boris, provavelmente recorrerá a uma varredura de tabela, já que o índice dificilmente será uma estratégia mais eficiente para acessar os dados.

Se for uma tabela ampla (muitas colunas) e você:

SELECT * from Table where Name = 'Boris'

Em seguida, ele ainda pode escolher realizar a verificação da tabela, se for uma suposição razoável de que levará mais tempo para recuperar as outras colunas da tabela do que apenas para pesquisar o nome, ou novamente, se for provável que recupere um muitas linhas de qualquer maneira.

Damien_The_Unbeliever
fonte
9

O otimizador julgará se o uso de seu índice tornará sua consulta mais rápida e, se for, usará o índice.

Dependendo do seu RDBMS, você pode forçar o uso de um índice, embora não seja recomendado, a menos que você saiba o que está fazendo.

Em geral, você deve indexar colunas que você usa em junções de tabela e instruções where

Niktrs
fonte
5

Ao usar a coluna à qual o índice é aplicado nas suas condições, ele será incluído automaticamente. Você não precisa usá-lo, mas ele irá acelerar as consultas quando for usado.

SELECT * FROM TABLE WHERE attribute = 'value'

Usará o índice apropriado.

ChrisBint
fonte
5

Geralmente, quando você cria um índice em uma tabela, o banco de dados usará automaticamente esse índice enquanto procura dados nessa tabela. Você não precisa fazer nada a respeito.

No entanto, no MSSQL, você pode especificar um index hintque pode especificar que um determinado índice deve ser usado para executar esta consulta. Mais informações sobre isso podem ser encontradas aqui .

Index hinttambém parece estar disponível para MySQL . Graças a Tudor Constantine.

MD Sayem Ahmed
fonte
1

A dica de índice está disponível apenas para servidores de banco de dados do Microsoft Dynamics. Para o SQL Server tradicional, os filtros que você define em sua cláusula 'Where' devem persuadir o mecanismo a usar quaisquer índices relevantes ... Desde que o plano de execução do mecanismo possa identificar com eficiência como ler as informações (seja uma verificação completa da tabela ou uma verificação indexada ) - ele deve comparar os dois antes de executar a instrução adequada, como parte de seu otimizador de desempenho integrado.

No entanto, você pode forçar o otimizador a fazer a varredura usando algo como

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Ou para buscar um índice específico usando algo como

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

A escolha é sua. Observe as propriedades do índice da tabela no painel de objetos para ter uma ideia de qual índice deseja usar. Deve corresponder ao (s) seu (s) filtro (s).

Para melhores resultados, liste os filtros que retornariam o menor número de resultados primeiro. Não sei se estou certo em dizer, mas parece que os filtros de consulta são sequenciais; se você acertar a sequência, o otimizador não deve ter que fazer isso por você, comparando todas as combinações, ou pelo menos não começar a comparação com as consultas mais caras.

Cory
fonte