康索特软件有限公司 SQL Server 2005数据库技能培训
3.6.8 违反约束
1. 主键重复
2. 数据列中插入空值
3.7 表关联(掌握) 3.7.1 多表关联分类
分为:
左关联(left outer join); 右关联(right outer join); 自关联(无);
内关联(inner join); 全关联(full join); 交叉关联(cross join)。
经常用到的关联有:左关联和内关联
3.7.2 注意的地方
1. 左关联用在关联左表全部数据,内关联将多表相同数据关联出来。 2. 内关联和from a1,a2..相比较,功能实现的一样,但内关联要效率些。 3. 关联操作尽量把on语句后的条件写全,这样会提高很多性能。
3.8 表索引(重点掌握) 3.8.1 基本介绍
简单地说,索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。
聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格。由于存在这种排序,所以每个表格只会有一个聚集索引。
非聚集索引在索引的叶级有一个行标识符。这个行标识符是一个指向磁盘上数据的指针。它允许每个表格有多个非聚集索引。
使用索引的代价:
1)索引需要占用数据表以外的物理存储空间。 2)创建索引和维护索引要花费一定的时间。
3)当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
3.8.2 基本操作
1. 创建索引
地址:武汉洪山区武大科技园兴业楼南楼二单元402室 电话:027-87970489
康索特软件有限公司 SQL Server 2005数据库技能培训
CREATE [UNIQUE]|[clustered]|[NULLclustered] INDEX INDEX_索引名 ON 表名 列名[,列名...] 2. 删除索引
DROP INDEX 表名.索引名
3.8.3 使用索引应注意的问题(会答对几条即可)
1. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引
而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0
2. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表
扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。 3. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进
行全表扫描,如:
select id from t where num=10 or num=20 可以这样查询:
select id from t where num=10 union all
select id from t where num=20 4. in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。
如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3
5. 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
见如下例子:
即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。 6. 必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫
描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描: select id from t where num=@num 可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
7. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进
行全表扫描。如:
地址:武汉洪山区武大科技园兴业楼南楼二单元402室 电话:027-87970489
康索特软件有限公司 SQL Server 2005数据库技能培训
即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
8. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全
表扫描。如:
select id from t where substring(name,1,3)='abc' --name以abc开头的id select id from t where datediff(day,createdate,'2005-11-30')=0 --‘2005-11-30’生成的id 应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1' 9. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将
可能无法正确使用索引。 10. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一
个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
3.9 表变量(暂不掌握)
1. 变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为
标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime)。
2. 以@前缀的表变量是本地的,因此只有在当前用户会话中才可以访问,而@@前缀的表
变量是全局的,通常都是系统变量,比如说@@error代表最近的一个T-SQL语句的报错号。
3. 表变量存放在内存中,正是因为这一点所有用户访问表变量的时候SQL Server是不需要
生成日志。
4. 表变量是不需要考虑其他会话访问的问题,因此也不需要锁机制,对于非常繁忙的系统
来说,避免锁的使用可以减少一部分系统负载。 5. 表变量另外还有一个限制就是不能创建索引,当然也不存在统计数据的问题,因此在用
户访问表变量的时候也就不存在执行计划选择的问题了(也就是意味着编译阶段后就没有优化阶段了),这一特性有的时候是件好事,而有些时候却会造成一些麻烦。
地址:武汉洪山区武大科技园兴业楼南楼二单元402室 电话:027-87970489
康索特软件有限公司 SQL Server 2005数据库技能培训
3.10 临时表(了解) 3.10.1 基本介绍
1. 临时对象都以#或##为前缀,临时表是临时对象的一种,还有例如临时存储过程、临时
函数之类的临时对象,临时对象都存储在tempdb中。
2. 以#前缀的临时表为本地的,因此只有在当前用户会话中才可以访问,而##前缀的临时
表是全局的,因此所有用户会话都可以访问。临时表以会话为边界,只要创建临时表的会话没有结束,临时表就会持续存在,当然用户在会话中可以通过DROP TABLE命令提前销毁临时表。
3. 我们前面说过临时表存储在tempdb中,因此临时表的访问是有可能造成物理IO的,当
然在修改时也需要生成日志来确保一致性,同时锁机制也是不可缺少的。
4. 临时表可以创建索引,也可以定义统计数据,因此SQL Server在处理访问临时表的语句
时需要考虑执行计划优化的问题。
5. 注意的是,因为临时表会造成物理I/O,也就是说需要从磁盘物理文件中读取临时表数
据,显然没有直接从内存读取快,所以尽量不要用临时表。
3.10.2 使用临时表应注意的问题
1. 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有
主键索引)。
2. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
3. 临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引
用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。 4. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create
table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
5. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate
table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
3.11 分区表(暂不掌握) 3.11.1 基本介绍
分区表简介
使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。
大型表:数据量巨大的表。
访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式。
分区表作用:
分区一方面可以将数据分为更小、更易管理的部分,为提高性能起到一定的作用;另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性
地址:武汉洪山区武大科技园兴业楼南楼二单元402室 电话:027-87970489
康索特软件有限公司 SQL Server 2005数据库技能培训
能是非常有帮助的。
注意:只能在 SQL Server Enterprise Edition 中创建分区函数。只有 SQL Server Enterprise Edition 支持分区。
3.11.2 分区表创建
创建分区表或分区索引可以分为以下步骤: 1. 确定分区列和分区数; 2. 确定是否使用多个文件组; 3. 创建分区函数;
4. 创建分区架构(Schema); 5. 创建分区表; 6. 创建分区索引。
四 视图(了解)
4.1 基本介绍
视图是用户查看数据的一种方式,它相当于一个虚拟的表,它有以下作用: 1. 保护敏感的数据。
2. 简化数据的查询和处理操作。在宏业系统中的条码查询就是其中的应用例子。 3. 有利于数据的交互操作。例如,跨数据库的操作。
4.2 基本操作 4.2.1 创建视图
CREATE VIEW division1_staff AS
SELECT ename, empno, job, dname FROM emp, dept
WHERE emp.deptno IN (10, 30) AND emp.deptno = dept.deptno
4.2.2 修改视图
ALTER VIEW sales_staff AS
SELECT empno, ename, deptno FROM emp
WHERE deptno = 30 WITH CHECK OPTION CONSTRAINT sales_staff_cnst
地址:武汉洪山区武大科技园兴业楼南楼二单元402室 电话:027-87970489