我只是在创建一个模式绑定视图,我想在该视图上放置一个索引(以尝试一些计算列的变体)。
我使用 SCHEMABINDING 创建了视图,然后我必须先创建一个聚集索引,然后才能创建其他非聚集索引。
基础表有一个 INT 主键列,所以我打算基于它来创建视图的聚集索引。所以我跑了
Create UNIQUE CLUSTERED INDEX [cix_viewEvents_EventID] ON [dbo].[viewEvents] (EventID)
令我惊讶的是,4-5 分钟后,我得到了一个
Msg 8152, string or binary data would be truncated
错误。
索引中唯一的列是 int;什么会被截断?
我在谷歌上找不到任何相关的东西。
编辑:
原来的表是这样的,
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]
虽然我创建的视图看起来像这样
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;
我希望通过使用哈希而不是大块文本来加快标题和内容的比较。
与其将计算列直接添加到表中,我想我会先尝试模式绑定视图,但我遇到了“您需要在视图上创建一个聚集索引才能在其上创建非聚集索引”。所以我尝试创建一个聚集索引,如上所述。
我们在两个地方都在谈论一个 int,但是在视图炸弹上创建聚集索引时会出现截断错误,这似乎没有意义。
以下是 Microsoft 所说的Create Indexed Views:
由于聚集索引由数据行本身组成,因此您假设“索引中的唯一列是 int”是不正确的,即使 DDL 上只列出了一列,聚集索引视图应包含引擎盖下的所有列. 如果它是一个非聚集索引,那么只有列出的列会构成索引。
使用您提供的 DDL,我能够运行一些实验室测试,SSMS 的以下图表将说明我的观点:
如您所见,视图的大小与表格几乎相同。在创建索引之前,视图甚至不会显示在图表上。如果它像您想象的那样仅由 int 列形成,那么它的大小会小得多。
该信息以及SMor关于SQL Server 2008的HASHBYTES 参数限制的贡献:
在我的实验室中,我生成了一些大于 8000 字节的数据,但由于我运行的是 SQL Server 2019 实例,因此 DDL 执行时没有任何错误。您可以使用以下查询验证是否有任何超出该限制的值: