前期准备:

create table Employee (
            ID int not null primary key,
            Name nvarchar(4),
            Credit_Card_ID varbinary(max)); --- 小心这种数据类型。
            go

说明:本表上的索引,都会在创建下一个索引前删除。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

操作 1、

创建聚集索引

方法 1、

alter table table_name add constraint cons_name priamry key(columnName ASC|DESC,[.....]) with (drop_existing = on);

alter table Employee
               add constraint PK_for_Employee primary key clustered (ID);
               go

这个是一种特别的方法,因为在定义主键的时候,会自动添加索引,好在加的是聚集索引还是非聚集索引是我们人为可以控制的。

通过sp_helpindex 可以查看表中的索引

execute sp_helpindex @objname = 'Employee';

go

               

注意、

这个索引是无法删除的,不信! 你去删一下

drop index Employee.PK__Employee__3214EC277D95E615;

go

                     

方法 2、

create clustered index ix_name on table_name(columnName ASC|DESC[,......]) with (drop_existing = on);方法

create clustered index ix_clu_for_employee_ID on Employee(ID);

go

                 查看创建的索引

                 

操作 2、

创建复合索引

create index ix_com_Employee_IDName on Employee (ID,Name)with (drop_existing = on);

这样就算是创建一个复合索引了,不过脚下的路很长,我们看下一个复合索引的例句:

create index ix_com_Employee_IDCreditCardID on Employee(ID,Credit_Card_ID);

看到这句话,你先问一下自己它有没有错!

可以发现它错了,varbinary是不可以建索引的。

操作 3、

创建覆盖索引

create index index_name on table_Name (columnName ASC|DESC[,......]) include(column_Name_List)with (drop_existing = on);

create index ix_cov_Employee_ID_Name on Employee (ID) include(Name);
         go

首先,覆盖索引它只是非聚集索引的一种特别形式,下文说的非聚集索引不包涵覆盖索引,当然这个约定只适用于这一段话,这样做的

目的是为了说明各中的区别。

首先:

1、非聚集索引不包涵数据,通过它找到的只是文件中数据行的引用(表是堆的情况下)或是聚集索引的引用,SQL Server

要通这个引用去找到相应的数据行。

2、正因为非聚集索引它没有数据,才引发第二次查找。

3、覆盖索引就是把数据加到非聚集索引上,这样就不需要第二次查找了。这是一种以空间换性能的方法。非聚集索引也是。

只是做的没有它这么出格。

操作 4、

创建唯一索引

create unique index index_name on table_name (column ASC|DESC[,.....])with (drop_existing = on);

正如我前面所说,在创建表上的索引前,我会删除表上的所有索引,这里为什么我要再说一下呢!因为我怕你忘了。二来这个例子用的到它。

目前表是一个空表,我给它加两行数据。

insert into Employee(ID,Name) values(1,'AAA'),(1,'BBB');

这下我们为表加唯一索引,它定义在ID这个列上

create unique index ix_uni_Employee_ID on Employee(ID);
        go -- 可以想到因为ID有重复,所以它创建不了。

结论 1、 如果在列上有重复值,就不可以在这个列上定义,唯一索引。

下面我们把表清空: truncate table Employee;

接下来要做的就是先,创建唯一索引,再插入重复值。

create unique index ix_uni_Employee_ID on Employee(ID);
        go

insert into Employee(ID,Name) values(1,'AAA'),(1,'BBB');

go

       

结论 2、

定义唯一索引后相应的列上不可以插入重复值。

操作 5、

筛选索引

create index index_name on table_name(columName) where boolExpression;

create index ix_Employee_ID on Employee(ID) where ID>100 and ID< 200;
         go

只对热点数据加索引,如果大量的查询只对ID 由 100 ~ 200 的数据感兴趣,就可以这样做。

1、可以减小索引的大小

2、为据点数据提高查询的性能。

总结:

BTree 索引有聚集与非聚集之分。

就查看上到聚集索引性能比非聚集索引性能要好。

非聚集索引分    覆盖索引,唯一索引,复合索引(当然聚集索引也有复合的,复合二字,只是说明索引,引用了多列),一般非聚集索引

就查看上到非聚集索引中覆盖索引的性能比别的非聚集索引性能要好,它的性能和聚集索引差不多,可是

它也不是’银弹‘ 它会用更多的磁盘空间。

最后说一下这个

