【问题标题】:T-SQL - Alter index, add INCLUDE columnsT-SQL - 更改索引,添加 INCLUDE 列
【发布时间】:2014-09-19 11:27:26
【问题描述】:

我有一张桌子

CREATE TABLE Test
(
    id int primary key,
    a nvarchar(max),
    c nvarchar(max),
    b nvarchar(max)
)

我想提高对表的查询性能,并想为经常访问的列创建索引。

由于除了 id 之外的所有字段都具有 nvarchar(max) 类型,因此 sql-server 说我无法为类型为 nvarchar(max) 的列创建索引

Create index MyIndex on T(a)

错误:表 'T' 中的列 'a' 的类型不能用作索引中的键列

根据MSND,可以使用以下符号创建索引

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name 
    ON <object> ( column [ ASC | DESC ] [ ,...n ] ) 
    [ INCLUDE ( column_name [ ,...n ] ) ]
[ ; ]

我对这个选项感兴趣

[ 包括 (column_name [ ,...n ] ) ]
关于它 MSDN 说:

INCLUDE (column [ ,... n ] ) 指定要添加的非键列 到非聚集索引的叶级别。非聚集索引 可以是唯一的或非唯一的。除 textntextimage 之外的所有数据类型均允许使用。

我可以创建任何索引或更改现有的 PK 索引以向索引中添加列吗?

【问题讨论】:

  • 你真的需要这些列是NVARCHAR(MAX)吗?
  • 问题是什么? (即使可以在这样的“大文本”列上添加索引,它也可能无法在查询计划中使用。)
  • 您可能会在这里找到一些帮助(甚至是您的答案)。请查看[链接][1][1]:stackoverflow.com/questions/2863993/…
  • 您对错误信息有什么不明白的地方?该消息与语法无关。它表示列类型不能用作索引键。
  • 我非常认为限制将是 450 个字符,因为对于 nvarchar,数据长度是字符串长度的两倍,并且 sql server 中索引的限制是 900 字节。如果您想搜索文本列中的每个单词,可能需要全文搜索。

标签: sql sql-server tsql indexing


【解决方案1】:

您可以使用持久选项创建计算索引并在其上创建索引。

ALTER TABLE dbo.test ADD a2 AS SUBSTRING(a,1,1000) PERSISTED
ALTER TABLE dbo.test ADD b2 AS SUBSTRING(b,1,1000) PERSISTED
ALTER TABLE dbo.test ADD c2 AS SUBSTRING(c,1,1000) PERSISTED


CREATE INDEX ix_text_a ON dbo.text(a2)
CREATE INDEX ix_text_b ON dbo.text(b2)
CREATE INDEX ix_text_c ON dbo.text(c2)

【讨论】:

  • 这将被计算为 columns,但除此之外:好主意!这是否适用于索引的 900 字节限制?
猜你喜欢
  • 1970-01-01
  • 2021-12-17
  • 2017-06-25
  • 2012-04-03
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多