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 / 33732
Accepted
Kahn
Kahn
Asked: 2013-01-30 03:43:25 +0800 CST2013-01-30 03:43:25 +0800 CST 2013-01-30 03:43:25 +0800 CST

Qual é o efeito de substituir índices por índices filtrados (valor não nulo)?

  • 772

Nosso projeto executa um banco de dados muito grande e muito complicado. Então, cerca de um mês atrás, notamos que o espaço usado por colunas indexadas contendo valores nulos estava ficando muito grande. Como resposta a isso, escrevi um script que pesquisaria dinamicamente todos os índices de coluna única contendo mais de 1% de valores nulos e, em seguida, eliminaria e recriaria esses índices como índices filtrados com a condição de que o valor NÃO fosse NULO. Isso eliminaria e recriaria centenas de índices em todo o banco de dados e normalmente liberaria quase 15% do espaço usado por todo o banco de dados.

Agora tenho duas perguntas sobre isso:

A) Quais são as desvantagens de usar índices filtrados dessa maneira? Eu diria que isso apenas melhoraria o desempenho, mas há algum risco de desempenho envolvido?

B) Recebemos erros ( 'não é possível descartar o índice XYZ porque ele não existe ou você não tem permissão' ) ao descartar e recriar os índices, mesmo quando verificados posteriormente, tudo ocorreu exatamente como esperado. Como isso pode acontecer?

Obrigado por qualquer ajuda!

Editar: Em resposta a @Thomas Kejser

Oi e obrigado, mas acontece que isso foi um desastre. Na época não entendíamos várias coisas como:

  1. Durante uma consulta, o SQLOS faz planos de índice antes de determinar que não pode usar valores NULL para unir as colunas da tabela. Ou seja, você realmente precisa ter um filtro de cláusula WHERE ajustando o índice para cada índice filtrado usado na consulta, ou o índice não será usado.
  2. Eliminar e criar índices e atualizar redundantemente suas estatísticas mais uma vez ainda pode não ser suficiente para produzir os planos atualizados, o que presumimos que aconteceria. Parece que, em alguns casos, apenas uma carga de trabalho alta o suficiente forçará o SQL Server a reavaliar os planos.
  3. Existem alguns aspectos exóticos na funcionalidade do planejador de execução que são difíceis de determinar apenas pelo bom senso e pela lógica. Mesmo com milhares de variações geradas por code-behind de diferentes consultas, índices aparentemente inúteis podem ajudar em algumas estatísticas e planos de consulta que acabam sendo usados ​​em consultas críticas.

No final, essas mudanças foram revertidas. Portanto, os índices filtrados são uma ferramenta poderosa, mas você precisa realmente entender exatamente quais dados estão sendo buscados nessas colunas. Onde os índices normais além dos problemas de espaço são bastante fáceis de aplicar, os índices filtrados representam soluções muito personalizadas. Eles certamente não são um substituto para um índice regular, mas sim uma extensão deles nas circunstâncias especiais em que são necessários.

sql-server index
  • 2 2 respostas
  • 1400 Views

