带索引的派生表

时间:2014-11-11 10:02:03

标签: sql sql-server tsql

请参阅下面的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)。但是,我想先看看是否可以使用派生表执行此操作。

1 个答案:

答案 0 :(得分:0)

您可以在表格变量上创建索引,如此问题的最高投票答案中所述:

SQL Server : Creating an index on a table variable

该帖子的示例语法:

DECLARE @TEMPTABLE TABLE (
  [ID]   [INT] NOT NULL PRIMARY KEY,
  [Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
  UNIQUE NONCLUSTERED ([Name], [ID]) 
  ) 

或者,您可能需要考虑使用临时表,该临时表将在当前操作的范围内保持,即在执行与表变量完全相同的存储过程期间。临时表将像常规表一样进行结构化和优化,但它们将存储在tempDb中,因此它们可以像常规表一样进行索引。

临时表通常会提供比表变量更好的性能,但值得使用您的数据集进行测试。

更深入的细节可以在这里找到:

When should I use a table variable vs temporary table in sql server?

您可以看到使用以下索引创建临时表的示例:

SQL Server Planet - Create Index on Temp Table

  

临时表(#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)