SQL Server 2014,表变量上的非汇集索引

从Paul White的推特上看到,在SQL Server 2014里,对于表变量(Table Variables),它是支持非惟一汇集索引(Non-Unique Clustered Indexes)和非汇集索引(Non-Clustered Indexes)的。看到这个,我决定在本身的虚拟机里尝试下,由于这将是个卓越的功能。表变量很棒,由于用它能够避免过多的重编译(excessive recompilations)。当你建立它们时,它们是没有统计信息,你不会改变数据库架构。它们只是变量,但在TempDb里仍是常驻的。sql

表变量的一个缺点是,你不能在上面建立非汇集索引,这个在处理大量数据集时是很差的。但SQL Server 2014 CTP1已经修正了这个缺点。来看下面的代码(点击工具栏的显示包含实际的执行计划):数据库

 1 DECLARE @tempTable TABLE
 2 (
 3    ID INT IDENTITY(1, 1) PRIMARY KEY,
 4    FirstName CHAR(100) INDEX idx_FirstName,
 5    LastName CHAR(100)
 6 )
 7     
 8 INSERT INTO @TempTable (FirstName, LastName)
 9 SELECT TOP 100000 name, name FROM master.dbo.syscolumns
10     
11 SELECT FirstName FROM @TempTable
12 WHERE FirstName = 'cid'
13 GO

咱们来看下SELECT语句的执行计划,SQL Server执行了非汇集索引扫描运算符(Non-Clustered Index Seek operator)。也就是说,咱们能够在表变量上定义额外的非汇集索引。每一个建立的非汇集索引是没有统计信息。这个功能很酷哦,在常规数据库表的简单语法(easy syntax)也支持。咱们来看下面的表定义:架构

1 CREATE TABLE foo
2 (
3     Col1 INT PRIMARY KEY CLUSTERED,
4     Col2 INT INDEX idx_Col2,
5     Col3 INT INDEX idx_Col3
6 )
7 GO

这个在SQL Server 2008R2上会提示以下错误:工具

 

在SQL Server 2014上却能成功执行!spa

更进一步,咱们还能够用新语法建立复合索引(composite indexes):3d

1 -- Inline creation of Indexes
2 CREATE TABLE foo2
3 (
4     Col1 INT PRIMARY KEY CLUSTERED,
5     Col2 INT INDEX idx_Col2 (Col2, Col3),
6     Col3 INT
7 )
8 GO

以前的版本(我这里是SQL Server 2008R2)只能以下出错提示:code

真是酷炫叼炸天了,你们赶忙都去体验下! server

参考文章:

https://www.sqlpassion.at/archive/2013/06/26/non-clustered-indexes-on-table-variables-in-sql-server-2014/blog

相关文章
相关标签/搜索