资源描述
SQL SERVER 培训教程
SQL SERVER 2008 简单入门
本教程是针对sql的初级者,提炼出的sql server 2008入门的基本概念和基础操作
管理研发部
2011-12-9
目录
数据库概述3
定义(其一):3
历史:3
属性:3
基本结构3
数据库管理5
安装sql server 20085
配置数据库服务器的端口外围应用6
设置数据库服务器属性9
创建登陆用户12
注册连接服务器15
查看数据库运行情况17
创建数据库18
备份数据库21
还原数据库23
导入数据26
导出数据35
创建表39
T-SQL 语句44
Sql 的执行机制44
Sql的缓存机制46
Sql 的常用的关键字和函数47
调优49
调优的工具49
查看估计的执行计划49
索引51
利用profiler53
调优的注意事项55
写语句注意事项59
资源介绍62
附件:63
SQL SERVER培训
数据库概述
定义(其一):
数据库(DataBase,DB)是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。它是一个按数据结构来存储和管理数据的计算机软件系统。数据库的概念实际包括两层意思:
(1)数据库是一个实体,它是能够合理保管数据的“仓库”,用户在该“仓库”中存放要管理的事务数据,“数据”和“库”两个概念结合成为数据库。
(2)数据库是数据管理的新方法和技术,它能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。
历史:
1951: Univac系统使用磁带和穿孔卡片作为数据存储。
最早出现的是网状 DBMS,是美国通用电气公司Bachman等人在1961年开发成功的IDS(Integrated DataStore)。网状数据库模型对于层次和非层次结构的事物都能比较自然的模拟,在关系数据库出现之前网状DBMS要比层次DBMS用得普遍。在数据库发展史上,网状数据库占有重要地位。
1970年,IBM的研究员E.F.Codd博士在刊物《Communication of the ACM》上发表了一篇名为“A Relational Model of Data for Large Shared Data Banks”的论文,提出了关系模型的概念,奠定了关系模型的理论基础。
1976年霍尼韦尔公司(Honeywell)开发了第一个商用关系数据库系统——Multics Relational Data Store
属性:
基本结构
数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。
(1)物理数据层。
它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。
(2)概念数据层。
它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。
(3)逻辑数据层。
它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。
数据库不同层次之间的联系是通过映射进行转换的。 主要特点
a实现数据共享。
数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
b减少数据的冗余度。
同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
c数据的独立性。
数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。
d数据实现集中控制。
文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
e数据一致性和可维护性,以确保数据的安全性和可靠性。
主要包括:①安全性控制:以防止数据丢失、错误更新和越权使用;②完整性控制:保证数据的正确性、有效性和相容性;③并发控制:使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用;④故障的发现和恢复:由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏
f故障恢复。
由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏。数据库系统能尽快恢复数据库系统运行时出现的故障,可能是物理上或是逻辑上的错误。比如对系统的误操作造成的数据错误等。
种类
数据库通常分为层次式数据库、网络式数据库和关系式数据库三种
1.数据结构模型
(1)数据结构
所谓数据结构是指数据的组织形式或数据之间的联系。如果用D表示数据,用R表示数据对象之间存在的关系集合,则将DS=(D,R)称为数据结构。例如,设有一个电话号码簿,它记录了n个人的名字和相应的电话号码。为了方便地查找某人的电话号码,将人名和号码按字典顺序排列,并在名字的后面跟随着对应的电话号码。这样,若要查找某人的电话号码(假定他的名字的第一个字母是Y),那么只须查找以Y开头的那些名字就可以了。该例中,数据的集合D就是人名和电话号码,它们之间的联系R就是按字典顺序的排列,其相应的数据结构就是DS=(D,R),即一个数组。
(2)数据结构种类
数据结构又分为数据的逻辑结构和数据的物理结构。数据的逻辑结构是从逻辑的角度(即数据间的联系和组织方式)来观察数据,分析数据,与数据的存储位置无关。数据的物理结构是指数据在计算机中存放的结构,即数据的逻辑结构在计算机中的实现形式,所以物理结构也被称为存储结构。这里只研究数据的逻辑结构,并将反映和实现数据联系的方法称为数据模型。
目前,比较流行的数据模型有三种,即按图论理论建立的层次结构模型和网状结构模型以及按关系理论建立的关系结构模型。
2.层次、网状和关系数据库系统
(1)层次结构模型
层次结构模型实质上是一种有根结点的定向有序树(在数学中"树"被定义为一个无回的连通图)。下图是一个高等学校的组织结构图。这个组织结构图像一棵树,校部就是树根(称为根结点),各系、专业、教师、学生等为枝点(称为结点),树根与枝点之间的联系称为边,树根与边之比为1:N,即树根只有一个,树枝有N个。
按照层次模型建立的数据库系统称为层次模型数据库系统。IMS(Information Manage-mentSystem)是其典型代表。
(2)网状结构模型
按照网状数据结构建立的数据库系统称为网状数据库系统,其典型代表是DBTG(Data Base Task Group)。用数学方法可将网状数据结构转化为层次数据结构。
(3)关系结构模型
关系式数据结构把一些复杂的数据结构归结为简单的二元关系(即二维表格形式)。例如某单位的职工关系就是一个二元关系。
由关系数据结构组成的数据库系统被称为关系数据库系统。
在关系数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关系表格的分类、合并、连接或选取等运算来实现数据的管理。dBASEII就是这类数据库管理系统的典型代表。对于一个实际的应用问题(如人事管理问题),有时需要多个关系才能实现。用dBASEII建立起来的一个关系称为一个数据库(或称数据库文件),而把对应多个关系建立起来的多个数据库称为数据库系统。dBASEII的另一个重要功能是通过建立命令文件来实现对数据库的使用和管理,对于一个数据库系统相应的命令序列文件,称为该数据库的应用系统。因此,可以概括地说,一个关系称为一个数据库,若干个数据库可以构成一个数据库系统。数据库系统可以派生出各种不同类型的辅助文件和建立它的应用系统。
数据库管理
安装sql server 2008
名词:服务器 实例 数据库
在一台服务器上安装sql server 2008 时会更具客户的选择来安装相关的组件。有时服务器需要安装msxml6来确保sql server 2008能成功安装。安装成功后,sql server 会启动服务,同时也安装了一个实例,并且一台服务器上只能有一个默认实例。该默认实例是名称(SQLEXPRESS)以服务器的名称命名,在连接的时候,本地可以使用‘.’,‘local’,服务器名称,ip地址等方式访问。如果需要在同一台服务器上安装多个实例时,需要从光盘重新安装新实例。打开sql server的管理器,
可以看到已经安装的服务,正在运行的服务,已经停止的服务。这里我安装了两个实例,其中SQLEXPRESS是默认实例,TCJACKY是命名实例。这里只有一个 SQL Server Browser 服务,改服务是用来控制用户连接数据库的服务。MSSQLSERVER是sql server的系统服务(包括各类的管理和配置等,同时还有个代理服务SQL Sever Agent(MSSQLSERVER) 改服务依赖于SQL SERVER(MSSQLSERVER)服务)。代理服务可以处理各种job和维护计划等,帮助实现自动化运作和管理。这里看到其他一些服务,是SQL SERVER的商业智能、全文搜索、分析服务和报表服务。如果有需要做bi以及dw的工作则需要用到这些服务,当然对于数据仓库和关系型数据库是不同的概念。
内容见附件:sql_server2008安装过程图解.doc
配置数据库服务器的端口 外围应用
名词 端口 外围
引申:sql语句操作
图解:
配置端口:
打开sql server 的配置管理器
选择数据库网络配置(SQL Server NetWork Configuration),然后选择协议中的tcp/ip设置,双击打开属性对话框。设置active 选项为yes,enabled 选项为yes,tcp port默认是1433端口。用户可以根据自己的需要来修改端口,修改端口后,如果用ip连接的方式访问数据库,则需要带上端口号,形式为ip,端口号(ip加逗号加端口号)。同时根据需要来启用shared memory 选项和named pipes选项。
配置完点击ok,这些设置会在数据库服务重启后生效。
配置外围:
右击数据库实例
其中的外围配置选项
这里常用的
OleAutomationEnabled选项是用来控制从数据库外读取数据以及导出数据库数据等操作的选项。
DatabaseMailEnabled选项是用来控制数据库邮件的使用。
RemoteDacEnabled 选项是用来控制管理员专用登陆的使用。
XPCmdShellEnabled 选项是用来控制在sql语句是执行系统cmd命令的使用。
Sql server 默认的情况下很多配置都是禁用的,只有在需要的时候打开,使用完后关闭。
比如要导出数据库表到excel文件,则需要修改配置AdHocRemoteQueriesEnabled
使用语句:
sp_configure 'show advanced options',1
go
reconfigure
go
sp_configure 'Ole Automation Procedures',1
go
reconfigure
设置数据库服务器属性
名词 服务器属性 内存 处理器关联 超时
在数据库实例上右击,在弹出的菜单中选择属性。然后在选择页中选择内存选项,如果在windows系统上使用超过4G的内存则需要勾选使用AWE选项。同时也可以设定数据服务器内存,如果设定服务器最小的内存大小,则数据库会锁定该大小的内存,这样有利于数据库的缓存。
选择处理器选项,可以手动管理cpu来设置其实处理器关联还是i/o关联。也可以设置自动关联,让数据库服务器来决定。
选择安全性选项,在服务器身份认证中选择SQL Server和Windows身份验证模式。不然会导致用户无法登陆。
在连接选项中,设置最大的并发连接数,以及勾选允许远程连接到此服务器,设置查询超时时间。执行用户的查询操作,如果超出该时间,则会终止查询,并提示查询超时。
最后点击确定保存。
创建登陆用户
名词 用户 架构 权限 角色
图解:
在数据库安全性目录下,双击登陆,即可看到已经存在的登陆用户名。右击登陆,在弹出的菜单中选择新建登陆。
在弹出的界面中输入登录名,使用sql server身份验证,然后输入密码,勾选强制密码策略,取消强制密码过期。同时选择默认数据库BBS。这样用户在登陆后自动连接到该指定的数据库。
通常服务器角色使用public就可以了。在用户映射选择页中勾选BBS数据库。
在状态选择页中设置运行连接到数据库引擎和启用登录,不然新建的用户无法登陆数据库。
注册连接服务器
名词 注册数据库 数据库引擎
注册连接的服务器,方便下次登陆,不用再输入用户名和密码。
在菜单栏里选择视图,然后选择已注册的服务器选项,打开已经注册的服务器管理器
右击本地数据库组在菜单栏中选择新建服务器注册
在弹出的新建服务器注册对话框中可以输入服务器的名称或者选择下拉框中的服务器同时选择相应的登陆身份验证。点击测试来测试连接是否成功。测试成功后,点击保存即可。
双击已注册的服务器即可进入该数据库的对象资源管理器
查看数据库运行情况
名词 活动监视器
右击数据库实例,在弹出的菜单中选择活动监视器(Activtiy Monitor)
在弹出的展示界面中,上面一部分是图形化显示处理器时间、等待任务数,数据库i/o以及批请求速率等统计信息。在下面的一部分可以点击标题进行展开,来查看相应的具体细节内容。
可以利用活动监视器来监视数据库服务器的工作情况,对收集到的数据进行统计和分析。
创建数据库
名词 mdf ldf 数据库恢复模式
引申:sql语句操作
创建简单的数据库操作:
右击数据库,在弹出的菜单中选择新建数据库。
输入数据库名称,默认的数据库路径是按照的路径,可以根据需要修改路径位置。初始大小以及自动增长大小,要按照业务的需求来进行设定。这样一方面不会使数据库不停的请求扩充空间,另一方面也可以控制数据库一次要求扩充的空间不会太大。
选择左上角的选项一栏,弹出数据库配置界面,其中回复模式有三种:完整,大容量日志和简单,兼容级别有3种,为的是向下兼容2005,和2000.比如在sql server 2000这个兼容模式下创建的数据库,经过备份后可以在sql server 2000的实例上进行恢复。
点击脚本按钮查看sql语句。
所有的这些操作,可以点击菜单栏上的脚本按钮查看相应的sql语句,从而进行学习。
完成后点击确定即可。
我们也可以用语句来执行,例如:
CREATEDATABASE[BBS]ONPRIMARY
(NAME=N'BBS',=N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\BBS.mdf',SIZE= 4096KB,MAXSIZE=UNLIMITED,= 1024KB)
LOGON
(NAME=N'BBS_log',=N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\BBS_log.ldf',SIZE= 1024KB,MAXSIZE= 2048GB,= 10%)
GO
备份数据库
名称 备份 数据库 备份文件
引申 sql语句操作
在需要备份的数据库上右击,在弹出的菜单中选择任务,然后选择备份(Back Up)
在弹出的备份数据库界面中,可以选择备份的模式,修改备份名称,如果有需要的话可以备份文件组,指定备份时间等。
在备份的目标中,点击添加按钮。在弹出的对话框中选择备份保存的路径,同时输入备份文件的名称。然后确定返回备份界面。
点击左上角的选项一栏,可以修改备份的的属性,可以追加或者覆盖,备份完后可以验证。同时也可以使用压缩备份等等。
使用sql语句来备份也是让人愉快的事情。简单的语句如下
BACKUPDATABASEBBStoDISK='D:\Backup\BBS.bak'WITHINIT
其中init选项控制是否覆盖以及存在的数据库备份
还原数据库
名词 还原 数据库 备份文件
引申 sql语句操作
右击数据库,在弹出的菜单中选择还原数据库选项。
在弹出的还原数据库对话框中,目标数据库可以是新的数据库名称,也可以是已经存在的数据库名称。
对于源数据库是指使用已经存在于该实例下的数据库。一般使用备份文件,这是我们选择源设备,然后添加。
在弹出的指定备份对话框中选择添加已经备份好的数据库备份文件,然后确定。
回到还原数据库对话框后在选择用于还原的备份集中勾选所增加的文件。
单击选择页上的选项一栏
在还原选项中,可以根据需要来选择。同时可以为目标数据库文件修改名称。至于恢复的状态。一般使用restore with recovery,这样恢复完后可以访问数据库。如果要恢复差异备份、做数据库镜像等则要使用 resotre with norecovery,最后一种方式根据维护的需要来选择。执行后两种方式后,最后一次恢复必须使用restore with recovery 方式以确保数据库是可用的。
点击确定进行还原。
其简单的语句可以是:
RESTOREDATABASEBBSFROMDISK='D:\Backup\BBS.bak'WITHRECOVERY
导入数据
名词 数据源 目标数据 导入数据
有时在工作的时候需要将外部的数据导入数据库(例如导入excel表)或者需要将数据库表导出到文件(例如导出到excel表)等等,sql server可以很轻松的完成这些工作。
选中数据库,右击,在弹出的菜单栏中选择任务,然后选择导入数据(Import Data)。
在弹出的开始界面点击下一步后,在data source一栏选择microsoft excel(当然它还支持多种格式的数据源,要看你本机的应用了)。
然后点击浏览,选择需要导入的excel的文件
注意要选对版本或者其他相关属性。如果勾选了第一行为列名的选项后,数据源表的第一行作为目标表的列名。否则全部作为数据导入目标表。
点击下一步,弹出目标表对话框。目标表的类型也是有多种选择的。服务器的名称则可以添写实例的全名或者ip(如有需要则包含端口号)。
在验证方式里可以使用windows验证或者使用sql登陆验证。目标数据库一栏会根据你服务器的地址和登陆信息进行刷新,也可以手动刷新。然后进入下一步。
下一界面有两个选项:一是复制所有数据,二是输入sql语句,按照语句进行筛选导入。
继续下一步,此时导入引擎已经能够读取数据源的数据,并且呈现出来。在需要导入的表前打钩,同时也可以更改导入目标表的表名。
这里点击编辑可以进入更细致的步骤。
我们把目标表表名更改为test1。图上标出的两个方框,第一个删除并创建表 选项是指:如果目标表已经存在于目标数据库中,则从目标数据库中删除该表,并重新创建同名的表以导入数据源数据。第二个选项允许标识列插入,如果勾选了该选项,则如果数据源表包含标志列(自动增长列)则导入时保留该标识列的属性。
同时我们可以点击 编辑sql按钮 来对导入的sql进行修改以选择适合的数据
修改后点击确定即可。返回到导入选择数据的界面。我们可以点击预览来查看即将导入到目标数据库的数据。
一切就绪后下一步,则弹出是否立即执行的对话框。如果不立即执行也可以保存成ssis包以供使用。
点击下一步,导入引擎展现已经准备就绪信息。确定开始执行导入数据。
导出数据
名词 数据源 目标文件 导出数据
导出数据的基本步骤和导入数据的基本相同,只是操作的方向改变了。右击数据库,在弹出的菜单中选择任务,然后选择导出数据。
这里首先选择数据源,这是将要从数据库导出的数据(数据库的表,视图等等)。
下一步,选择将导出的数据以什么样的形成保存。这里我们将表导出为office 97-2003版本的excel。
可以自己定义导出数据的语句,或者使用界面来编辑。
选择需要导出的表(test),选中它,然后在编辑界面中,根据需要对相应的属性进行编辑。
以上步骤完成后,可以立即执行来获取结果。
创建表
名称 表 列 主键 约束
引申 sql语句操作
右击数据库表选项,在弹出的菜单栏中选择新建表
在列名和数据类型等等选项中输入表的列名和列的属性等。
在相应的行上右击可以看到设置主键、新建行、新建列等操作。
例如我们设置一个外键,选择关系一栏,弹出外键关系对话框。
展开表盒列规范一栏,然后选择外键表的列,以及相应的主键表和其相应的列。
然后保存即可。这样有了外键约束。如果对数据进行操作的时候违反了外键约束的规则,则是无法执行成功的。比如删除主键表的数据,而该键值在外键表中存在,则此时无法成功执行删除操作。必须现在外键表中删除相应的数据后,才能在主键表中删除相应的数据。
同样也可以给列添加约束
然后点击保存完成新建表。如果在新建过程中出错,sql server 会报出该错误,并且不能新建表。
当然也可以用这种方式来设计已经建好的表,右击表名选择设计即可。如果该表中有数据存在,那么对表的结构进行修改后,有可能违反了原有表的某些约束或者设置从而导致修改不成功,这点需要注意。
新建后 我们双击打开该表,可以看到文件夹:列名、键、约束、触发器、索引、统计信息。分别在文件夹上右击则可以弹出新建菜单。在已经存在的列或者键上右击则可以弹出修改、重命名等菜单。
对于新建表和更新表我可以使用语句(注意观察语句):
CREATETABLE[dbo].[test](
[col1][int]NOTNULL,
[col2][nchar](10)NULL,
CONSTRAINT[PK_test]PRIMARYKEYCLUSTERED
(
[col1]ASC
))
GO
ALTERTABLE[dbo].[test]WITHCHECKADDCONSTRAINT[FK_test_test]FOREIGNKEY([col1])
REFERENCES[dbo].[test]([col1])
GO
ALTERTABLE[dbo].[test]CHECKCONSTRAINT[FK_test_test]
GO
T-SQL 语句
Sql 的执行机制
我们经常是写好查询SQL,然后调用程序执行SQL。但是它内部的工作流程是怎样的呢?先做哪一步,然后做哪一步等,我想还有大部分朋友和我一样都不一定清楚。
第一步:应用程序把查询SQL语句发给服务器端执行。
我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。
第二步:服务器解析请求的SQL语句。
1:SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果。
原因:
1):服务器在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的计划缓存中找是否有相对应的执行计划,如果存在,就直接调用已经编译好的执行计划,节省了执行计划的编译时间。
2):如果所查询的行已经存在于数据缓冲存储区中,就不用查询物理文件了,而是从缓存中取数据,这样从内存中取数据就会比从硬盘上读取数据快很多,提高了查询效率.数据缓冲存储区会在后面提到。
2:如果在SQL计划缓存中没有对应的执行计划,服务器首先会对用户请求的SQL语句进行语法效验,如果有语法错误,服务器会结束查询操作,并用返回相应的错误信息给调用它的应用程序。
注意:此时返回的错误信息中,只会包含基本的语法错误信息,例如select 写成selec等,错误信息中如果包含一列表中本没有的列,此时服务器是不会检查出来的,因为只是语法验证,语义是否正确放在下一步进行。
3:语法符合后,就开始验证它的语义是否正确,例如,表名,列名,存储过程等等数据库对象是否真正存在,如果发现有不存在的,就会报错给应用程序,同时结束查询。
4:接下来就是获得对象的解析锁,我们在查询一个表时,首先服务器会对这个对象加锁,这是为了保证数据的统一性,如果不加锁,此时有数据插入,但因为没有加锁的原因,查询已经将这条记录读入,而有的插入会因为事务的失败会回滚,就会形成脏读的现象。
5:接下来就是对数据库用户权限的验证,SQL语句语法,语义都正确,此时并不一定能够得到查询结果,如果数据库用户没有相应的访问权限,服务器会报出权限不足的错误给应用程序,在稍大的项目中,往往一个项目里面会包含好几个数据库连接串,这些数据库用户具有不同的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不同的操作选取不同的用户来执行,稍微不注意,无论你的SQL语句写的多么完善,完美无缺都没用。
6:解析的最后一步,就是确定最终的执行计划。当语法,语义,权限都验证后,服务器并不会马上给你返回结果,而是会针对你的SQL进行优化,选择不同的查询算法以最高效的形式返回给应用程序。例如在做表联合查询时,服务器会根据开销成本来最终决定采用hash join,merge join ,还是loop join,采用哪一个索引会更高效等等,不过它的自动化优化是有限的,要想写出高效的查询SQL还是要优化自己的SQL查询语句。
当确定好执行计划后,就会把这个执行计划保存到SQL计划缓存中,下次在有相同的执行请求时,就直接从计划缓存中取,避免重新编译执行计划。
第三步:语句执行。
服务器对SQL语句解析完成后,服务器才会知道这条语句到底表态了什么意思,接下来才会真正的执行SQL语句。
些时分两种情况:
1):如果查询语句所包含的数据行已经读取到数据缓冲存储区的话,服务器会直接从数据缓冲存储区中读取数据返回给应用程序,避免了从物理文件中读取,提高查询速度。
2):如果数据行没有在数据缓冲存储区中,则会从物理文件中读取记录返回给应用程序,同时把数据行写入数据缓冲存储区中,供下次使用。
Sql的缓存机制
SQL SERVER 可以避免编译之前执行的查询,使用4中机制使计划缓存在许多情况下都可以访问:
1、即席查询缓存
2、自动参数化
3、已准备查询,使用sp_executesql或通过API调用的prepare和execute方法
4、存储过程或者其他编译对象(触发器和表值函数等)
即席查询缓存:
缓存的计划只有在后续批处理完全匹配时才能重用。仅限于完全文本匹配,在SQL中他的objtype为Adhoc
注:SQL中的批:Select语句在各自的批处理中使用GO分隔。如果没有GO,则只有一个批处理,并且每个批都有自己的计划。对于即席查询计划的重用,整个批处理必须是相同的。
自动参数化:
对于某些查询,SQL SERVER可以决定将一个或者多个常量看做参数。将常量看做参数时,使用相同基本模板的后续查询可以使用相同计划。
已准备查询:objtype为Prepared
sp_executesql:该过程从T-SQL批处理内部调用,位于即席缓存和存储过程中间。使用时需要确定参数及其数据类型,基本语法为
sp_executesql @batch_text,@bath_parameter_definitions,
param1,…,paramN
具有相同值的@batch_text和@batch_parameter_definitions重复调用使用相同的缓存计划。
Prepare和execute方法和sp_executesql类似,它由应用程序确定。不需要每次执行时都发送全文批处理。在预定义时会发送一次全文,返回可在执行时调用批处理的句柄。(这里我也不怎么理解,遇到的比较少。)
已编译对象 objtype为Proc
存储过程和用户定义标量函数几乎是相同的,他们的编译计划被缓存,而且可以被重复使用。
Sql 的常用的关键字和函数
Selectinsertupdatedelete
Selectintofrom
Insertintoselectfrom
Casewhenthenelseendas
Top
with
Innerjoinon
Leftjoinon
Rightjoinon
Like
Isnull
betweenand
Exists
Not Exists
=
<>
!=
Orderby
Groupby
Having
create
Alter
drop
truncate
Declare
Set
Go
Begin
End
Transaction
Rollback
Commit
Exec
Try
Catch
While
Ifthenelse
Ifexists()thenelse
Procedure
Trigger
Index
Merge
Sum()Count()Avg()Max()Min()Convert()Cast()len()ltrim()rtrim()replace()substring()charindex()getdate()datepart()dateadd()datediff()
withCte
row_number()over (partitionby,orderby)
更多经典的sql语句可以查看附件:经典SQL语句大全.doc、SQL语句大全(官方修正典藏版).pdf
调优
调优的工具
查看估计的执行计划
可以利用查看执行计划来比较两条或者多条sql语句的执行效率和成本。
选中需要执行的sql语句,然后点击工具栏上的显示估计的执行计划,就可以看到一个图形化的结果,其显示了各个语句在sql内被优化成后的执行计划,可以具体看出执行的步骤,以及所使用到的索引,各个步骤在整个过程中所占用的代价,以及相对该计划需要做什么样的调整,或者建议等。当然这些建议不是全部需要采纳,要根据实际情况来定夺。
例如:
declare@typevarchar(10)
selecta.employee_idasvalue,name,orderby
fromoa_calendar_usera,oa_employeesb
wherecast(a.employee_idasvarchar)=cast(b.employee_idasvarchar)
andusertype=@type
orderbyorderby
---修改
--每次都要cast 为什么不直接声明列为varchar
selecta.employee_idasvalue,b.name,a.orderby
fromoa_calendar_userasaleftjoinoa_employeesasb
ona.employee_id=b.employee_id
where 1=1 anda.usertype=@type
orderbya.orderby
我们看到以上两个语句,修改之前的语句查询开销占了97%而修改之后的查询开销只有3%,说明对该语句进行的优化是成功的。相比而言优化之后的查询计划也简单明了。
我们也可以使用语句来查询估计的执行计划set showplan_xml on 语句就可以产生我们刚才的xml文件,点击查看。用set showplan_text on则查看其文本。用 set showplan_all on则可查看更具体的信息。其查看的过程是,按照树形结构从右向左,同一级的操作从上向下查看。例如:
setshowplan_allon
go
declare@typevarchar(10)
selecta.employee_idasvalue,b.name,a.orderby
fromoa_calendar_userasaleftjoinoa_employeesasb
ona.employee_id=b.employee_id
where 1=1 anda.usertype=@type
orderbya.orderby
go
setshowplan_alloff
所有的事情都不是一蹴而就的,尤其是sql语句的调优,很多时候需要一调再调,反复调试才能达到更好的效果。
由于sql具有计划缓存以及数据缓存的机制,所以如果要查看实际的执行情况,在不清除缓存的情况下,可以多执行几次以看平均值。执行清除缓存的操作在生产机上切忌不可做。
索引
索引:用来提高查询数据速度的一个很有效的手段。
展开表的索引属性一栏,我们可以看到该表已经存在的索引。聚集索引、非聚集索引、唯一索引、不唯一索引等。在sql中,一个表只能有一个聚集索引,因为数据只能按照一种属性进行排序,不能用多个属性来排序(注意,这里指的排序不是select语句中的order by)。
右击相应的索引,我们可以查看其属性,对其进行重建等等操作。
右击索引,选择属性,在弹出的属性对话框的选择页里选择碎片,我们可以看到索引的深度为3,这就是为什么我们用索引查数据是非常快的原因.如果在100万条数据中查找一条数据,在没有索引的情况下平均要找100*(100+1)/2/100 =50.5万次,在使用索引的情况下,假设索引深度是n,则平均要找n(n+1)/2/n=(n+1)/2次。而索引深度一般不超过4,所以只搜索了2.5次。速度的提升可想而知。
当然这里也可以看到索引的一些统计情况,以方便管理者决定是否需要重建索引等操作。
当然我们也可以使用语句来创建索引:例如
createuniquenonclusteredindextest_indexontest(col2)
用一下语句来删除索引
dropindextest_indexontest
不建议用hint,因为用了hint的语句不具有通用性。当服务器的环境有了变化,比如硬件的升级、服务器的更换等等可能会导致使用了hint的语句无法达到最优,而sqlserver数据库引擎根据服务器的配置和数据库的配置而生成的执行计划则可以实时的发生变化以适应新的环境,此时我们不需要对应用程序以及数据库服务器做任何的变动或者维护。
利用profiler
在ms中的工具栏的菜单中可以看到SQL Server Profiler或者在应用程序中选择SQL Server Profiler。该工具能
展开阅读全文