zoukankan      html  css  js  c++  java
  • Sql Server索引

    可以利用索引快速访问数据库表中的特定信息。索引是对数据库表中一个或多个列(例如,employee 表的姓氏 (lname) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

    先创建一个示例表temp

    对表中Name字段创建一个索引

    if exists(select name from sysindexes where name = 'suoyin')
    drop index temp.suoyin ---如果存在这个名字的索引,则删除这个索引
    create nonclustered index suoyin_name on temp(Name)
     
    --创建索引时正确的,查询的时候出了问题
    --(2)查询索引
    select * from temp with(index=suoyin_name) where Name = 'A'
    
    --查看temp表的索引信息
    sp_helpindex temp

    语法

    CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]
    INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
    [with[PAD_INDEX][[,]FILLFACTOR=fillfactor]
    [[,]IGNORE_DUP_KEY]
    [[,]DROP_EXISTING]
    [[,]STATISTICS_NORECOMPUTE]
    [[,]SORT_IN_TEMPDB]
    ]
    [ ON filegroup ]


    CREATE INDEX命令创建索引各参数说明如下: UNIQUE:用于指定为表或视图创建唯一索引,即不允许存在索引值相同的两行。 CLUSTERED:用于指定创建的索引为聚集索引。 NONCLUSTERED:用于指定创建的索引为非聚集索引。 index_name:用于指定所创建的索引的名称。 table:用于指定创建索引的表的名称。 view:用于指定创建索引的视图的名称。 ASC
    |DESC:用于指定具体某个索引列的升序或降序排序方向。 Column:用于指定被索引的列。 PAD_INDEX:用于指定索引中间级中每个页(节点)上保持开放的空间。 FILLFACTOR = fillfactor:用于指定在创建索引时,每个索引页的数据占索引页大小的百分比,fillfactor的值为1到100。 IGNORE_DUP_KEY:用于控制当往包含于一个唯一聚集索引中的列中插入重复数据时SQL Server所作的反应。 DROP_EXISTING:用于指定应删除并重新创建已命名的先前存在的聚集索引或者非聚集索引。 STATISTICS_NORECOMPUTE:用于指定过期的索引统计不会自动重新计算。 SORT_IN_TEMPDB:用于指定创建索引时的中间排序结果将存储在 tempdb 数据库中。 ON filegroup:用于指定存放索引的文件组。
    --创建聚集索引(一个表中允许一个聚集索引)
    CREATE  CLUSTERED  INDEX [tTopIndex] ON  [TableName] ([P_ID]) ON [PRIMARY]
    --创建非聚集索引
    CREATE  INDEX [tTopIndex] ON TableName ([P_ID]) ON [PRIMARY]
    --删除索引
    drop index [TableName].[tTopIndex]

      create   index   yourindex   on   yourtable(id,name,city)   
    你在查询的时候 :  select   id,name,city  from   yourtable     这时候查询优化器,不在扫描表了,而是直接的从索引中拿数据

    聚集索引用于:
    包含大量非重复值的列。
    使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。
    被连续访问的列。
    返回大型结果集的查询。

    非聚集索引用于:
    包含大量非重复值的列,如姓氏和名字的组合(如果聚集索引用于其它列)。如果只有很少的非重复值,如只 有 1 和 0,则大多数查询将不使用索引,因为此时表扫描通常更有效。
    不返回大型结果集的查询。
    返回精确匹配的查询的搜索条件(WHERE 子句)中经常使用的列。
    经常需要联接和分组的决策支持系统应用程序。应在联接和分组操作中使用的列上创建多个非聚集索引,在任何外键列上创建一个聚集索引

    一个表可以有多个非聚集索引,但只能有一个聚集索引。

    如果该表上尚未创建聚集索引,且在创建 PRIMARY KEY 约束时未指定非聚集索引,

    PRIMARY KEY 约束会自动创建聚集索引

    创建索引的作用是可以大大提高系统的性能

    创建索引的优点和缺点

    优点:

    第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
    第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
    第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
    第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 

    缺点:

    第一,创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。
    第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 

    应该在这些列 上创建索引,例如:

    在经常需要搜索的列上,可以加快搜索的速度;
    在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
    在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;
    在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
    在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
    在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。


    同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:

    第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因 为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
    第二,对于那 些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比 例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
    第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
    第四,当修改性能远远大于检索性能时,不应该创建索 引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因 此,当修改性能远远大于检索性能时,不应该创建索引。 

    --删除索引
    if exists(select name from sysindexes where name = 'suoyin')
    drop index temp.suoyin ---如果存在这个名字的索引,则删除这个索引
    create nonclustered index suoyin_name on temp(Name)
    
    --主键,加聚集索引
    ALTER TABLE [dbo].[Fct_FrequencyOrder] ADD  CONSTRAINT [PK_Fct_FrequencyOrder] PRIMARY KEY CLUSTERED (
        [FrequencyOrderId] ASC
    )
    go
    
    CREATE NONCLUSTERED INDEX [IX_Code] ON [dbo].[Fct_Product] ([ProductCode]) ON [PRIMARY]
    GO
    
    CREATE INDEX [IX_OrderId] ON [dbo].[Fct_FrequencyOrder]
    ([OrderId] ASC)
    GO
    
    CREATE INDEX [IDX_Disabled_ChannelCommodityCodeAndName] ON [dbo].[Fct_ChannelCommodity]
    ([Disabled] ASC) 
    INCLUDE ([ChannelCommodityCode], [ChannelCommodityName]) 
    GO
    
    CREATE UNIQUE INDEX [IDX_SiteWarehouseAndSerialNumber] ON [dbo].[Fct_AutoPrintRequestInfo]
    ([SerialNumber] ASC, [SiteWarehouseId] ASC) 
    WITH (IGNORE_DUP_KEY = ON)
    GO
    
    CREATE UNIQUE INDEX [IX_wms_StockMove_MoveNo] ON [dbo].[Fct_StockMove]
    ([MoveNo] ASC) 
    WITH (IGNORE_DUP_KEY = ON)
    GO

    数据库建立索引常用的规则如下:

    1、表的主键、外键必须有索引;

    2、数据量超过300的表应该有索引; 

    3、经常与其他表进行连接的表,在连接字段上应该建立索引; 

    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

     5、索引应该建在选择性高的字段上;

    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

     7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否 极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

     8、频繁进行数据操作的表,不要建立太多的索引;

    9、删除无用的索引,避免对执行计划造成负面影响;

     以上是一些普遍的建立索引时的判断依据。 索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。 因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。 

    总的来说,小型表肯定不建索引, 或者数据库记录在亿条数据级以上,还是建议使用非关系型数据库。 还有些特殊字段的数据库,比如BLOB,CLOB字段肯定也不适合建索引。 

    NULL 值与索引

    无论是单列唯一索引或复合唯一索引,对于可以为null的列或复合null值,Oracle不会为其存储索引值。

        故在基于单列创建B树唯一索引或多列创建B树复合唯一索引的情形下,

        当列上允许为null值时

            where子句使用了基于is null的情形,其执行计划走全表扫描。

            where子句使用了基于is not null的情形,其执行计划走索引扫描(索引范围扫描或索引全扫描)。

        当列上不允许为null值时,存在非null约束

            where子句使用了基于is null的情行,其执行计划走索引扫描。

            where子句使用了基于is not null的情形,其执行计划也是走索引扫描。

    注:此在Oracle 10g R2(linux)下的情形,不同的优化器版本可能会有偏差。

    col like “abc%” 能用上索引
    col like “%abc”不能用上索引

    http://www.cnblogs.com/sunwei2012/archive/2012/07/10/2585524.html  适合建索引?不适合建索引?分析

    http://blog.csdn.net/leshami/article/details/7437561  NULL 值与索引(一)

    http://blog.csdn.net/leshami/article/details/7438397  NULL 值与索引(二)

  • 相关阅读:
    HashMap put get 源码解析
    HashMap 源码
    配置spring boot请求的入参和出参json数据格式
    配置idea的注释模板
    基本数据类型
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/4992955.html
Copyright © 2011-2022 走看看