这是 SQL Server 2008 R2 SP2。我有2张桌子。两者都是相同的(数据和索引),除了第一个表有一个 VALUE 列 asnvarchar(max)和第二个有相同的列 as nvarchar(800)。此列包含在非聚集索引中。我还在两个表上创建了聚集索引。我还重建了索引。此列中的最大字符串长度为 650。
如果我对两个nvarchar(800)表运行相同的查询,则始终会更快,速度是原来的两倍。当然,这似乎违背了“varchar”的目的。表包含 800,000+ 行。查询应该查看大约 110,000 行(这是计划估计的)。
根据 io 统计数据,没有 lob 读取,所以一切似乎都在行中。执行计划是相同的,除了两个表之间的成本百分比略有不同,并且估计的行大小更大nvarchar(max)(91 字节 vs 63 字节)。读取次数也几乎相同。
为什么会有差异?
====== 架构 ======
CREATE TABLE [dbo].[table1](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[ProductID] [bigint] NOT NULL,
[ProductSkeletonID] [bigint] NOT NULL,
[Value] [nvarchar](max) NOT NULL,
[IsKeywordSearchable] [bit] NULL,
[ValueInteger] [bigint] NULL,
[ValueDecimal] [decimal](18, 2) NULL,
[ValueDate] [datetime] NULL,
[TypeOfData] [nvarchar](20) NOT NULL,
CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED
( …Run Code Online (Sandbox Code Playgroud)