从Paul White的推特上看到,在SQL Server 2014里,对于表变量(Table Variables),它是支持非唯一聚集索引(Non-Unique Clustered Indexes)和非聚集索引(Non-Clustered Indexes)的。看到这个,我决定在自己的虚拟机里尝试下,因为这将是个卓越的功能。表变量很棒,因为用它可以避免过多的重编译(excessive recompilations)。当你创建它们时,它们是没有统计信息,你不会改变数据库架构。它们只是变量,但在TempDb里还是常驻的。
表变量的一个缺点是,你不能在上面创建非聚集索引,这个在处理大量数据集时是不好的。但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.syscolumns10 11 SELECT FirstName FROM @TempTable12 WHERE FirstName = 'cid'13 GO
我们来看下SELECT语句的执行计划,SQL Server执行了非聚集索引扫描运算符(Non-Clustered Index Seek operator)。也就是说,我们可以在表变量上定义额外的非聚集索引。每个创建的非聚集索引是没有统计信息。这个功能很酷哦,在常规数据库表的简单语法(easy syntax)也支持。我们来看下面的表定义:
1 CREATE TABLE foo2 (3 Col1 INT PRIMARY KEY CLUSTERED,4 Col2 INT INDEX idx_Col2,5 Col3 INT INDEX idx_Col36 )7 GO
这个在SQL Server 2008R2上会提示如下错误:
在SQL Server 2014上却能成功执行!
更进一步,我们还可以用新语法创建复合索引(composite indexes):
1 -- Inline creation of Indexes2 CREATE TABLE foo23 (4 Col1 INT PRIMARY KEY CLUSTERED,5 Col2 INT INDEX idx_Col2 (Col2, Col3),6 Col3 INT7 )8 GO
之前的版本(我这里是SQL Server 2008R2)只能如下出错提示:
真是酷炫叼炸天了,大家赶紧都去体验下!
- 4楼桦仔
- 不错的新功能
- 3楼Jack Tong
- 引用楼主的话:真是酷炫叼炸天了^_^
- 2楼wangjun8868
- 如果数据量大,把那么多的数据放到表变量里 也很费时间把
- Re: woodytu
- @wangjun8868,,在内存里执行,不会太慢,但是这个是空间换时间的工作,具体要权衡。
- 1楼Page-7y
- 见识了,不过2005飘过。。。