After触发器 视图 索引
计算数据操作时间
开始的时候一直想提高数据库查询的速率,但是苦于无法计算,所以就写出了一个样式代码,大家可以看一下,学索引的时候学的
After触发器
原理:例如:当要删除一条记录z的时候,首先,SQL Server会在内存中建一个删除表,然后删除那条记录之后,会触发insert/update/delete事件(after触发器),最后再从内存中删除那个删除表,一个表中可以有多个触发器,而且顺序只能够确定First,和Last.这需要用一个存储过程来设置(后面介绍),
触发器语法:
(2).在插入到表Test1表之前,在内存中,SQL Server创建了一个inserted表,和插入内容一样。
(3).触发触发器之后发生的事件。
当然如果有多个触发器的时候,系统有一个存储过程来设定触发器的执行顺序。
维护数据的一致性(可以练级删除,动态计数),可以很好的进行逻辑控制(假设老师的工资底线是4000,如果在插入的时候低于4000的全都变为4000),
貌似触发器与存储过程有好多的相似之处。
触发器的用途:
简单应用是:
1.一个社区系统,用户激活的时候,要在社区的每个栏目都插入一条用户数据。
2.相册系统中,在相册激活后,在相册用户表中插入一条记录,而且要在用户相册中插入一条记录(默认相册)
当然,这几个都是我在平时所遇到的。
视图:
在学习的过程中,我觉得要学一样技术,首先要知道它的原理和用途以及优点
以前一直以为视图只能查询,可是看了之后,才发现自己错了,不过对视图的编辑,我貌似没用过,
视图的原理是:视图并不是数据表,只是在外形上相似而已,它其实只是一张虚拟表,是对多个数据表的select结果。
现在来讲讲视图的优缺点:任何东西(包括人)都包括优缺两特性。
从性能上讲:对视图的一个简单的查询,都会被SQL Server转换为对数据表的复杂查询。所以在建视图的时候要权衡视图的复杂性。
如果只需对一个数据表的查询就不要用多个表建成的视图了。因为会影响到性能的。
从修改限制上讲:对视图的修改,也同样会转换为对多个表的复杂操作,如果修改视图中的一条记录时,涉及到了多个表的字段,那么就要注意了,很容易出现错误的。
当然多表构成的视图在查询的时候会写起来简单许多,没有过多的语句,减少出错的概率。
索引:
里面讲的很清楚,而且还有具体的实例。聚集索引还是要建,而且最好不要轻易的创建,不要建在主键ID上,因为它是递增的,系统不知道,所以要重头到尾的查询。速度会慢的。
数据库好比字典
聚集索引好比字典正文中右边的A-Z,如果我们要找Z的话,可以直接找到字典后面,可以缩小搜索的范围(主键默认为聚集索引除外),而默认主键为聚集索引好比:字典已经按照顺序排好序了,但是右边没有A-Z,所以SQL SERVER会重头到尾的搜索,找到目标为止。
而非聚集索引好比:不知道字的发音,字典按偏旁来查找,SQL SERVER建一个索引表,像字典偏旁表,要先在偏旁表(偏旁表简单)中查找,然后映射到数据表中找到要查找的记录。
一个表只能有一个聚集索引,可以有多个非聚集索引,所以聚集索引要珍惜使用,在建非聚集索引的时候,要记住不要设用户经常更改的字段为非聚集索引,因为修改了字段的值,同时也会修改索引表里的值,会给SQL SERVER增加负担。
我看了一篇博文讲的非常好。地址是
http://www.cnblogs.com/tintown/archive/2005/04/24/144272.html
对文章有见解的可以在评论中发表出来,我们互相讨论!!!
开始的时候一直想提高数据库查询的速率,但是苦于无法计算,所以就写出了一个样式代码,大家可以看一下,学索引的时候学的
use master
go
declare @time1 datetime
declare @time2 datetime
select @time1=getdate()
select * from dbo.MSreplication_options order by optname
select @time2=getdate()
select datediff(millisecond,@time1,@time2)
可以计算一次查询或者其他的操作时间了go
declare @time1 datetime
declare @time2 datetime
select @time1=getdate()
select * from dbo.MSreplication_options order by optname
select @time2=getdate()
select datediff(millisecond,@time1,@time2)
After触发器
原理:例如:当要删除一条记录z的时候,首先,SQL Server会在内存中建一个删除表,然后删除那条记录之后,会触发insert/update/delete事件(after触发器),最后再从内存中删除那个删除表,一个表中可以有多个触发器,而且顺序只能够确定First,和Last.这需要用一个存储过程来设置(后面介绍),
触发器语法:
create trigger 触发器名
on 数据表名或视图名
after insert/update/delete
on
as
begin
T_SQL语句(你要触发的事件)
end
当然看个通用语法,是不太可能懂的,所以我给出了一个实例on 数据表名或视图名
after insert/update/delete
on
as
begin
T_SQL语句(你要触发的事件)
end
alter trigger Test1_insert
on dbo.Test1
after insert---(1)
as
begin
set nocount on
declare @username nvarchar(50)
declare @testcount int
select @username=(select Test1_username from inserted)---(2)
select @testcount=(select Test1_count from inserted)
insert into dbo.Test values(@username,getdate())---(3)
end
GO
(1).是在想Test1表中插入数据的时候触发触发器,所以为inserton dbo.Test1
after insert---(1)
as
begin
set nocount on
declare @username nvarchar(50)
declare @testcount int
select @username=(select Test1_username from inserted)---(2)
select @testcount=(select Test1_count from inserted)
insert into dbo.Test values(@username,getdate())---(3)
end
GO
(2).在插入到表Test1表之前,在内存中,SQL Server创建了一个inserted表,和插入内容一样。
(3).触发触发器之后发生的事件。
当然如果有多个触发器的时候,系统有一个存储过程来设定触发器的执行顺序。
exec sp_settriggerorder
触发器名,顺序[只能为First,Last,None(有程序任意触发)],激活触发器的动作
go
例如:
exec sp_settriggerorder
'Test1_insert','First','insert'-----(4)
go
(4).要注意每个都是字符串格式
触发器的功能:触发器名,顺序[只能为First,Last,None(有程序任意触发)],激活触发器的动作
go
例如:
exec sp_settriggerorder
'Test1_insert','First','insert'-----(4)
go
(4).要注意每个都是字符串格式
维护数据的一致性(可以练级删除,动态计数),可以很好的进行逻辑控制(假设老师的工资底线是4000,如果在插入的时候低于4000的全都变为4000),
貌似触发器与存储过程有好多的相似之处。
触发器的用途:
简单应用是:
1.一个社区系统,用户激活的时候,要在社区的每个栏目都插入一条用户数据。
2.相册系统中,在相册激活后,在相册用户表中插入一条记录,而且要在用户相册中插入一条记录(默认相册)
当然,这几个都是我在平时所遇到的。
视图:
在学习的过程中,我觉得要学一样技术,首先要知道它的原理和用途以及优点
以前一直以为视图只能查询,可是看了之后,才发现自己错了,不过对视图的编辑,我貌似没用过,
视图的原理是:视图并不是数据表,只是在外形上相似而已,它其实只是一张虚拟表,是对多个数据表的select结果。
现在来讲讲视图的优缺点:任何东西(包括人)都包括优缺两特性。
从性能上讲:对视图的一个简单的查询,都会被SQL Server转换为对数据表的复杂查询。所以在建视图的时候要权衡视图的复杂性。
如果只需对一个数据表的查询就不要用多个表建成的视图了。因为会影响到性能的。
从修改限制上讲:对视图的修改,也同样会转换为对多个表的复杂操作,如果修改视图中的一条记录时,涉及到了多个表的字段,那么就要注意了,很容易出现错误的。
当然多表构成的视图在查询的时候会写起来简单许多,没有过多的语句,减少出错的概率。
索引:
里面讲的很清楚,而且还有具体的实例。聚集索引还是要建,而且最好不要轻易的创建,不要建在主键ID上,因为它是递增的,系统不知道,所以要重头到尾的查询。速度会慢的。
数据库好比字典
聚集索引好比字典正文中右边的A-Z,如果我们要找Z的话,可以直接找到字典后面,可以缩小搜索的范围(主键默认为聚集索引除外),而默认主键为聚集索引好比:字典已经按照顺序排好序了,但是右边没有A-Z,所以SQL SERVER会重头到尾的搜索,找到目标为止。
而非聚集索引好比:不知道字的发音,字典按偏旁来查找,SQL SERVER建一个索引表,像字典偏旁表,要先在偏旁表(偏旁表简单)中查找,然后映射到数据表中找到要查找的记录。
一个表只能有一个聚集索引,可以有多个非聚集索引,所以聚集索引要珍惜使用,在建非聚集索引的时候,要记住不要设用户经常更改的字段为非聚集索引,因为修改了字段的值,同时也会修改索引表里的值,会给SQL SERVER增加负担。
我看了一篇博文讲的非常好。地址是
http://www.cnblogs.com/tintown/archive/2005/04/24/144272.html
对文章有见解的可以在评论中发表出来,我们互相讨论!!!