文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

浅谈 SQL Server 查询优化与事务处理

2024-04-02 19:55

关注

之前我们简单了解了各种查询的用法,然而在实际开发中还会用到一些比较高级的数据处理和查询,包括索引、视图、存储过程和触发器。从而能够更好地实现对数据库的操作、诊断及优化。

什么是索引呢,索引是 SQL Server 编排数据的内部方法,他为 SQL Server 提供了一种方法来编排查询数据的路由,从而达到通过使用索引来提高数据库的检索速度、改善数据库性能。

索引也是分为以下六类:
1、唯一索引:不允许两行具有相同的索引值,创建了唯一约束,将会自动创建唯一索引。
2、主键索引:是唯一索引的特殊类型,将表定义一个主键时将自动创建主键索引,他要求主键中的每个值都是唯一的。
3、聚集索引:在聚集索引中,表中各行的物理顺序和键值的逻辑索引顺序相同。(注意:一个表中只能包含一个聚集索引)
4、非聚集索引:建立在索引页上,在查询数据时可以从索引中找到记录存放的位置,聚集索引比非聚集索引有更快的数据访问速度。
5、复合索引:可以将多个列组合为索引。
6、全文索引:是一种特殊类型的基于标记的功能性索引,主要用于在大量文本中搜索字符串。
创建唯一索引:(不可有重复值)

create unique nonclustered index U_cardID 
on TStudent (cardID)

查看表上的索引:

Select * from sys.sysindexes 
where id=(select object_id from sys.all_objects where name='Tstudent')

按照指定的索引进行查询:

SELECT * FROM xueyuan
    WITH (INDEX = IX_name)
    WHERE 学员姓名 LIKE '孙%'

视图是一种虚拟表,通常是作为来自一个或多个表的行或列的子集创建的。
视图的作用就是:
1、筛选表中的数据
2、防止未经允许的用户访问敏感数据
3、将多个物理数据表抽象为一个逻辑数据表
对用户的好处就是:结果更容易理解、获得数据更容易
对开发人员的好处就是:限制数据检索更容易、维护应用程序更方便
注意事项:
1、每个视图中可以使用多个表
2、与查询相似,一个视图可以嵌套另一个视图,最好不要超过三层
3、试图定义的 select 语句不能包括以下:

触发器的作用就是:强化约束、跟踪变化、级联运行
创建触发器的语法为:

create trigger *triggername(触发器名)*
on *tablename(表名)*
[with encryption]
for {[delete,insert,update]}
as SQL 语句

例:创建触发器,禁止修改admin表中的数据

create  trigger  reminder
on  admin
for  update
as
print  '禁止修改,请联系DBA'
rollback  transaction
go

然后执行语句查看错误信息:

update Admin set  LoginPwd='123'  where  LoginId='benet'
select  *  from  Admin

浅谈 SQL Server 查询优化与事务处理
事务(一般用在银行交易这一方面,如转账)
是一个不可分割的工作逻辑单元
一组命令,要么都执行,要么都不执行
事务作为单个逻辑工作单元执行的一系列操作,一个逻辑单元必须具备四个属性:原子性、一致性、隔离性、持久性,这些特性通常简称为ACID
举个例子,以转账为准
首先创建表名为bank:
浅谈 SQL Server 查询优化与事务处理
为 Currentmoney列的Check约束:
浅谈 SQL Server 查询优化与事务处理
插入两条数据:

INSERT INTO bank(customerName,currentMoney) VALUES('张三',1000)
INSERT INTO bank(customerName,currentMoney) VALUES('李四',1)

然后输入代码事务执行:

select customername,currentmoney as 转帐事务前的余额 from bank    --查看转账事务前的余额
go
begin transaction     -- 开始事务(指定事务从此开始,后续的T-SQL语句是一个整体)
declare @errorsum int   --定义变量,用于累计事务执行过程中的错误 
set @errorsum=0    --初始化为0,即无错误
update bank set currentmoney=currentmoney-1000  --转账,张三账户少1000 李四账户多1000 
where customername='张三'
set @errorsum=@errorsum+@@ERROR    --累计是否有错误
update bank set currentmoney=currentmoney+1000
where customername='李四'
set @errorsum=@errorsum+@@ERROR   --累计是否有错误
select customername,currentmoney as 转帐事务过程中的余额 from bank    --查看那转账过程中的余额
if @errorsum<>0  --如果有错误
begin 
print '交易失败,回滚事务'
rollback transaction 
end
else 
begin 
print '交易成功,提交事务,写入硬盘,永久的保存'
commit transaction 
end
go
select customername,currentmoney as 转帐事务后的余额 from bank   --查看转账后的余额

转账失败:
浅谈 SQL Server 查询优化与事务处理
转账成功:
浅谈 SQL Server 查询优化与事务处理

多用户能够同时操纵同一个数据库中的数据,会发生数据不一致的现象,锁就是能够在多用户环境下保证数据的完整性和一致性
锁的三种模式:
共享锁(S锁):用于读取资源所加的锁。
排他锁(X锁):和其他锁不兼容,包括其他排他锁。
更新锁(U锁):U锁可以看做S锁和X锁的结合,用于更新数据。
查看锁:
使用sys.dm_tran_locks动态管理视图
使用Profiler来捕捉锁信息
死锁
死锁的本质是一种僵持状态,是由多个主体对资源的争用而导致的。
形成死锁的条件是:
1、互斥条件:主体对资源是独占的
2、请求与等待条件
3、不剥夺条件
4、环路等待条件
预防死锁:
破坏互斥条件
破坏请求与等待条件
破坏不剥夺条件

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