如何创建索引

原文:如何创建索引

通过前面二篇文章我们基本学会了如何结合执行计划分析出某Sql语句的性能问题,既然有性能问题的地方已经找到了,接下来就是如何优化查询来提高查询性能,而优化查询最重要的武器就是创建索引,这篇文章就来总结如何创建索引来提高查询速度,主要从以下几个方面来总结。

  1. 了解索引
  2. 创建索引的语法
  3. 结合实例演示如何创建索引

了解索引

   1,索引是什么?

    在Sql Server中,索引是一种增强式的存在,这表示即使没有索引,Sql Server的功能并不会受到影响。索引是对数据库表中一列或多列的值进行排序的一种结构(B树),使用索引可快速访问数据库表中的特定信息。

  2,为什么要使用索引?

    就是提高查询性能。

  3,有哪些索引?

    主要分为聚集索引(CLUSTERED INDEX)和非聚集索引(NONCLUSTERED INDEX)两种,聚集索引指的是一列或多列的物理顺序和逻辑顺序是一致的,一个数据库表只能有一个聚集索引,我们通常将主键(一般为自增int型)设为聚集索引。而非聚集索引则可以有多个,而且非聚集索引并不会改变数据库表的物理结构。

创建索引的语法

  1,创建索引,sql语法如下。  

-- 建立索引
IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_orderdate')
    CREATE NONCLUSTERED INDEX idx_nc_orderdate ON Sales.Orders(orderdate);
GO

  2,删除索引,sql语法如下。

-- 删除索引
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_orderdate')
    DROP INDEX idx_nc_orderdate ON Sales.Orders;
GO

结合实例演示如何创建索引

  表结构如下:

  现在的需求是,查询2006年7月1日到2007年7月31日的所有订单,并按requireddate字段排序,查询sql代码如下:

USE TSQLFundamentals2008;
GO

-- 查询2006年7月1日到2007年7月31日的所有订单,并按requireddate字段排序
SELECT orderid,orderdate,requireddate,shippeddate,shipname,shipaddress FROM Sales.Orders
WHERE orderdate>='20060701' AND orderdate<'20070801'
ORDER BY requireddate;

  注意,这个表只有主键orderid的聚集索引外,没有建立任何索引。执行查询查看执行计划,如下图。

  从上面的执行计划可以看出,在排序和聚集索引查找方面比较耗时。首先看排序,因为是by requireddate排序的,所以对requireddate字段要建立单个字段索引,代码如下。

IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_requireddate')
    CREATE NONCLUSTERED INDEX idx_nc_requireddate ON Sales.Orders(requireddate);
GO

  然后因为where条件中是按orderdate字段来限定范围的,所以对orderdate字段要建立单个字段索引,代码如下。

IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_orderdate')
    CREATE NONCLUSTERED INDEX idx_nc_orderdate ON Sales.Orders(orderdate);
GO

  因为要查询的字段为orderid,orderdate,requireddate,shippeddate,shipname,shipaddress,所以我们可以针对这几个字段建立一个组合字段索引,代码如下。

IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_orders_orderid_orderdate_shipaddress')
    CREATE NONCLUSTERED INDEX idx_orders_orderid_orderdate_shipaddress ON Sales.Orders(orderid,orderdate,requireddate,shippeddate,shipname,shipaddress);
GO

  最后,我们再重新运行一次查询,查看执行计划,如下图。

  从执行计划中可以看到,后面那个已经变成了非聚集索引查询了,说明我们创建的索引起作用了。具体是创建单个字段索引,组合字段索引还是两个都要创建,这个要在实际的项目中反复试验。

参考资料

1,CareySon的 T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

2,田园里的蟋蟀的 程序员眼中的 SQL Server-执行计划教会我如何创建索引?

时间: 2024-10-03 17:18:28

如何创建索引的相关文章

