5

使用 SQL Server 2008 R2

考虑一个声明的表变量,如:

DECLARE @t TABLE (PK int IDENTITY(1,1) PRIMARY KEY CLUSTERED, Col1 int, Col2 int)

我如何CREATE NONCLUSTERED INDEX使用任何名称,ON @t包括(Con1 ASC, Col2 ASC)

索引不应仅限于唯一值。

由于某种原因,我无法弄清楚这一点......

4

4 回答 4

7

可以按如下方式创建非聚集索引。

DECLARE @t TABLE (
  PK   INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Col1 INT,
  Col2 INT,
  UNIQUE (Col1, Col2, PK)) 

如果意图是它们本身是唯一的,则从列列表中Col1, Col2删除。PK

Though it appears at face value as though this has added an additional column in (PK) the index structure will be the same as creating a non unique index on just Col1, Col2 on a #temp table.

CREATE TABLE #T  (
  PK   INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Col1 INT,
  Col2 INT) 

/*PK added in to end of key anyway*/  
CREATE NONCLUSTERED INDEX ix ON #T(Col1, Col2)

for a non unique non clustered index SQL Server always adds the CI key to the NCI key implicitly anyway. This just shows it explicitly.

See Kalen Delaney More About Nonclustered Index Keys

于 2012-07-05T06:44:54.840 回答
5

You cannot. declare (<table_type_definition>):

Defines the table data type. The table declaration includes column definitions, names, data types, and constraints. The only constraint types allowed are PRIMARY KEY, UNIQUE, NULL, and CHECK.

Note, no mention of indexes.

If you want indexes, create a temporary table (CREATE TABLE #t (...).

于 2012-07-05T06:45:14.933 回答
2

不能索引表变量。

如果您需要索引 - 使用临时表(CREATE TABLE #TCREATE TABLE ##T

这是表变量的主要缺点之一——另外两个是:

  • 表变量不参与事务,根据您的情况,这可能是好事也可能是坏事

  • 查询优化器始终认为表变量中只有一行,只要您有少量行就可以了 - 但如果您有那么多行,您觉得需要索引 - 那么可能这一点也将是查询优化的一个问题

于 2012-07-05T06:44:39.260 回答
1

您不能在表变量上创建非聚集、非唯一索引。它仅支持唯一索引。见这里

您应该改为查看本地临时表。无论如何,对于大型数据集表现更好。

于 2012-07-05T06:43:18.923 回答