SQLServer 索引与数据完整性---学习笔记

索引

  • 索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针

  • 索引是一个单独的、物理的数据库结构,在SQL Server中,索引是为了加速对表中数据行的检索而创建的一种分散存储结构。
    它是针对一个表而建立的,每个索引页面中的行都含有逻辑指针,指向数据表中的物理位置,以便加速检索物理数据

  • 一个表的存储是由两部分组成的,一部分用来存放数据页,另一部分用来存放索引页。 通常索引页对于数据页来说小得多。
    在进行数据检索时,系统首先搜索索引页,从中找到所需数据的指针,
    然后通过该指针从数据页读取数据,从而提高查询速度

  • 索引是与表或视图关联的磁盘上的结构,可以加快从表或视图中检索行的速度

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

  • 索引具有以下几个缺点
    创建索引和维护索引需耗费时间,并随着数据量的增加而增加。
    索引需占用物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,
    如果建立聚集索引,那么需要的空间就会更大。
    当对表中的数据进行增加、删除和修改时,索引也要动态地维护,降低数据的维护速度。

  • 索引类型主要有以下几类:

  • 聚集索引

  • 非聚集索引

  • 唯一索引

  • 包含性列索引

  • 索引视图

  • 全文索引

  • 空间索引

  • 筛选索引

  • XML索引

  • 存储结构可以将索引分为两类:聚集索引和非聚集索引。

  • 聚集索引:根据数据行的键值在表或视图中排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序

  • 如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中

  • 聚集索引除了可以提高查询性能,还可以按需重新生成或重新组织控制表碎片

  • 非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针

  • 从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针;对于聚集表,行定位器是聚集索引键

  • 创建索引的一般原则如下。

    (1)只有表的所有者可以在同一个表中创建索引。
    (2)每个表中只能创建一个聚集索引。
    (3)每个表中最多可以创建249个非聚集索引。
    (4)在经常查询的字段上建立索引。
    (5)定义text、image和bit数据类型的列上不要创建索引。
    (6)在外键列上可以创建索引。
    (7)主键列上一定要创建索引。
    (8)在那些重复值比较多、查询较少的列上不要创建索引

  • sp_helpindex可以报告有关表或视图上索引的信息
    sp_helpindex [ @objname = ] ‘name’
    [ @objname =] 'name’表示用户定义的表或视图的限定或非限定名称

  • 修改索引名
    sp_rename [ @objname = ] ‘object_name’ ,
    [ @newname = ] ‘new_name’
    [ , [ @objtype = ] ‘object_type’ ]
    对索引进行重命名时,需要修改的索引名格式必须为“表名.索引名”

  • DROP INDEX语句可从当前数据库中删除一个或多个关系索引、空间索引、筛选索引或XML索引

  • DROP INDEX语句不能删除通过定义PRIMARY KEY或UNIQUE约束创建的索引。若要删除该约束和相应的索引,需使用带有DROP CONSTRAINT子句的ALTER TABLE
    DROP INDEX语句不能删除通过定义PRIMARY KEY或UNIQUE约束创建的索引。若要删除该约束和相应的索引,需使用带有DROP

    Drop Index Student.IX_Stu_Sno_Rename

  • 索引的选项

  • PAD_INDEX选项是设置创建索引期间中间级别页中可用空间的百分比

    对于非叶级索引页需要使用PAD_INDEX选项设置其预留空间的大小。PAD_INDEX选项只有在指定了FILLFACTOR选项时才有用,
    因为PAD_INDEX是由FILLFACTOR指定的百分比决定的。在默认情况下,给定中间级页上的键集,
    SQL Server将确保每个索引页上的可用空间至少可以容纳一个索引允许的最大行。
    如果FILLFACTOR指定的百分比不够大,无法容纳一行,SQL Server将在内部使用允许的最小值替代该百分比
    USE db_Test
    CREATE UNIQUE CLUSTERED INDEX IX_Stu_Sno
    on Student(Sno)
    with pad_index,fillfactor = 10

  • FILLFACTOR选项是设置创建索引期间每个索引页的页级别中可用空间的百分比

    FILLFACTOR(称为填充因子),指定各索引页的填满程度,
    即指定索引页上留出的额外的间隙和保留一定的百分比空间,从而扩充数据的存储容量和减少页拆分。
    FILLFACTOR选项的取值范围是1~100,表示用户创建索引时数据容量占页容量的百分比
    USE db_Test
    GO
    CREATE INDEX IX_Stu_Sname ON Student(Sname)
    WITH FILLFACTOR=80
    GO

  • PAD_INDEX主要用于预留非叶级索引页的空间,而FILLFACTOR则用于设置整个索引(包括叶级和非叶级索引页)的填充程度

  • ASC/DESC选项排序查询是指将查询结果按指定属性的升序(ASC)或降序(DESC)排列,由ORDER BY子句指明。
    ASC/DESC选项可以在创建索引时设置索引方式
    USE db_Test
    CREATE CLUSTERED INDEX MR_Stu_Sage
    ON Student (Sage DESC)
    USE db_Test
    CREATE CLUSTERED INDEX MR_Stu
    ON Student (Sage DESC,Sno ASC)

  • SORT_IN_TEMPDB选项是确定对创建索引时生成的中间排序结果进行排序的位置。
    如果为ON,排序结果存储在tempdb中;如果为OFF,则存储在存储结果索引的文件组或分区方案中
    CREATE UNIQUE CLUSTERED INDEX MR_Stu_Sno
    ON Student (Sno ASC)
    with SORT_IN_TEMPDB

  • STATISTICS_NORECOMPUTE选项指定是否自动重新计算过期的索引统计信息
    USE db_Test
    CREATE UNIQUE CLUSTERED INDEX MR_Stu
    ON Student (Sno ASC)
    with STATISTICS_NORECOMPUTE

  • UNIQUE选项是确定是否允许并发用户在索引操作期间访问基础表或聚集索引数据以及任何关联非聚集索引
    为表或视图创建唯一索引(不允许存在索引值相同的两行)。视图上的聚集索引必须是UNIQUE索引。
    如果存在唯一索引,当使用UPDATE或INSERT语句产生重复值时将回滚,并显示错误信息。
    即使UPDATE或INSERT语句更改了许多行但只产生了一个重复值,也会出现这种情况。
    如果在有唯一索引并且指定了IGNORE_DUP_KEY子句情况下输入数据,则只有违反UNIQUE索引的行才会失败。
    在处理UPDATE语句时,IGNORE_DUP_KEY不起作用
    USE db_Test
    CREATE UNIQUE CLUSTERED INDEX MR_Stu_Sno ON Student (Sno)
    WITH IGNORE_DUP_KEY

  • DROP_EXISTING选项是删除和重新创建现有索引
    删除SQL Server数据库中已存在的索引,并根据修改重新创建一个索引。
    如果创建的是一个聚集索引,并且被索引的表上还存在其他非聚集索引,通过创建可以提高表的查询性能,
    因为重建聚集索引将强制重建所有的非聚集索引
    CREATE UNIQUE CLUSTERED INDEX MR_Stu
    ON Student (Sno ASC)
    with DROP_EXISTING

  • SHOWPLAN语句显示查询语句的执行信息,包含查询过程中连接表时采取的每个步骤以及选择哪个索引
    SET SHOWPLAN_ALL { ON | OFF }
    SET SHOWPLAN_TEXT { ON | OFF }
    ON:显示查询执行信息。
    OFF:不显示查询执行信息(系统默认)
    SET SHOWPLAN_ALL是在执行或运行时设置,而不是在分析时设置。
    如果SET SHOWPLAN_ALL为ON,则SQL Server返回每个语句的执行信息但不执行语句。SQL语句不会被执行。
    在将此选项设置为ON后,将始终返回所有SQL语句的信息,直到将该选项设置为OFF为止。
    SET SHOWPLAN_TEXT是在执行或运行时设置,而不是在分析时设置。
    当SET SHOWPLAN_ TEXT为ON时,SQL Server将返回每个SQL语句的执行信息,但不执行语句。
    当该选项设置为ON后,将返回所有SQL Server语句的执行计划信息,直到将该选项设置为OFF为止

       USE db_Test
    

    GO
    SET SHOWPLAN_ALL ON
    GO
    SELECT Sname,Sex,Sage FROM Student WHERE Sex=‘男’ AND Sage >23
    GO
    SET SHOWPLAN_ALL OFF
    GO

