赞
踩
这是一个很重要的概念,我们知道数据在计算机中其实是分页存储的,就像是单词存在字典中一样
数据库索引可以帮助我们快速定位数据在哪个存储页区,而不用扫描整个数据库
索引一旦被创建就会数据库自动管理和维护,增删改插座数据库都会对索引做修改
聚集索引,就是相当于排序的字典(将表中的数据完全重新排序),一个表只有一个,所占空间相当于表中数据的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种触发器:
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
防止用户修改员工姓名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'
- BACKUP DATABASE 销售管理
- TO COMB
- RESTORE DATABASE COMB
- FROM DISK='E:/DATA/COMB.BAK'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。