从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

我们来看下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)只能如下出错提示:

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

参考文章:

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

SQL Server 2014,表变量上的非聚集索引的更多相关文章

  1. SQL Server性能优化(12)非聚集索引的组合索引存储结构

    一,非聚集索引组合索引 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引).但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引.当表的行数远远大于索引键的数目时,使用这种方式可以 ...

  2. SQL Server性能优化(11)非聚集索引的覆盖索引存储结构

    一,非聚集索引的include 非聚集索引的Include属性可以让非聚集索引包含其他列.如 CREATE NONCLUSTERED INDEX [NonIxUser] ON [dbo].[Users ...

  3. SQL Server性能优化(10)非聚集索引的存储结构

    一,新建测试表 CREATE TABLE [dbo].[Users]( ,) NOT NULL, ) NOT NULL, [CreatTime] [datetime] NOT NULL ) ON [P ...

  4. 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

    传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...

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

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

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

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

  7. SQL Server 2008 表变量参数(表值参数)用法

    表值参数是 SQL Server 2008 中的新参数类型.表值参数是使用用户定义的表类型来声明的.使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程 ...

  8. SQL Server 2008 表变量 临时表

    最近做一个报表,其中 在报表中用到了存储过程,游标,cte表达式,临时表和表变量. 在游标中循环遍历cte中的数据,把对应的数据存放在变量里面,之后把变量插入到表变量中,游标结束后,想要根据存储过程的 ...

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

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

随机推荐

  1. 如何实现在H5里调起高德地图APP?(下)

    这一篇文章将告诉您,如果直接打开高德地图APP,并展示路线规划.适合有定位的移动设备,可以查询到从“我的位置”到目的地的路径规划,并直接导航. 场景二.调起高德地图的路线规划功能 导航是目前JSAPI ...

  2. (转)投影矩阵的推导(Deriving Projection Matrices)

    转自:http://blog.csdn.net/gggg_ggg/article/details/45969499 本文乃<投影矩阵的推导>译文,原文地址为: http://www.cod ...

  3. 转载:Cellebrite携两大移动数据服务强势来华

    [IT168专稿]随着移动互联网的发展,智能终端也越来越普及,围绕整个移动互联网的产业链产生了巨大的商机.有这么一家做移动数据传输服务的厂商,他们一直专注在移动领域,为运营商和零售商以及司法部门提供服 ...

  4. 学习rabbitmq

    http://www.cnblogs.com/dubing/p/4017613.html elk+redis 搭建nginx日志分析平台 http://www.cnblogs.com/yjf512/p ...

  5. ubuntu bless 16字节每行

    打开Preferences配置 输入路径:/usr/share/bless/bless-16-bytes-per-row.layout 或者使用以下配置 cat /home/scue/.config/ ...

  6. TCP_NODELAY 和 TCP_CORK主要区别

    一句话总结: tcp_nodelay:禁止nagle算法,有需要发送的就立即发送,比较常见 tcp_cork:它是一种加强的nagle算法,过程和nagle算法类似,都是累计数据然后发送.但它没有 n ...

  7. AYUI快速开发2016-6-29 ,全部免费,WPF普遍之路梦想开启

    下载开发模板:下载 AYUI 6月29日起,免费使用,无需授权,去除所有限制,关爱开发者,不求捐赠,只要你们能私活挣到钱就行,你们没有欠我的.我希望所有人都能开发WPF的东西 使用教程,上面的下载文件 ...

  8. 所有文章都迁移到我自己的博客了:http://blog.neazor.com

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  9. JDBC性能分析与优化

    JDBC性能分析与优化V1.0http://www.docin.com/p-758600080.html

  10. 针对 SQL Server 2008 在Windows Server 2008上的访问配置 Windows 防火墙

    现在Windows Server 2008 服务器用的越来越多,2008的防火墙比2003的有了很大的增强,安全性有了更大的提高. 甚至80端口的出站默认都是被关闭的.所以如果在2008Server上 ...