课程目录

一、SQL Server开发必备课程介绍

1.1、SQL Server开发必备课程介绍在日常生活中,我们经常需要使用数据库来处理许多事情,许多管理系统都是建立在数据库的基础上的,数据库作为我们日常工作中必备可少的一门技能,开发人员必须掌握这门核心技能才能算优秀 。本课程是收录阿笨在工作中的一些总结的关于SQL SERVER的实战开发技能知识, 所以课程知识点有点“凌乱”,希望能够实际的帮助到大家。

身为一名C#高级开发人员,这些数据库合知识不掌握不合适!

福利:本次课程会不断的补充新的知识点,到时候也会给大家进行分享。关于如何快速的提升SQL SERVER技能,阿笨总结了一下:多想,多看,多练。只有这样理论+实战才能做到熟练生巧,得心应手的地步。

本次分享课程适合人群和学习方式:

1)、必须具备一定的SQL SERVER基础知识(新手慎入)。

2)、必须做到一看,二思,三练习。

废话不多说,直接上干货。我们不生产干货,我们只是干货的搬运工。

二、课程包含知识点如下

SQL Server数据库开发必备技能实战(第一章)

1、你必须了解SQL Server查询语句执行顺序

2、SQL Server批量(整体)更新两个关联表数据的方法

3、SQL Server批量(部分)更新两个关联表数据的方法

4、SQL Server表变量和表类型

5、SQL Server XML类型变量

6、SQL SERVER存储过程批量导入和更新数据(数据同步)

SQL Server数据库开发必备技能实战(第二章)

2.1、一图搞懂SQL Server中的各种关联

2.2、SQL Server临时表

2.3、SQL Server中Merge子句

2.4、SQL Server中OUTPUT子句

2.5、SQL Server中CTE表达式

2.6、SQL Server CONCAT和FORMAT函数

2.7、SQL Server时间戳timestamp

时间戳timestamp实际应用场景介绍:

1、防止数据出现并发修改问题。

2、timestamp实现获取增量(新增和修改)数据同步。

2.8、SQL Server中STUFF函数

2.9、SQL Server中group_concat合并数据为一行

一、理解索引的结构

  索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。

  SQL Server 中数据存储的基本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。

  下面我们先简单的了解一下索引的体系结构:

  1. 聚集索引结构

  在 SQL Server 中,索引是按 B 树结构进行组织的。

  聚集索引单个分区中的结构:

--建立UserAddDate聚集索引 Create CLUSTERED INDEX [IX_AddDate] ON [User] ( [AddDate] ASC )   

  聚集索引(Clustered Index)特点

聚集索引的叶节点就是实际的数据页

聚集索引中的排序顺序仅仅表示数据页链在逻辑上是有序的。而不是按照顺序物理的存储在磁盘上

行的物理位置和行在索引中的位置是相同的

每个表只能有一个聚集索引

聚集索引的平均大小大约为表大小的5%左右

  2. 非聚集索引结构

  非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:

  1. 基础表的数据行不按非聚集键的顺序排序和存储。

  2. 非聚集索引的叶层是由索引页而不是由数据页组成。

  下图示意了单个分区中的非聚集索引结构:

  包含列的索引

  通过将包含列(称为非键列)添加到索引的叶级,可以扩展非聚集索引的功能。键列存储在非聚集索引的所有级别,而非键列仅存储在叶级别。

  下面举个简单的例子来说明一下聚集索引和非聚集索引的区别:

  我们有一本汉语字典,可以把它的正文本身看做是一个聚集索引,它是按照汉字拼音的开头字母排序的,不再需要查找其他目录。当遇到不认识的字时,需要结合“部首目录”和“检字表”, 先找到目录中的结果,然后再翻到您所需要的页码。通过这种方法查到的目录中字的排序并不是真正的正文的排序方法。把这种看做是一个非聚集索引。

  另外,请注意每个表只能有一个聚集索引。

--建立UserAddDate非聚集索引 Create NONCLUSTERED INDEX [IX_AddDate] ON [User] ( [AddDate] ASC )   

  非聚集索引 (Unclustered Index) 特点

非聚集索引的页,不是数据,而是指向数据页的页。

若未指定索引类型,则默认为非聚集索引。

叶节点页的次序和表的物理存储次序不同

每个表最多可以有249个非聚集索引

在非聚集索引创建之前创建聚集索引(否则会引发索引重建)

  二、选择建立哪种索引

  1. 何时创建聚集索引更能提高性能

  Clustered Index会提高大多数table的性能,尤其是当它满足以下条件时:

  独特, 狭窄, 持续增长的,最好是只向上增加。例如:

Identity

Date, identity

GUID (only when using newsequentialid() function)  

  2. 非聚集索引提高性能的方法

  非聚集索引由于B树的节点不是具体数据页,有时候由于这个原因,会导致非聚集索引甚至不如表遍历来的快。但是,非聚集索引有个特性,如果你要查询的内容,在非聚集索引中以及被覆盖到了,则不需要继续到聚集索引,或者RID(heap结构中的行标识符)中去寻找数据了,这时候就可以很大的提高性能,这就是覆盖面(Covering) 的问题。

  由于聚集索引叶子节点就是具体数据,所以聚集索引的覆盖率是100%, 通过提高覆盖面来提高性能的问题也就只有非聚集索引(Nonclustered Indexes)才存在。

  当查询中所有的columns都包括在index上时,我们说这 index covers the query. Columns的顺序在此不重要(Select 时候的顺序不重要,但是Index 建立的顺序可得小心了)。

  在 SQL Server 2005 中,为了提高这种 Covering 带来的好处,甚至可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。

  补充:只有查询在具有高度选择性的情况下,非聚集索引才有优势。

  三、使用聚集索引或非聚集索引的场景 (注:优先级依次为推荐,应,不应)

  四、主键和聚集索引的比较

  以下是一些大众点评网中测试使用的示例:

CHECKPOINT 

DBCC DropCLEANBUFFERS 

SET STATISTICS IO ON 

declare @d datetime 

set @d=getdate() 

Select * FROM User Where AddDate>'2008-06-01' AND AddDate<'2008-06-10' 

select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate()) 

--(45077 行受影响) 

--表'User'。扫描计数1,逻辑读取1103 次,物理读取2 次,预读1090 次,lob 逻辑读取0 次,

lob 物理读取0 次,lob 预读0 次。 

--2543 

CHECKPOINT 

DBCC DropCLEANBUFFERS 

SET STATISTICS IO ON 

declare @d datetime 

set @d=getdate() 

Select * FROM User WITH (INDEX=IX_AddDate) Where AddDate>'2008-06-01' AND AddDate<'2008-06-10' 

select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate()) 

--(45077 行受影响) 

--表'User'。扫描计数1,逻辑读取45165 次,物理读取133 次,预读141 次,lob 逻辑读取0 次,

lob 物理读取0 次,lob 预读0 次。 

--3860 

  五、使用索引的代价

索引需要占用数据表以外的物理存储空间

创建索引和维护索引要花费一定的时间

当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。

课程联系1:
大学资源网客服

课程联系2:
大学资源网客服

课程联系3:
大学资源网客服

服务时间:
8:00-21:00(工作日)