2 respostas

  • Voted
  1. Best Answer
    Thomas Kejser
    2014-01-06T09:17:21+08:002014-01-06T09:17:21+08:00

    Abordagem muito interessante. Meu upvote para a criatividade.

    Como você recuperou o espaço, presumo que os índices originais não estejam mais no lugar. As desvantagens dos índices filtrados são:

    • Muitos deles podem fazer com que o espaço de pesquisa do otimizador fique muito grande, levando a planos de consulta insatisfatórios à medida que o tempo limite do otimizador se esgota
    • Existem várias situações em que um índice filtrado nem será considerado, ainda que o equivalente não filtrado seja. Notavelmente, isso pode acontecer quando você obtém uma junção de hash na coluna indexada ou se você tenta ORDER BY na coluna (sem um filtro)
    • A parametrização da consulta não funciona com índices filtrados (consulte: http://www.sqlservercentral.com/blogs/practicalsqldba/2013/04/08/sql-server-part-9-filtered-index-a-new-way- para-melhoria-desempenho/ )

    Em termos práticos, isso significa que você deve ter muito cuidado com os índices filtrados, pois eles geralmente resultam em planos de consulta horríveis. Eu não iria tão longe a ponto de chamá-los de inúteis, mas os vejo como uma adição aos índices tradicionais, não como uma substituição (como você está tentando fazer).

    • 8
  2. Marcello Miorelli
    2015-10-04T22:57:44+08:002015-10-04T22:57:44+08:00

    Thomas Kejser respondeu a este tópico bem acima.

    Só pensei em adicionar 2 centavos.

    Eu vi alguns índices filtrados sendo usados ​​apenas (mostrado no plano de execução) quando você corresponde exatamente à cláusula where em sua consulta como where no índice filtrado.

    você já tentou usar exibições indexadas ? colunas esparsas ?

    Acredito que, desde que você tenha apenas juntas internas, você pode criar uma exibição indexada contendo a (s) cláusula (s) where de seus índices filtrados e, em seguida, poderá usar a exibição.

    Pode haver mais de uma visualização. Mas, da mesma forma que com os índices não clusterizados, muitos irão retardar sua escrita.

    Na minha experiência, você teria bons ganhos na leitura, mas teria que monitorar as gravações (inserções e atualizações), especialmente se as tabelas estivessem envolvidas na replicação.

    No entanto, como entendo sua principal preocupação the null values, sugiro colunas SPARSE em seus índices .

    Colunas esparsas são especialmente apropriadas para índices filtrados

    Como anunciei colunas esparsas, não me sentiria bem se também não falasse sobre suas limitações:

    Ao projetar tabelas com colunas esparsas, lembre-se de que 2 bytes adicionais de sobrecarga são necessários para cada coluna esparsa não nula na tabela quando uma linha está sendo atualizada.

    Como resultado disso

    requisito de memória adicional, as atualizações podem falhar inesperadamente com o erro 576 quando o tamanho total da linha, incluindo essa sobrecarga de memória, excede 8019,

    e nenhuma coluna pode ser empurrada para fora da linha.

    Considere o exemplo > de uma tabela que possui 600 colunas esparsas do tipo bigint.

    Se houver 571 colunas não nulas, o tamanho total no disco será 571 * 12 = 6852 bytes. Depois de incluir a sobrecarga de linha adicional e o cabeçalho de coluna esparso, isso aumenta para cerca de 6895 bytes. A página ainda tem cerca de 1124 bytes disponíveis em disco. Isso pode dar a impressão de que colunas adicionais podem ser atualizadas com sucesso. No entanto, durante a atualização, há sobrecarga adicional na memória que é 2*(número de colunas esparsas não nulas). Neste exemplo, incluindo a sobrecarga adicional – 2 * 571 = 1142 bytes – aumenta o tamanho da linha no disco para cerca de 8037 bytes. Esse tamanho excede o tamanho máximo permitido de 8019 bytes. Como todas as colunas são tipos de dados de comprimento fixo, elas não podem ser empurradas para fora da linha. Como resultado, a atualização falha com o erro 576.

    mais detalhes no link acima, porém prefiro postar aqui também este aviso:

    Alterar uma coluna de esparsa para não esparsa ou de não esparsa para esparsa requer a alteração do formato de armazenamento da coluna.

    O SQL Server Database Engine usa o seguinte procedimento para realizar essa alteração:

    1 - Adiciona uma nova coluna à tabela no novo tamanho e formato de armazenamento.

    2 - Para cada linha da tabela, atualiza e copia o valor armazenado na coluna antiga para a nova coluna.

    3 - Remove a coluna antiga do esquema da tabela.

    4 - Reconstrói a tabela (se não houver índice clusterizado) ou reconstrói o índice clusterizado para recuperar o espaço usado pela coluna antiga.

    • 2

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 fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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