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"\DATA\COMB.BAK'
删除备份设备
EXEC sp_dropdevice 'COMB'
使用SQL创建数据库备份
BACKUP DATABASE 销售管理 TO COMB
使用SQL还原数据库
RESTORE DATABASE COMB FROM DISK='E:/DATA/COMB.BAK'

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
一位后端开发者推荐的书籍
我推荐的如下书籍,都是我看过的,觉得还不错,很有启发意义,不管是本专业出身还是其他转行过来的,我认为都有必要看看。 推荐书一: 推荐理由: 可以让你系统了解什么是软件工程,采用什么方式让开发具有高效率,而且还让你知道为什么代码要这么写,架构要这样分。这本书中,有很多文档示例可做参考,可作为软件开发的参考手册,当然了,实际情况还是不能照搬书上的,得根据业务需求而定。不过建议最好多读几遍,可以做做笔记,目前我只读了一遍,感觉有很多启发。 推荐书二: 推荐理由: 自从毕业到工作后,在开发的过程中,我发现其实我对Java还是不太了解不够深入,发现很多问题就是因为不懂其API实现原理导致的,因此出现许多问题,虽然都一一解决,但是大多通过Google、Being、百度等搜索解决的,感觉即便临时解决,但是下次仍会出现这个问题,于是觉得有必要系统的学习下Java,即便现在JDK已经出到10了,但是实际开发中用的还是JDK5和JDK6,该书主要讲JDK5和6。JDK7其实就是对JDK6中某些API升级或者某些API弃用。JDK8比较新奇的特性就是函数式编程。不过目前还未广泛应用。虽然开发中...
-
下一篇
java源码 - ReentrantLock之NonfairSync
开篇 NonfairSync和FairSync相比而言,多了一次抢占机会,其他处理逻辑几乎是一模一样。 NonfairSync的tryAcquire的操作流程中如果发现当前锁未被占用那么立即抢占锁。 FairSync的tryAcquire的操作流程中如果发现当前锁未被还需要继续判断当前线程否是头结点才能发起锁抢占java源码 - ReentrantLockjava源码 - ReentrantLock之FairSyncjava源码 - ReentrantLock之NonfairSyncjava源码 - ReentrantLock图解加锁过程 加锁过程 ReentrantLock的的锁过程如下: 1、先尝试获取锁,通过tryAcquire()实现。 2、获取锁失败后,线程被包装成Node对象后添加到CLH队列,通过addWaiter()实现。 3、添加CLH队列后,逐步的去执行CLH队列的线程,如果当前线程获取到了锁,则返回;否则,当前线程进行休眠,直到唤醒并重新获取锁了才返回。 public void lock() { sync.lock(); } static final class...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL数据库在高并发下的优化方案
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)