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 / 58106
Accepted
Zinx
Zinx
Asked: 2014-02-03 12:23:51 +0800 CST2014-02-03 12:23:51 +0800 CST 2014-02-03 12:23:51 +0800 CST

Ignorando alguns dados da indexação no SQL Server

  • 772

Tenho uma situação em que o SQL Server está dando erro de tamanho de índice superior a 900 bytes. Está acontecendo porque uma das colunas na definição do índice é varchar (2000) e sempre que seu comprimento ultrapassa 800, ocorre o erro.

Então, minha pergunta é: existe alguma maneira de dizer na definição do índice para incluir apenas os primeiros 800 caracteres da coluna?

Algumas pessoas em blogs sugeriram adicionar uma coluna adicional à tabela que terá os primeiros 800 caracteres de outra coluna e adicionar indexação nesta nova coluna adicional em vez da coluna original. Mas acho que isso afetará o desempenho geral porque as consultas de leitura ainda estão sendo feitas na coluna original.

Por favor, sugira se há alguma outra maneira de resolver este problema.

sql-server nonclustered-index
  • 1 1 respostas
  • 214 Views

1 respostas

  • Voted
  1. Best Answer
    Jon Seigel
    2014-02-03T19:01:44+08:002014-02-03T19:01:44+08:00

    Escrevi um post sobre esse tipo de situação aqui , que é mais aprofundado do que esta resposta.

    existe alguma maneira de dizer na definição do índice para incluir apenas os primeiros 800 caracteres da coluna?

    Isso pode ser feito criando uma coluna computada como LEFT(MyColumn, 800)e, em seguida, indexando essa coluna. Observe que a coluna não precisa ser materializada na tabela usando a PERSISTEDcláusula -- a criação de um índice na coluna materializará os valores apenas no índice. Tenha cuidado com a abordagem de coluna computada, porque ela pode não se comportar como esperado em alguns casos (problemas com colunas computadas em geral, não específicos para esta situação).

    Essa abordagem permite que você faça correspondência exata e LIKE 'xyz%'diretamente, desde que o termo de pesquisa seja menor que o comprimento indexado.

    Você pode usar CHECKSUM para gerar um pequeno hash

    O resultado da CHECKSUMfunção pode ser pequeno, mas não é uma função hash muito boa. Em vez disso, use HASHBYTESou uma função CLR.

    A mesma coisa se aplica acima em relação às colunas computadas. Ou esse valor é pequeno o suficiente (16 bytes) para que possa ser materializado na tabela usando um gatilho ou código de aplicativo e indexado a partir daí.

    As desvantagens são que esse método permite apenas correspondência exata, porque não há como corresponder em uma entrada parcial e, é claro, o gerenciamento de alterações necessário para adicionar uma nova coluna não NULL a uma tabela existente.

    as consultas de leitura ainda estão sendo feitas na coluna original.

    Você precisará alterar como as consultas acessam a tabela para fazer uma dessas soluções funcionar; portanto, se isso não for possível, você está sem sorte.

    Como estamos falando de compactação com perdas (hashing ou truncamento), as consultas sempre precisam também comparar o valor original com o termo de pesquisa, a menos que o índice seja exclusivo, o que pode abrir você para usuários relatando erros estranhos (os primeiros 800 caracteres são idêntico ou uma colisão de hash improvável). Se o índice não for único e os valores originais não forem comparados, resultados incorretos podem ser retornados (observação: isso pode ser uma falha de segurança).

    A comparação adicional provavelmente afetará os planos de consulta, e não vou entrar nisso sem uma consulta de amostra, mas você pode encontrar alguns pequenos exemplos na postagem do blog que vinculei acima. Usando o esquema de tabela e as consultas existentes, você deve ser capaz de adivinhar o que acontecerá com os planos.

    • 10

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

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

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

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

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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