sql-server 创建非聚集索引时索引类型无效

bxgwgixi  于 2022-10-31  发布在  其他
关注(0)|答案(2)|浏览(242)

我有这个表Test

  1. ID - int primary key not null,
  2. CODE - nvarchar(max),
  3. NAME - nvarchar(max)

它在ID上具有聚集索引。
但在执行计划中,搜索使用IDCODE列。
如何向表中添加非聚集索引?尝试添加时,出现错误:
表Test中的列代码的类型对于用作索引中的键列无效
你能建议必须采取什么行动吗?
我需要为查询添加索引进行快速处理。
已存在聚集索引,该索引在查询处理中无效。
在SSMS中,要创建NON-CLUSTERED INDEX -唯一的选择是添加ID作为键列,然后在索引中添加CODE作为Include。但这意味着表将同时具有ID列上的CLUSTERED INDEX和ID上的NON-CLUSTERED INDEX(包含CODE)。是这样吗?
最佳实践是什么:

  • 表是否可以同时具有基于同一ID键列的聚集索引和非聚集索引?
  • 您应该如何解决此问题?
w7t8yxp5

w7t8yxp51#

您不能直接执行此操作,但可以使用INCLUDE
正如拉穆所指出的,这样一个非聚集索引不会被使用,因为每个包含ID的搜索都将使用聚集主键来获得它的wated行并忽略代码。
PRIMARY KEY意味着每一行都有一个UNIQUE ID。

  1. CREATE TABLe test_table (
  2. ID int primary key not null,
  3. CODE nvarchar(max),
  4. NAME nvarchar(max)
  5. )
  6. CREATE NONCLUSTERED INDEX IDX_NC_test_table_CODE ON test_table(ID) INCLUDE(CODE)
whlutmcx

whlutmcx2#

您不能对MAX列进行索引,因为它们太大了,因为您声明的值可能在8,000到20亿字节之间;因此您在此处声明该名称可能超过4,000个字符。
CODE列似乎不太可能需要设置为MAX。是否有特定的原因导致此列设置为MAX-或者该列是通过ORM自动创建的,但未指定长度?如果不是,请将其设置为合理的长度,并在其上创建非聚集索引。

相关问题