索引
示意图
定义
索引提供指针指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针
作用
通过使用索引,大大提高数据库的检索速度,改善数据库性能
索引六大类
1. 唯一索引
a) 唯一索引不允许两行具有相同的索引值
2. 主键索引
a) 在数据库关系图中为表定义一个主键将自动创建主键索引,它是一种特殊类型
3. 聚集索引
a) 表中各行的物理顺序与键值的逻辑(索引)顺序相同
4. 非聚集索引
a) 非聚集索引建立在索引页上,在查询数据时可以从索引中找到记录存放的位置
b) 一个表只能创建一个聚集索引,但可以有多个非聚集索引
5. 复合索引
a) 在创建索引时,并不是只对其中一列创建索引,与创建主键一样,可以将多个列组合
6. 全文索引
a) 一种特殊类型的基于标记的功能性索引,由SQL Server中全文引擎服务创建和维护
建立索引列的标准
1.频繁搜索的列
2.经常用作查询选择的列
3.经常排序,分组的列
4.经常用作连接的列(主键/外键)
切忌不要使用下面的列创建索引
1. 仅包含几个不同值的列
2. 表中仅包含几行
经验
A. 查询时减少使用*返回全部列,不要返回不需要的列
B. 索引应该尽量小,在字节数小的列上建立索引
C. WHERE子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前
D. 避免在ORDER BY子句中使用表达式
E. 根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理
创建索引
CREATE [UNIQUE][CLUSTERED|NONCLUSTERED] INDEX index_name
ON 表名(column_name[,column_name]…)
[WITH FILLFACTOR=X]
说明
UNIQUE指定唯一索引(可选)
CLUSTERED,NONCLUSTERED指定是聚集索引还是非聚集索引(可选)
FILLFACTOR表示填充因子,指定一个0~100的值,该值指示索引页填满的空间所占的百分比
删除索引
DROP INDEX table_name.index_name
注意
1. 删除表时,该表的所有索引同时会被删除
2. 如果要删除表的所有索引,首先要删除非聚集索引,然后再删除聚集索引
查看索引
用系统存储过程sp_helpIndex查看:
sp_helpIndex Table_name
用视图sys.indexes查看
SELECT * FROM sys.indexes
维护索引
语法
方法一:
DBCC SHOWCONTIG ([表名/表ID/视图名/视图ID][,对碎片信息检索的索引])
WITH ALL_INDEXES 或 ALL_INDEXES TABLERESULTS
或 ALL_INDEXES 或 FAST|ALL_LEVELS
方法二:
DBCC INDEXDEFRAG (数据库名,表名/视图名,视图ID)
WITH NO_INFOMSGS --禁止显示所有信息性消息
储存过程
定义
他是SQL语句和控制语句的预编译集合,他可包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个或多个结果集以及返回值
优点
1. 模块化程序设计2. 执行速度快,效率高
3. 减少网络流量
4. 具有良好的安全性
分类
系统存储过程(System Stored Procedures)
用户自定义的存储过程(User-defined StoredProcedures)
常用存储过程
系统存储过程 |
说明 |
sp_database |
列出服务器上的所有数据库信息,包括数据库名和数据大小 |
sp_helpdb |
报告有关指定数据库或所有数据库的信息 |
sp_renamedb |
更改数据库的名称 |
sp_tables |
返回当前环境下可查询的表或视图的信息 |
sp_columns |
返回某个表或视图的列信息,包括列的数据类型和长度等 |
sp_help |
查看某个数据库对象的信息,如:列名,主键,约束,外键,索引等 |
sp_helpconstraint |
查看某个表的约束 |
sp_helpindex |
查看某个表的索引 |
sp_stored_procedures |
显示存储过程的列表 |
sp_password |
添加或修改登录账户的密码 |
sp_helptext |
显示默认值,未加密的存储过程,用户定义的存储过程,触发器或视图的实际文本 |
存储过程的使用
EXEC[UTE] 存储过程名[参数值]
常用的扩展存储过程
注:
它通常’xp_’作为前缀,以DLL形式单独存在
语法
EXECxp_cmdshell DOS命令 [NO_OUTPUT]
存储过程的三部分
A. 输入参数和输出参数
B. 在存储过程中执行的T-SQL语句
C. 存储过程的返回值
存储过程的参数
输入参数
可以在调用时向存储过程传递参数
输出参数
如果希望返回值,则可以使用输出参数,输出参数后有”OUTPUT”标记.
创建无参存储过程
语法
CREATEPROC[EDURE] 存储过程名
[
{@参数1 数据类型}[=默认值] [OUTPUT],
{@参数2 数据类型}[=默认值] [OUTPUT]
]
AS
SQL语句
删除存储过程
语法
DROPPROC[EDURE] 存储过程名
创建有参存储过程
注意
如果存储过程的参数后面有”OUTPUT”关键字,表示此参数为输出参数,否则视为输入参数,输入参数还可以设置为默认值
语法
EXEC[UTE][返回值=] 存储过程名 [@参数1=] [OUTPUT] | [DEFAULT],
…..,
[@参数1=]参数值n [OUTPUT] | [DEFAULT]
注:
OUTPUT表明参数是输出参数,DEFAULT表示参数的默认值
为了调用方便,最好将有默认值的参数放在存储过程参数列表的最后
PAISERROR语句
语法
RAISERROR({msg_id | msg_str}{,severity,state} [WITH option[,…n]])
注:
msg_id:在sysmessages系统表中指定的用户定义错误信息
msg_str:用户定义的特定信息,最长为255个字符
severity:与特定信息相关联,表示用户定义的严重性级别
state:表示错误的状态,是1~127的值
option:指示是否将错误记录到服务器错误日志中
游标
定义
处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行进行或向后浏览数据的能力,我们可以把游标当做一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理
游标种类
Transact_SQL游标
Transact_SQL游标是由DECLARECURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL游标不支持提取数据块或多行数据
API服务器游标
API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL)都会将这些客户请求传送给服务器以对API游标进行处理。
客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。
声明游标语法
向前
DECLARE游标名 cursor
向后
DECLARE游标名 ScrollCursor
FOR
SELECT列名1,列名2 FROM 表名
Where条件
游标语法
DECLARE 游标名 SCROLL CURSOR
FOR SELECT * FROM 表名
OPEN 游标名 --打开游标
FETCH NEXT FROM 游标名 --提取第一行数据
FETCH LAST FROM 游标名 --提取最后一行数据
FETCH FIRST FROM 游标名 --提取第一行数据
FETCH ABSOLUTE 3 FROM 游标名 --提取第三行数据
FETCH RELATIVE 5 FROM 游标名 --提取当前行开始的第五行数据
DEALLOCATE游标名 --销毁游标
DEALLOCATE游标名 --删除游标
游标的组成
两个部分
1. 游标结果集
a) 定义该游标得SELECT语句返回的行的集合
2. 游标位置
a) 指向这个结果集某一行的当前指针
游标的生命周期
A. 声明游标
B. 打开游标
C. 读取游标数据
D. 关闭游标
E. 释放游标
临时表和表变量
临时表
定义
临时表就是临时生成一个表放在Tempdb中
语法
本地临时表: #表名
全局临时表:##表名
注:
用完后记得要Drop掉
表变量
语法
[email protected] TABLE(变量名,变量名,变量3….)
触发器工作原理
触发器是一个特定表格中发生特定操作时所激活的一种机制.
触发器包括3个组成部分:
A. 触发器的名称B. 触发器中进行的操作
C. 触发器操作的执行过程
注:
触发器操作可以是INSERT语句,UPDATE语句和DELETE语句
触发器的优点
1. 触发器可以通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以有效执行
2. 触发器可以强制比用CHECK定义的约束更为复杂的约束
3. 触发器可以检测数据修改前后的表状态,并根据其差异采取对策
4. 一个表中的多个同类触发器(INSERT UPDATE DELETE)允许采取多个不同的对策以响应一个修改语句
创建触发器
语法
CREATETRIGGER 触发器名称
ON 表名/视图名
[WITHENCRYPTION] --加密syscomments表中包含CREATE TRIGGER语句文本的条目
//AFTER默认触发器. INSTEAD OF指定执行触发器而不执行SQL语句
FOR [INSERT/UPDATE/DELETE]/[AFTER/INSTEADOF]
AS
//需要执行的操作
BEGIN
处理事件
ROLLBACKTRANSACTION
END
转载出至:http://blog.csdn.net/heqingsong1/article/details/7495496