with (drop_existing = on|off),加上这个的意思是如果这个索引还在表上就drop 掉然后在create 一个新的。特别是在聚集索引上

用使用这个就可以不会引起非聚集索引的重建。

with (online = on|off) 创建索引时用户也可以访问表中的数据,

with(pad_index = on|off fillfactor = 80); fillfactor 用来设置填充百分比,pad_index 只是用来连接fillfactor 但是它又不难少,

这点无语了。

with(allow_row_locks = on|off   |   allow_page_locks = on |off);  是否允许页锁 or 行锁

with (data_compression = row | page );  这样可以压缩索引大小

      

SQL Server 创建索引的 5 种方法的更多相关文章

  1. SQL Server 创建索引方法

    转自 <SQL Server 创建索引的 5 种方法> 地址:https://www.cnblogs.com/JiangLe/p/4007091.html 前期准备: create tab ...

  2. SQL Server创建索引

    原文:SQL Server创建索引 什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的 ...

  3. SQL Server遍历表的几种方法 转载

    SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易 ...

  4. SQL Server 优化存储过程的七种方法

    原文:SQL Server 优化存储过程的七种方法 优化存储过程有很多种方法,下面介绍最常用的7种. 1.使用SET NOCOUNT ON选项 我们使用SELECT语句时,除了返回对应的结果集外,还会 ...

  5. SQL Server创建索引(转)

    什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的速度,汉语字(词)典一般都有按拼音. ...

  6. (转)SQL Server创建索引

    什么是索引拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的速度,汉语字(词)典一般都有按拼音.笔 ...

  7. SQL Server遍历表的几种方法

    在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低.当然,从面向集合操作的 ...

  8. SQL Server 创建索引

    索引的简介: 索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书. 索引主要目的是提高了SQL Server系统的性能,加快数 ...

  9. sql server创建临时表的两种写法和删除临时表

    --创建.删除临时表 --第一种方式 create table #tmp(name varchar(255),id int) --第二种方式 select count(id) as storyNum ...

随机推荐

  1. IOS开发UI篇-NavigationController的控制器之间的跳转

    一.效果图如下 1> 第一个控制器的NavigationBar隐藏 2> 有按钮,可以跳转到下一个控制器,返回上一个控制器或者根控制器 二.思路代码 思路: 1> 设置window的 ...

  2. abiword Namespace List

    abiword Namespace List Here is a list of all namespaces with brief descriptions: abicollab  这个命名空间以及 ...

  3. js 实现二叉树

    二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree),右边的总是大于左边的!二叉树的每个结点至多只有二棵子树(不存 ...

  4. DDMS files not found:hprof-conv.exe的解决办法

    或者是you must restart adb and eclipse这类错误 原因:一般是豌豆荚之类的软件影响的,所以,以后要慎用了. 解决方案:先找一下在sdk\tools目录下是否有hprof- ...

  5. FZU1862(线段树 或者 DP)

    Problem 1862 QueryProblem Accept: 100    Submit: 249Time Limit: 2000 mSec    Memory Limit : 32768 KB ...

  6. 对中级Linux 用户非常有用的20 个命令

    也许你已经发现第一篇文章非常的有用,这篇文章是继对初级Linux用户非常有用的20个命令的一个延伸. 第一篇文章的目的是为新手准备的而这篇文章则是为了Linux的中高级用户.在这里你将学会如何进行自定 ...

  7. MAC 下cocos2d-x lua 使用dragonbones的方法

    项目使用db,网上查了半天全是vs和android的流程,没查到有mac的.这里记录一下. quick-cocos-x下的使用方法: a. 将dragonbones(放入ucocos2d_libs中) ...

  8. [Exception] 当前 TransactionScope 已完成

    本文来自:http://www.cnblogs.com/loafer/archive/2010/06/03/TransactionScopeComplete.html 捕获异常的时候 经常会碰到这个异 ...

  9. 巧用DISPLAY_AWR函数与dba_hist_sqlstat结合查询SQL语句在指定节点指定时间范围内的历史执行计划

    1.问题        通过调用dbms_xplan包中DISPLAY_AWR函数(DBMS_XPLAN.DISPLAY_AWR)可以从AWR数据中查看到SQL语句的历史执行计划,但是,DISPLAY ...

  10. GCD 和延时调用

    因为 Playground 不进行特别配置的话是无法在线程中进行调度的,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. GCD 是一种非常 ...