自己制作的pdf,目录包括如下:记录数据的基本格式 3聚集索引,非聚集索引 8测试中常看指标和清除缓存方法 15主键与聚集索引 18理解newid()和newsequentialid() 20索引的代价,使用场景 23Indexing for AND 27数据基本格式补充 30Indexing for OR 32Join时的三种算法 34SQL Server中约束的介绍 39比较SQL Server约束和DML触发器 48
场景
1、维护一个市民系统,有一个字段为身份证号
2、业务代码能保证不会写入两个重复的身份证号(如果业务无法保证,可以依赖数据库的唯一索引来进行约束)
3、常用SQL查询语句:SELECT name FROM CUser WHERE id_card = ‘XXX’
4、建立索引
身份证号比较大,不建议设置为主键
从性能角度出发,选择普通索引还是唯一索引?
假设字段k上的值都不重复
查询过程
1、查询语句:SELECT id FROM T WHERE k=5
2、查询过程
昨天在QQ群里讨论一个SQL优化的问题,语句大致如下:
select A,min(B) from table group by A;--A,B都没有not null约束,A列无空值,B列有空值。--存在复合索引IX_TEST(A,B)
于是手动测试,环境采用Oracle自带的scott用户下的emp表。
1.首先查看如下语句的执行计划(此时表只有主键索引):
2.添加IX_TEST(deptno,comm)后查看执行计划:
发现依然是全表扫描。
3.为deptno列添加非空约束后再次查看
很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西。这个概念是非常错误的。 主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引。 所以在一个(或一组)字段上有主键,只能说明他上面有个索引,但不一定就是聚集索引。 例如下面: 代码如下: USE [pratice] GO CREATE TABLE #tempPKCL ( ID INT PRIMARY KEY CLUSTERED –聚集索引 ) ——————————— US
索引是排好序的数据结构!可以用在 where 条件查找的字段,和order by 排序的字段,有了索引,便可以快速地定位数据所在的物理地址并找出来。
索引的分类
1.普通索引(normal):没有任何约束,主要用于提高查询效率
2.唯一索引(UNIQUE):在普通索引的基础上增加了数据唯一性的约束,可以有多个
3.主键索引(primary key):主键索引在唯一索引的基础上增加了不为空的约束,也就是 NOT NULL+UNIQUE,只能有一个
4.全文索引(FULLTEXT):MySQL 自带
1,主键的删除
ALTER TABLE TABLENAME DROP PRIMARY_KEY
执行上面的SQL可以删除主键;如果不成功可以用
ALTER TABLE TABLENAME DROP CONSTRAINTS COLUMN CASCADE; --删除约束
ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; --设置被设置为主键的列为无效
DROP INDEX INDEX_NAME; --删除主键索引
2,查看主键约束
SELECT * FR