请参阅下面的TSQL:
DECLARE @TestTable table (reference int identity,
TestField varchar(10),
primary key (reference))
INSERT INTO @TestTable VALUES ('Ian')
select * from @TestTable as TestTable
INNER JOIN LiveTable on LiveTable.Reference=TestTable.Reference
是否可以在@Test.TestField
上创建索引?以下webpage表明它不是。但是,我在另一个网页上看到它是可能的。
我知道我可以创建一个物理表(对于@TestTable)。但是,我想先看看是否可以使用派生表执行此操作。
答案 0 :(得分:0)
您可以在表格变量上创建索引,如此问题的最高投票答案中所述:
该帖子的示例语法:
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
或者,您可能需要考虑使用临时表,该临时表将在当前操作的范围内保持,即在执行与表变量完全相同的存储过程期间。临时表将像常规表一样进行结构化和优化,但它们将存储在tempDb
中,因此它们可以像常规表一样进行索引。
临时表通常会提供比表变量更好的性能,但值得使用您的数据集进行测试。
更深入的细节可以在这里找到:
您可以看到使用以下索引创建临时表的示例:
临时表(#temp)最有价值的资产之一就是能力 添加聚簇索引或非聚簇索引。另外,#temp 表允许创建自动生成的统计信息 他们。这可以在确定基数时帮助优化器。下面 是一个创建聚簇索引和非聚簇索引的示例 临时表。
网站的示例代码:
CREATE TABLE #Users
(
ID INT IDENTITY(1,1),
UserID INT,
UserName VARCHAR(50)
)
INSERT INTO #Users
(
UserID,
UserName
)
SELECT
UserID = u.UserID
,UserName = u.UserName
FROM dbo.Users u
CREATE CLUSTERED INDEX IDX_C_Users_UserID ON #Users(UserID)
CREATE INDEX IDX_Users_UserName ON #Users(UserName)