从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.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上却能成功执行!

更进一步,我们还可以用新语法创建复合索引(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)只能如下出错提示:

真是酷炫叼炸天了,大家赶紧都去体验下!

参考文章:

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

转载于:https://www.cnblogs.com/woodytu/p/4607187.html

SQL Server 2014,表变量上的非聚集索引相关推荐

  1. 三、索引优化(3)聚集索引上的非聚集索引

    一.索引结构 在聚集索引上建立非聚集索引,在日常应用中经常发生. <?xml:namespace prefix="[default]" ns="http://www ...

  2. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

  3. SQL Server修改表名,字段名,索引名

    说实话,感觉SQL Server的资料真的好难找(也有可能是很多人在吐槽的CSDN的搜索功能不够强--),我想找个修改表名的方法,结果找了好久,才找到一个可行的,留个纪念,希望也能够帮到你(多个人转发 ...

  4. SQL Server临界点游戏——为什么非聚集索引被忽略!

    当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: 1 CREA ...

  5. SQL Server的聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)-- (一) ...

  6. sql server 2014预览版发布

    MSDN发布sql server2014预览版,如下图: SQL Server 2014新特性: 微软SQL Server部门主管Eron Kelly介绍,通过将交易处理放到内存中进行,新的SQL S ...

  7. 抢先体验SQL Server 2014 CTP1!

    根据微软官方给出的消息,下一版本数据库平台SQL Server 2014将在今年年底发布,其中将包含表粒度级别的内存OLTP功能,而与其他内存数据库不同的是,这一功能将无需昂贵的硬件作为支持. 在本周 ...

  8. SQL Server 堆表行存储大小(Record Size)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 堆表行记录存储格式(Heap) 案例分析(Case) 参考文献(References) 二.背 ...

  9. SQL Server 聚集索引 clustered index 非聚集索引Nonclustered Indexes键查找查找Key Lookup执行计划过程详解

    SQL Server 聚集索引非聚集索引键查找过程详解 索引的相关术语 1 堆(Heap)是一种没有指定排序的数据结构,通俗的理解堆就像是按照顺序排放的杂物.在数据库里也即是对应没有聚集索引. 2 聚 ...

  10. SQL Server 堆heap 非聚集索引 Nonclustered index 行号键查找RID loopup结合执行计划过程详解

    SQL Server 堆型数据与执行计划使用案例 索引的相关术语 1 堆(Heap)是一种没有指定排序的数据结构,通俗的理解堆就像是按照顺序排放的杂物.在数据库里也即是对应没有聚集索引. 2 聚集索引 ...

最新文章

  1. 鹤峰:美丽的茶乡——人物篇
  2. 【转】ABP源码分析三十一:ABP.AutoMapper
  3. 大端字节序与小端字节序的转换
  4. MoreResult 同事返回多个数据集
  5. linux下的一些常见命令学习,学习猿地-Linux下的常见命令总结
  6. Lua初学习 9-13_04 require moudle
  7. 3dmax软件如何导入光网文件?
  8. 高通QFIL刷机 安装9008驱动
  9. java版的mrp模拟器_mrp模拟器(simulator)
  10. 仿QQ音乐(HTML+CSS)
  11. 如何免费下载和翻译论文
  12. CSP201903-1 小中大 (Python)
  13. VC++获取系统信息/获取OS/获取MAC/获取本地IP/判断是否为网吧
  14. 2021年中国食糖产销量及重点企业对比分析[图]
  15. m3u8转mp4,不用格式软件
  16. Excel学习日记:L12-打印分页
  17. javascript解数独LeetCod-37
  18. MySQL数据库学习笔记(2)
  19. 电子邮件管理系统 android,IM800电子邮件管理系统
  20. 【转】2008年.Net编程人员工具参照

热门文章

  1. 鸟类的视力很惊人,如何从高空中发现食物
  2. PYTHON莫名其妙的崩溃
  3. 买手机数据线特别要注意的地方
  4. vscode安卓html扩展,vscode扩展信息.html
  5. trunc函数_这几个舍入函数你都会用吗?
  6. execl执行linux命令,Excel 调用Shell命令执行bash脚本和命令行代码
  7. C++ 10进制字符串转10进制 10进制字符串转换
  8. mysql primary重复_mysql:键'PRIMARY'和奇怪的ID行为重复条目'0'
  9. antd的select的滚动条怎么才会出现_纵向滚动条对横向滚动条的影响
  10. 3项目里面全局用less变量 cli vue_Vue.js构建工具比较