天天看點

SQL Server 2014,表變量上的非聚集索引

從Paul White的推特上看到,在SQL Server 2014裡,對于表變量(Table Variables),它是支援非唯一聚集索引(Non-Unique Clustered Indexes)和非聚集索引(Non-Clustered Indexes)的。看到這個,我決定在自己的虛拟機裡嘗試下,因為這将是個卓越的功能。表變量很棒,因為用它可以避免過多的重編譯(excessive recompilations)。當你建立它們時,它們是沒有統計資訊,你不會改變資料庫架構。它們隻是變量,但在TempDb裡還是常駐的。

表變量的一個缺點是,你不能在上面建立非聚集索引,這個在處理大量資料集時是不好的。但SQL Server 2014 CTP1已經修正了這個缺點。來看下面的代碼(點選工具欄的

SQL Server 2014,表變量上的非聚集索引
顯示包含實際的執行計劃):

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      
SQL Server 2014,表變量上的非聚集索引

我們來看下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,表變量上的非聚集索引

在SQL Server 2014上卻能成功執行!

SQL Server 2014,表變量上的非聚集索引

更進一步,我們還可以用新文法建立複合索引(composite indexes):

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)隻能如下出錯提示:

SQL Server 2014,表變量上的非聚集索引
SQL Server 2014,表變量上的非聚集索引

真是酷炫叼炸天了,大家趕緊都去體驗下! 

參考文章:

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

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

繼續閱讀