zoukankan      html  css  js  c++  java
  • SQL Serever学习16——索引,触发器,数据库维护

     

    sqlserver2014数据库应用技术

    《清华大学出版社》 

    索引

    这是一个很重要的概念,我们知道数据在计算机中其实是分页存储的,就像是单词存在字典中一样

    数据库索引可以帮助我们快速定位数据在哪个存储页区,而不用扫描整个数据库

    索引一旦被创建就会数据库自动管理和维护,增删改插座数据库都会对索引做修改

    索引分类:

    • 聚集索引
    • 非聚集索引
    • 包含性列索引
    • 索引视图
    • 全文索引
    • xml索引

    聚集索引,就是相当于排序的字典(将表中的数据完全重新排序),一个表只有一个,所占空间相当于表中数据的120%,数据建立聚集索引,会改变数据行的存储物理结构

    非聚集索引,不改变数据行的物理存储结构,CREATE INDEX默认建立非聚集索引,理论一个表可以有249个非聚集索引

    索引和约束

    设置主键,会自动创建PRIMARY KEY 和创建一个聚集索引

    创建UNIQUE 约束会自动创建一个唯一非聚集索引

    创建表的索引

    使用SQL语句

    CREATE INDEX IX_name_mj
    ON 买家表(买家名称)
    GO
    

     查看索引

    EXEC sp_helpindex 买家表
    

    分析索引

    查看查询计划,使用的索引(优先使用聚集索引)

    SET SHOWPLAN_ALL ON
    GO
    SELECT * FROM 买家表
    GO
    
    SET SHOWPLAN_ALL OFF
    GO
    

    显示统计信息,查看所花费的磁盘io活动量

    SET STATISTICS IO ON
    GO
    SELECT * FROM 买家表
    GO
    
    SET STATISTICS IO OFF
    GO
    

     维护索引

    数据表的增删改操作会产生大量索引碎片,索引表不连续,降低索引性能,需要整理索引

    查看索引碎片SQL

    DBCC SHOWCONTIG(买家表,PK_买家表)
    GO
    

     ssms查看索引

    索引碎片整理

    DBCC INDEXDEFRAG(销售管理,买家表,PK_买家表)
    

     触发器

    触发器是一个高级的数据约束,他是特殊的存储过程,不能通过执行sql触发,由增删改等事件自动触发

    sqlserver2014提供3种触发器:

    • DML触发器,包括事后触发器,替代触发器,CLR运行时触发器
    • DDL触发器,修改表结构触发
    • LOGIN触发器,登录的时候触发

    DML触发器

    INSERT触发器

    如果员工年龄不到18岁不执行插入操作

    CREATE TRIGGER Employee_Insert
    	ON Employee
    	AFTER INSERT
    AS
    BEGIN
    	--从INSERTED表获取新插入员工的出生年月
    	DECLARE @birthday date
    	SELECT @birthday=birthday FROM inserted
    	--判断新员工年龄
    	IF(YEAR(GETDATE())-YEAR(@birthday)<18)
    	BEGIN
    		PRINT '该员工年龄不到18岁,不能入职!'
    		ROLLBACK TRANSACTION  --回滚这个节点之前的所有操作,然后继续执行后面的语句
    	END
    END
    

    验证

    INSERT Employee VALUES('小明','2012-10-10')
    

    再验证

    INSERT Employee VALUES('小明','1912-10-10')
    

    注意主键id仍然会增长,即使刚刚的操作回滚了,id还是增加了1

     UPDATE触发器

    防止用户修改员工姓名name字段

    CREATE TRIGGER Employee_Update
    	ON Employee
    	AFTER UPDATE
    AS
    BEGIN
    	IF(UPDATE(NAME))
    	BEGIN
    		PRINT '禁止修改员工姓名!'
    		ROLLBACK TRANSACTION  --回滚这个节点之前的所有操作,然后继续执行后面的语句
    	END
    END
    

    验证

    UPDATE Employee SET NAME='XX'
    

    数据库的维护

    备份

    使用存储过程创建备份设备

    EXEC sp_addumpdevice 'DISK','COMB','E"DATACOMB.BAK'
    

    删除备份设备

    EXEC sp_dropdevice 'COMB'
    

    使用SQL创建数据库备份

    BACKUP DATABASE 销售管理
    TO COMB
    

    使用SQL还原数据库

    RESTORE DATABASE COMB
    FROM DISK='E:/DATA/COMB.BAK'
    

  • 相关阅读:
    Lyft Level 5 Challenge 2018
    Codeforces Round #514 (Div. 2)题解
    Bubble Cup 11
    不如来搞一下CDQ分治吧!
    Codeforces Round #331 (Div. 2)
    写一下中国剩余定理的证明
    codeforces Round#332Div2 题解
    GCPC2017 题解
    2017 USP Try-outs 题解
    CodeForce 387D. George and Interesting Graph
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/9563307.html
Copyright © 2011-2022 走看看