SET SHOWPLAN_ALL:提供更全面的执行计划信息,包括更详细的执行步骤和可能的数据流信息。
SET SHOWPLAN_TEXT:提供的执行计划信息较为简洁,主要用于快速查看或调试目的。

  • STATISTICS IO语句使SQL Server显示由SQL语句生成的磁盘活动量的信息
    SET STATISTICS IO { ON | OFF }
    如果STATISTICS IO为ON,则显示统计信息;如果为OFF,则不显示统计信息。
    如果将此选项设置为ON,则所有后续的SQL语句返回统计信息,直到将该选项设置为OFF为止
    USE db_Test
    GO
    SET STATISTICS IO ON
    GO
    SELECT Sname,Sex,Sage FROM Student WHERE Sex=‘男’ AND Sage >20
    GO
    SET STATISTICS IO OFF;
    GO

  • DBCC SHOWCONTIG显示指定表的数据和索引的碎片信息。当对表进行大量的修改或添加数据后,应该执行此语句查看有无碎片
    USE db_Test
    GO
    DBCC SHOWCONTIG (Student) WITH FAST
    GO
    当扫描密度为100%时,说明表无碎片信息
    在这里插入图片描述

  • DBCC DBREINDEX语句表示对指定数据库中的表重新生成一个或多个索引
    DBCC DBREINDEX
    (
    table_name
    [ , index_name [ , fillfactor ] ]
    )
    [ WITH NO_INFOMSGS ]
    table_name:包含要重新生成的指定索引的表名。表名必须遵循有关标识符的规则。
    index_name:要重新生成的索引名。索引名必须符合标识符规则。
    fillfactor:在创建或重新生成索引时,每个索引页上用于存储数据的空间百分比。
    WITH NO_INFOMSGS:取消显示严重级别0~10的所有信息性消息。

    使用填充因子100重建db_Test数据库中Student表上的MR_Stu_Sno聚集索引
    USE db_Test
    GO
    DBCC DBREINDEX(‘db_Test.dbo.Student’,MR_Stu_Sno, 100)
    GO

    使用填充因子100重建db_Test数据库中Student表上的所有索引
    USE db_Test
    GO
    DBCC DBREINDEX(‘db_Test.dbo.Student’,‘’,100)
    GO

  • DBCC INDEXDEFRAG语句指定表或视图的索引碎片整理
    USE db_Test
    GO
    DBCC INDEXDEFRAG (db_Test,Student,MR_Stu_Sno)
    GO在这里插入图片描述

  • 全文索引是一种特殊类型的基于标记的功能性索引,它是由SQL Server全文引擎生成和维护的。
    生成全文索引的过程不同于生成其他类型的索引,全文引擎并非基于特定行中存储的值来构造B树结构,
    而是基于要编制索引的文本中的各个标记来生成倒排、堆积且压缩的索引结构
    sp_fulltext_database用于初始化全文索引,或者从当前数据库中删除所有的全文目录
    sp_fulltext_database [@action=] ‘action’
    [@action=] 'action’表示要执行的操作。action的数据类型为varchar(20)

         USE db_Test
    

    EXEC sp_fulltext_database ‘enable’
    在这里插入图片描述

  • sp_fulltext_table用于标记或取消标记要编制全文索引的表
    sp_fulltext_table [ @tabname = ] ‘qualified_table_name’
    , [ @action = ] ‘action’
    [ , [ @ftcat = ] ‘fulltext_catalog_name’
    , [ @keyname = ] ‘unique_index_name’ ]
    [@tabname =] ‘qualified_table_name’:表名。该表必须存在当前的数据库中。数据类型为nvarchar(517),无默认值。
    [@action =] ‘action’:将要执行的动作。action的数据类型为varchar(20),无默认值,取值如表13.6所示
    [@ftcat =] ‘fulltext_catalog_name’:create动作有效的全文目录名。对于所有其他动作,该参数必须为NULL。
    fulltext_catalog_name的数据类型为sysname,默认值为NULL。
    [@keyname =] ‘unique_index_name’:有效的单键列,create动作在qualified_table_name上的唯一的非空索引。
    对于所有其他动作,该参数必须为NULL。unique_index_name的数据类型为sysname,默认值为NULL
    在这里插入图片描述

  • 用表启用全文索引的操作步骤如下。
    (1)为要启用全文索引的表创建一个唯一的非空索引。
    (2)用表所在的数据库启用全文索引。
    (3)在该数据库中创建全文索引目录。
    (4)用表启用全文索引标记。
    (5)向表中添加索引字段。
    (6)激活全文索引。
    (7)启动完全填充。

    CREATE UNIQUE CLUSTERED INDEX MR_Emp_ID_FIND ON Employee (ID) --将Employee表设为唯一索引
    WITH IGNORE_DUP_KEY
    if (select DatabaseProperty(‘db_Test’,‘IsFulltextEnabled’))=0 --判断db_Test数据库是否可以创建全文索引
    EXEC sp_fulltext_database ‘enable’ --数据库启用全文索引
    EXEC sp_fulltext_catalog ‘ML_Employ’,‘create’ --创建全文索引目录为ML_Employ
    EXEC sp_fulltext_table ‘Employee’,‘create’,‘ML_Employ’,‘MR_Emp_ID_FIND’ --表启用全文索引标记
    EXEC sp_fulltext_column ‘Employee’,‘Name’,‘add’ --添加全文索引字段
    EXEC sp_fulltext_table ‘Employee’,‘activate’ --激活全文索引
    EXEC sp_fulltext_catalog ‘ML_Employ’,‘start_full’ --启动表的全文索引的完全填充

  • DROP FULLTEXT INDEX从指定的表或索引视图中删除全文索引
    DROP FULLTEXT INDEX ON table_name (table_name表示包含要删除的全文索引的表或索引视图的名称)

  • 维护全文目录
    (1)完全填充。
    EXEC sp_fulltext_table ‘Employee’,‘start_full’
    (2)增量填充
    EXEC sp_fulltext_table ‘Employee’,‘start_incremental’
    (3)更改跟踪
    EXEC sp_fulltext_table ’ Employee ',‘start_change_tracking’
    (4)后台更新。
    EXEC sp_fulltext_table ’ Employee ',‘start_background_updateindex’
    (5)清除无用的全文目录
    EXEC sp_fulltext_service ‘clean_up’
    (6)sp_help_fulltext_catalogs 返回指定的全文目录的ID(ftcatid)、名称(NAME)、根目录(PATH)、状态(STATUS)以及
    全文索引表的数量(NUMBER_FULLTEXT_TABLES)
    在这里插入图片描述
    在这里插入图片描述

  • (7)sp_help_fulltext_tables:该存储过程返回为全文索引注册的表的列表

          ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d3d2ded1e4c143fdb33a9ae73e4c53dc.png)
    
  • (8)sp_help_fulltext_columns:该存储过程返回为全文索引指定的列
    在这里插入图片描述

    在这里插入图片描述

  • 数据完整性主要体现在以下几个方面。
    数据类型准确无误。
    数据取值符合规定的范围。
    多个数据表之间的数据不存在冲突。

  • 4种数据完整性机制:域完整性、实体完整性、引用完整性和用户定义完整性

  • 域完整性域是指数据表中的列(字段),域完整性就是指列的完整性。

  • 实现域完整性的方法:
    限制类型(通过数据类型)、
    格式(通过CHECK约束和规则)
    可能的取值范围(通过CHECK约束、DEFAULT定义、NOT NULL定义和规则)等,
    它要求数据表中指定列的数据具有正确的数据类型、格式和有效的数据范围。

  • 域完整性常见的实现机制包括以下几种。
    默认值(default value)。
    检查(check)。
    外键(foreign key)。
    数据类型(data type)。
    规则(rule)。

  • 实体完整性是指所有的记录都应该有一个唯一的标识,以确保数据表中数据的唯一性

  • 实施实体完整性。

    唯一索引(unique index)。
    主键(primary key)。
    唯一键(unique key)。
    标识列(identity column)

  • 引用完整性又称参照完整性,其保证主表中的数据与从表中数据的一致性。
    SQL Server数据库中,参照完整性的实现是通过定义外键与主键之间或外键与唯一键之间的对应关系实现的。
    引用完整性确保键值在所有表中一致

  • 引用完整性的实现方法如下:
    (1)外键(foreign key)。
    (2)检查(check)。
    (3)触发器(trigger)。
    (4)存储过程(stored procedure)

  • 用户定义完整性使用户可以定义不属于其他任何完整性类别的特定业务规则。
    所有完整性类别都支持用户定义完整性,这包括CREATE TABLE中所有列级约束和表级约束、存储过程以及触发器

  • 34
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值