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 / 265194
Accepted
user1664043
user1664043
Asked: 2020-04-17 09:45:51 +0800 CST2020-04-17 09:45:51 +0800 CST 2020-04-17 09:45:51 +0800 CST

Erro de truncamento ao criar índice clusterizado na exibição vinculada ao esquema

  • 772

Eu estava apenas criando uma exibição vinculada ao esquema na qual queria colocar um índice (para experimentar algumas variações de colunas computadas).

Criei a view WITH SCHEMABINDING, então tive que criar um índice clusterizado antes de poder criar meus outros não clusterizados.

A tabela subjacente tem uma coluna de chave primária INT, então eu faria o índice clusterizado da exibição com base nisso. Então eu corri

Create UNIQUE CLUSTERED INDEX [cix_viewEvents_EventID] ON [dbo].[viewEvents] (EventID)

Para minha surpresa, após 4-5 minutos, recebi um

Msg 8152, string or binary data would be truncated

erro.

A única coluna no índice é um int; o que poderia estar ficando truncado?

Não encontrei nada relevante no google.

EDITAR:

A tabela original é assim,

CREATE TABLE [dbo].[Events](
[EventID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[EventTitle] [varchar](max) NOT NULL,
[EventContent] [varchar](max) NULL,
[EventDate] [datetime] NOT NULL,
CONSTRAINT [PK_Events] PRIMARY KEY CLUSTERED 
(
[EventID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

enquanto a visão que eu criei ficou assim

CREATE VIEW dbo.viewEvents
WITH SCHEMABINDING
AS
SELECT EventID, EventTitle, 
EventContent, EventDate, HASHBYTES('SHA1', EventContent) as ContentHash, HASHBYTES('SHA1', 
EventTitle) as TitleHash
from dbo.Events;

Eu esperava acelerar as comparações no título e no conteúdo tendo hashes para comparar em vez de grandes bolhas de texto.

Em vez de adicionar as colunas computadas diretamente à tabela, pensei em tentar primeiro a exibição vinculada ao esquema, mas encontrei o "você precisa de um índice clusterizado na exibição antes de criar índices não clusterizados". Então tentei criar um índice clusterizado, conforme observado acima.

Estamos falando de um int em ambos os lugares, mas criando o índice clusterizado nas bombas de exibição com um erro de truncamento, o que não parece fazer sentido.

sql-server sql-server-2008
  • 1 1 respostas
  • 85 Views

1 respostas

  • Voted
  1. Best Answer
    Ronaldo
    2020-04-17T17:04:50+08:002020-04-17T17:04:50+08:00

    A tabela subjacente tem uma coluna de chave primária INT, então eu faria o índice clusterizado da exibição com base nisso.

    Veja o que a Microsoft diz sobre Create Indexed Views :

    A criação de um índice clusterizado exclusivo em uma exibição melhora o desempenho da consulta porque a exibição é armazenada no banco de dados da mesma forma que uma tabela com um índice clusterizado é armazenada.

    Como um índice clusterizado é composto pelas próprias linhas de dados, sua suposição de que "a única coluna no índice é um int" está incorreta porque, mesmo que apenas uma coluna tenha sido listada no DDL, a exibição do índice clusterizado deve conter todas as colunas sob o capô . Se fosse um índice não clusterizado, apenas as colunas listadas comporiam o índice.

    Com o DDL que você forneceu eu consegui fazer alguns testes de laboratório e o seguinte gráfico do SSMS deve ilustrar meu ponto:

    Gráfico do SQL Server

    Como você pode ver, a visão tem praticamente o mesmo tamanho da tabela. E antes que o índice fosse criado, a exibição nem seria exibida no gráfico. Se fosse formado apenas pela coluna int como você pensou, teria um tamanho bem menor.

    Essa informação junto com a contribuição do SMor sobre a limitação dos argumentos HASHBYTES para SQL Server 2008:

    Para SQL Server 2014 (12.x) e anteriores, os valores de entrada permitidos são limitados a 8.000 bytes.

    No meu laboratório gerei alguns dados com mais de 8000 bytes, mas como estou executando uma instância do SQL Server 2019, o DDL foi executado sem nenhum erro. Você pode verificar se tem algum valor que exceda esse limite com a seguinte consulta:

    SELECT COUNT(1)
    FROM [dbo].[Events]
    WHERE DATALENGTH([EventTitle]) > 8000
        OR DATALENGTH([EventContent]) > 8000;
    
    • 0

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

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

  • Downgrade do SQL Server 2008 para 2005

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