從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