pymongo给mongodb创建索引的简单实现方法

  这篇文章主要介绍了pymongo给mongodb创建索引的简单实现方法,涉及Python使用pymongo模块操作mongodb的技巧,需要的朋友可以参考下 下面的代码给user的user_name字段创建唯一索引 ? 1 2 3 4 import pymongo mongo = pymongo.Connection('localhost') collection = mongo['database']['user'] collection.ensure_index('user_name',

SQL Server:创建索引视图

server|创建|视图|索引 视图也称为虚拟表,这是因为由视图返回的结果集其一般格式与由列和行组成的表相似,并且,在 SQL 语句中引用视图的方式也与引用表的方式相同.标准视图的结果集不是永久地存储在数据库中.查询每次引用视图时,Microsoft SQL Server 2000 会动态地将生成视图结果集所需的逻辑合并到从基表数据生成完整查询结果集所需的逻辑中.生成视图结果的过程称为视图具体化.有关更多信息,请参见视图解析. 对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别

创建索引对SQL语句执行的影响

一.创建索引对执行计划的影响 在SQL开始执行之前,Oracle会确定SQL语句的执行计划,并按照执行计划的步骤访问相应的表和索引. 一旦执行计划确定下来,Oracle会按照这个执行计划完成SQL语句的执行,在SQL语句执行开始之后建立的索引不会改变SQL语句的执行计划. 因此,创建索引不会对执行计划有任何的影响,也就不会对运行中的SQL语句有影响.下面通过一个例子简单验证一下: SQL> CREATE TABLE TEST (ID NUMBER, FID NUMBER, NAME VARCHA

创建索引

8.2.1 用CREATE INDEX 命令创建索引CREATE INDEX 既可以创建一个可改变表的物理顺序的簇索引,也可以创建提高查询性能的非簇索引.其语法如下:CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]INDEX index_name ON {table | view } column [ ASC | DESC ] [,...n])[WITH[PAD_INDEX][ [, ] FILLFACTOR = fillfactor][ [, ] IGNOR

中文Access2000速成教程--1.7 创建索引

access|创建|教程|速成|索引|中文 第七讲 创建索引 若要快速查找和排序记录,就需要索引单个字段或字段的组合.对于某一张表来说,建立索引的操作就是要指定一个或者多个字段,以便于按这个或者这些字段中的值来检索数据,或者排序数据.在中文Access 2000中能建立的索引如下所述. 1.创建单字段索引 "单字段索引"的意思是一张表中只有一个用于索引的字段,使用下列步骤进行操作可以建立它: 步骤一.在"设计"视图中打开表. 步骤二.在"设计"视

MS SQL基础教程:创建索引

8.2.1 用CREATE INDEX 命令创建索引 CREATE INDEX 既可以创建一个可改变表的物理顺序的簇索引,也可以创建提高查询性能的非簇索引.其语法如下: CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name ON {table | view } column [ ASC | DESC ] [,...n]) [WITH [PAD_INDEX] [ [, ] FILLFACTOR = fillfactor] [ [,

Access2000如何创建索引

  Access2000如何创建索引: 若要快速查找和排序记录,就需要索引单个字段或字段的组合.对于某一张表来说,建立索引的操作就是要指定一个或者多个字段,以便于按这个或者这些字段中的值来检索数据,或者排序数据.在中文Access 2000中能建立的索引如下所述. 1.创建单字段索引 "单字段索引"的意思是一张表中只有一个用于索引的字段,使用下列步骤进行操作可以建立它: 步骤一.在"设计"视图中打开表. 步骤二.在"设计"视图的字段列表中单击要创

SQLSERVER 创建索引实现代码

什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K.为了加快查找的速度,汉语字(词)典一般都有按拼音.笔画.偏旁部首等排序的目录(索引),我们可以选择按拼音或笔画查找方式,快速查找到需要的字(词).  同理,SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度.  • SQL Server中的数据也是按页(4KB)存放  • 索引:是SQL Server编排数据的内部方

给sqlserver中的表创建索引

  给sqlserver中的表创建索引 #!/usr/bin/perl use DBI; use Switch; use Encode; use Encode::CN; # my $source_name = "zoe"; # my $source_user_name = "sa"; # my $source_user_psd = "123"; # my $db_name="mysqlDb"; # my $location=&

Lucene5学习之创建索引入门示例

    Lucene更新实在太快了,只好紧跟脚步开始学习Lucene5,花了点时间写了一个demo,就是程序根据用户提供的一个文件夹,读取该文件夹下的所有文件,然后读取文件里的内容写入索引.读取文件部分采用的是最新的NIO2.0API,因此,JDK必须使用1.7及以上版本.Lucene5开发压缩包请在Lucene官网下载.不多说了,对于码农来说,最直接的就是上代码. Java代码   package com.yida.framework.lucene5.core;      import jav