SQL Server 2014,表變量上的非聚集索引
從Paul White的推特上看到,在SQL Server 2014里,對于表變量(Table Variables),它是支持非唯一聚集索引(Non-Unique Clustered Indexes)和非聚集索引(Non-Clustered Indexes)的。看到這個,我決定在自己的虛擬機里嘗試下,因為這將是個卓越的功能。表變量很棒,因為用它可以避免過多的重編譯(excessive recompilations)。當你創建它們時,它們是沒有統計信息,你不會改變數據庫架構。它們只是變量,但在TempDb里還是常駐的。
表變量的一個缺點是,你不能在上面創建非聚集索引,這個在處理大量數據集時是不好的。但SQL Server 2014 CTP1已經修正了這個缺點。來看下面的代碼(點擊工具欄的顯示包含實際的執行計劃):
DECLARE @tempTable TABLE ( ID INT IDENTITY(1, 1) PRIMARY KEY, FirstName CHAR(100) INDEX idx_FirstName, LastName CHAR(100) )INSERT INTO @TempTable (FirstName, LastName) SELECT TOP 100000 name, name FROM master.dbo.syscolumns
SELECT FirstName FROM @TempTable WHERE FirstName = 'cid' GO</pre>
![]()
我們來看下SELECT語句的執行計劃,SQL Server執行了非聚集索引掃描運算符(Non-Clustered Index Seek operator)。也就是說,我們可以在表變量上定義額外的非聚集索引。每個創建的非聚集索引是沒有統計信息。這個功能很酷哦,在常規數據庫表的簡單語 法(easy syntax)也支持。我們來看下面的表定義:
CREATE TABLE foo ( Col1 INT PRIMARY KEY CLUSTERED, Col2 INT INDEX idx_Col2, Col3 INT INDEX idx_Col3 ) GO
這個在SQL Server 2008R2上會提示如下錯誤:
![]()
在SQL Server 2014上卻能成功執行!
![]()
更進一步,我們還可以用新語法創建復合索引(composite indexes):
-- Inline creation of Indexes CREATE TABLE foo2 ( Col1 INT PRIMARY KEY CLUSTERED, Col2 INT INDEX idx_Col2 (Col2, Col3), Col3 INT ) GO
之前的版本(我這里是SQL Server 2008R2)只能如下出錯提示:
![]()
![]()
真是酷炫叼炸天了,大家趕緊都去體驗下!
注:此文章為WoodyTu學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出此文連接!
</div> 來自:http://www.cnblogs.com/woodytu/p/4607187.html
若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支持才能激發作者更大的寫作熱情,非常感謝!本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關資訊
相關經驗