AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 197
Accepted
Andrew Barber
Andrew Barber
Asked: 2011-01-05 10:48:09 +0800 CST2011-01-05 10:48:09 +0800 CST 2011-01-05 10:48:09 +0800 CST

Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • 772

De certa forma, já sei a resposta para essa pergunta, mas sempre sinto que preciso aprender mais sobre o assunto.

Meu entendimento básico é que, de um modo geral, um único índice que inclui apenas todos os campos que você pode consultar/classificar em um determinado momento provavelmente não será útil, mas já vi esse tipo de coisa. Alguém pensou: "Bem, se apenas colocarmos tudo isso em um índice, o banco de dados pode usá-lo para encontrar o que precisa", sem nunca ter visto um plano de execução para algumas das consultas reais sendo executadas.

Imagine uma tabela assim:

id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime

Posso ver um único índice incluindo os campos name, customerIde .dateCreated

Mas meu entendimento é que tal índice não seria utilizado em uma consulta como, por exemplo:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

Para tal consulta, parece-me que uma ideia melhor seria um índice incluindo os campos customerIde , com o campo sendo 'primeiro'. Isso criaria um índice que teria os dados organizados de forma que essa consulta pudesse encontrar rapidamente o que precisa - na ordem em que precisa.dateCreatedcustomerId

Outra coisa que vejo, talvez com tanta frequência quanto a primeira, são os índices individuais em cada campo; então, um em cada namee customerIdcampos dateCreated.

Ao contrário do primeiro exemplo, esse tipo de arranjo me parece às vezes pelo menos parcialmente útil; o plano de execução da consulta pode mostrar que pelo menos está usando o índice no customerIdpara selecionar os registros, mas não está usando o índice com o dateCreatedcampo para ordená-los.


Eu sei que esta é uma pergunta ampla, porque a resposta específica para qualquer consulta específica em qualquer conjunto específico de tabelas geralmente é ver o que o plano de execução diz que fará e, caso contrário, levar em consideração as especificidades da(s) tabela(s) e consultas conta. Além disso, sei que depende da frequência com que uma consulta pode ser executada, em oposição à sobrecarga de manter um índice específico para ela.

Mas suponho que o que estou perguntando é como um 'ponto de partida' geral para índices, a ideia de ter índices específicos para consultas específicas e frequentes e os campos nas cláusulas WHERE ou ORDER BY faz sentido?

sql-server index
  • 2 2 respostas
  • 2689 Views

2 respostas

  • Voted
  1. Best Answer
    David Spillett
    2011-01-05T11:23:31+08:002011-01-05T11:23:31+08:00

    Você está certo em que sua consulta de exemplo não usaria esse índice.

    O planejador de consulta considerará o uso de um índice se:

    • todos os campos contidos nele são referenciados na consulta
    • alguns dos campos a partir do início são referenciados

    Não poderá fazer uso de índices que comecem com um campo não utilizado pela consulta.

    Então, para o seu exemplo:

    SELECT [id], [name], [customerId], [dateCreated]
       FROM Representatives WHERE customerId=1 
       ORDER BY dateCreated
    

    consideraria índices como:

    [customerId]
    [customerId], [dateCreated]
    [customerId], [dateCreated], [name]
    

    mas não:

    [name], [customerId], [dateCreated]
    

    Se encontrasse ambos [customerId]e [customerId], [dateCreated], [name]sua decisão de preferir um sobre o outro dependeria das estatísticas do índice, que dependem de estimativas do saldo de dados nos campos. Se [customerId], [dateCreated]fosse definido, ele deveria preferir isso aos outros dois, a menos que você dê uma dica de índice específica em contrário.

    Também não é incomum ver um índice definido para cada campo em minha experiência, embora isso raramente seja ideal, pois o gerenciamento extra necessário para atualizar os índices na inserção/atualização e o espaço extra necessário para armazená-los são desperdiçados quando metade do eles podem nunca ser usados ​​- mas, a menos que seu banco de dados veja cargas pesadas de gravação, o desempenho não será ruim, mesmo com os índices em excesso.

    Índices específicos para consultas frequentes que, de outra forma, seriam lentos devido à verificação de tabela ou índice geralmente são uma boa ideia, embora não exagere, pois você pode trocar um problema de desempenho por outro. Se você definir [customerId], [dateCreated]como um índice, por exemplo, lembre-se de que o planejador de consulta poderá usá-lo para consultas que usariam um índice apenas [customerId]se presente. Embora usar apenas [customerId]seja um pouco mais eficiente do que usar o índice composto, isso pode ser mitigado ao acabar tendo dois índices competindo por espaço na RAM em vez de um (embora se todo o seu conjunto de trabalho normal se encaixar facilmente na RAM, essa competição de memória extra pode não ser um problema).

    • 28
  2. BradC
    2011-01-11T15:40:48+08:002011-01-11T15:40:48+08:00

    Para responder à sua pergunta original, sim, os índices devem ser projetados em torno das consultas , não apenas da tabela . A ordem dos campos no índice é de vital importância. Projetar um único índice para ser ideal para várias consultas é mais difícil e você terá que fazer compensações.

    Em relação ao seu segundo ponto, sim, um monte de índices em campos individuais é irritantemente comum. Eu vejo isso o tempo todo em meu ambiente e geralmente é um sinal de alerta para mim que a equipe de desenvolvimento não trabalhou com um DBA para projetar índices adequados.

    Minha estratégia para criar índices é indexar:

    • Campos usados ​​em WHERE (em ordem de seletividade)
    • Campos usados ​​em ORDER BY
    • Incluir outros campos (se necessário) para fazer um índice de cobertura

    Então, para o seu exemplo:

    SELECT [id], [name], [customerId], [dateCreated]
       FROM Representatives WHERE customerId=1 
       ORDER BY dateCreated
    

    Eu provavelmente criaria um índice em (CustomerID, dateCreated) INCLUDE (id, name). Esse índice de cobertura significa que a consulta nunca precisa atingir a tabela original, melhorando muito o desempenho.

    Este exemplo é quase simples demais , no entanto. Um índice ingênuo em apenas (CustomerID) funcionaria quase tão bem (supondo que cada cliente tenha apenas um único representante, portanto, apenas uma única pesquisa de marcador na tabela será necessária). Também pode ser benéfico fazer um índice clusterizado em (CustomerID, ID), dependendo de quais outras consultas são executadas na tabela.

    • 6

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Como determinar se um Índice é necessário ou necessário

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve