SQL Server 如何对T-SQL声明的表变量的两列进行设置和索引?

w8biq8rn  于 2022-12-03  发布在  其他
关注(0)|答案(4)|浏览(173)

使用SQL Server 2008 R2
考虑一个声明的表 * 变量 *,如下所示:

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

我如何对任何名称ON @t(包括(Con1 ASC, Col2 ASC))执行CREATE NONCLUSTERED INDEX
不应将索引限制为唯一值。
出于某种原因,我不设法弄清楚这一点...

unhi4e5o

unhi4e5o1#

在最近的版本中,您可以创建内联索引。

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

然而,这是标记为SQL Server 2008的。在那里,您可以创建一个非聚集索引,如下所示。

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

如果目的是Col1, Col2本身是唯一的,则从列列表中删除PK
虽然从表面上看,这似乎在(PK)中添加了一个额外的列,但索引结构将与仅在#temp表的Col1, Col2上创建非唯一索引相同。

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)

对于非唯一非聚集索引,SQL Server总是将CI键隐式添加到NCI键。2这只是显式显示它。
请参阅卡伦·德莱尼More About Nonclustered Index Keys

23c0lvtd

23c0lvtd2#

您不能。declare<table_type_definition>):
定义表数据类型。表声明包括列定义、名称、数据类型和约束条件。允许的约束条件类型只有PRIMARY KEY、UNIQUE、NULL和CHECK。
注意,没有提到索引。
如果需要索引,请创建一个临时表(CREATE TABLE #t (...).

7fhtutme

7fhtutme3#

    • 不能**索引表变量。

如果需要索引-请使用临时表(CREATE TABLE #TCREATE TABLE ##T
这是表变量的主要缺点之一,另外两个缺点是:

  • 表变量不参与事务,这可能是好事也可能是坏事,具体取决于您的情况
  • 查询优化器总是认为表变量中只有一行,只要有少量行就可以了,但是如果有很多行,您觉得需要索引,那么这一点对于查询优化来说可能也是个问题
gcuhipw9

gcuhipw94#

您无法在数据表变数上建立非丛集、非唯一索引。它只支援唯一索引。请参阅here
您应该改为查看本地临时表。无论如何,对于大型数据集执行效果更好。

相关问题