zoukankan      html  css  js  c++  java
  • 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)只能如下出错提示:

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

    参考文章:

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

  • 相关阅读:
    struts2 委托spring代理action<转>
    Ajax中的时间戳应用<转>
    ajax的json传值方式
    单例HashTable例子
    eclipse修改vm页面JavaScript代码颜色
    Ajax表单异步提交及验证
    xml解析
    sql server 添加语句中,VALUES值需要从数据库中查询出来
    SQL substring、replace函数
    使用SQL语句操作数据库
  • 原文地址:https://www.cnblogs.com/woodytu/p/4607187.html
Copyright © 2011-2022 走看看