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

从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)只能如下出错提示:

可以叼炸天了,大家赶紧都去体验下!

时间: 2024-08-05 11:39:55

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

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

一,非聚集索引组合索引 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引).但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引.当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度. 同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,如果不特殊说明的话一般是指单一索引.宽索引也就是索引列超过2列的索引. 设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效.拥有更多的窄索引,将给优化程序提供更多的选择余地,这通常

SQL Server性能优化(7)非聚集索引

一,新建测试表 CREATE TABLE [dbo].[Users](     [ID] [int] IDENTITY(1,1) NOT NULL,     [NAME] [char](80) NOT NULL,     [CreatTime] [datetime] NOT NULL ) ON [PRIMARY] 删除默认聚集索引,新建一个在name列上非聚集索引 插入500条数据 查看该表的页的信息 ---开启跟踪标志 DBCC TRACEON(3604,2588) --DBCC TRACEO

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

一,非聚集索引的include 非聚集索引的Include属性可以让非聚集索引包含其他列.如 CREATE NONCLUSTERED INDEX [NonIxUser] ON [dbo].[Users] (     [NAME] ASC ) INCLUDE ( [ID], [CreatTime]) GO 这表语句就是在Name列的非聚集索引上添加ID,和CreateTime列. 在上一个介绍中,我们知道在查询NAME = '张三180' 时,会出现RID,同时读取次数是3次 现在加上非聚集索引的

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

传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言,也是需要强大的数据处理能力的. 在SQL Server 2012时,SQL Server 引入了列存储索引,用以显著提供高传统数据仓库类型语句的性能,并在SQL Server 2014中做了进一步加强.本文将在对SQL Server 2012列存储索引简单介绍的基础上,进一步解释SQL Serve

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

我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我们依然可以通过对联合主键中的首列除外的其他列建立非聚集索引来提高性能.本文将对联合主键.聚集索引.非聚集索引对查询性能的影响举例说明.步骤一,建立一个测试表,并且插入350万条以上的数据. /*创建测试数据表*/create table MyTestTable(id varchar(10)not n

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

表值参数是 SQL Server 2008 中的新参数类型.表值参数是使用用户定义的表类型来声明的.使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据. 表值参数与 OLE DB 和 ODBC 中的参数数组类似,但具有更高的灵活性,且与 Transact-SQL 的集成更紧密.表值参数的另一个优势是能够参与基于数据集的操作. (注意:Transact-SQL 通过引用向例程传递表值参数,以避免创建输入数据的副本.) 在 Tra

SQL Server 2008 表变量 临时表

最近做一个报表,其中 在报表中用到了存储过程,游标,cte表达式,临时表和表变量. 在游标中循环遍历cte中的数据,把对应的数据存放在变量里面,之后把变量插入到表变量中,游标结束后,想要根据存储过程的参数对表变量进行过滤时,问题就来了. 用动态sql拼接sql语句时,就会出错.提示时没有声明表变量. 其实,表变量不能运用在动态sql中.怎么办呢?我是把表变量中的数据插入到临时表中,之后 在动态sql中实用临时表进行拼接就可以了. 不知道 大家 有没有更好的想法. 注: 临时表 : #tablen

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

当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: 1 CREATE TABLE Customers 2 ( 3 CustomerID INT NOT NULL, 4 CustomerName CHAR(100) NOT NULL, 5 CustomerAddress CHAR(100) NOT NULL, 6 Comments CHAR(185) NOT NU

SQL Server调优系列进阶篇(如何索引调优)

前言 上一篇我们分析了数据库中的统计信息的作用,我们已经了解了数据库如何通过统计信息来掌控数据库中各个表的内容分布.不清楚的童鞋可以点击参考. 作为调优系列的文章,数据库的索引肯定是不能少的了,所以本篇我们就开始分析这块内容,关于索引的基础知识就不打算深入分析了,网上一搜一片片的,本篇更侧重的是一些实战项内容展示,希望通过本篇文章各位看官能在真正的场景中找到合适的解决方法足以. 对于索引的使用,我希望的是遇到问题找到合适的解决方法就可以,切勿乱用!!! 本篇在分析出索引的优越性的同时也将负面影响