常见的SQL优化
- SQL语句嵌套一般不超过三层,SQL语句不能写得过长,过于冗余且容易出错。
- 临时表:使用临时表加快查询和索引的效率。
- 巧妙使用OR或者AND:数量相差过大的情况下则可以分开运行语句。
- 只在必要情况下使用begin tran:begin tran 标记事务的开始 commit tran提交事务 优点是保证了数据的一致性,缺点是容易出错,如果出错则回滚到begin tran之前的部分
- 部分查询上加上nolock,使用插删改的不能加noclock,查询的表属于频繁发生分裂的慎用,使用临时表一样可以保存“数据前影”
- 合理使用like模糊查询:like‘%exmaple%’
- SQLserver表的三种连接方式:merge join,nested loop join,hash join 连接时用on,比如:on a.id = b.id
触发器的常见写法:
//常见语法通用模板
create trigger trigger_name
on {table_name| view_name}
for {after| instead of} {insert, update, delete}//在进行本行操作时触发触发器进行
as
{
//sql语句部分
declare @student_idchar(10)
select @student_id=s.student_id from students
if (conditional code)//begin end的触发条件
begin
//错误抛出条件,并进行回滚
raiserror('错误',16,8)
rollbacktran
end
}
//--简单例子
//--在student上创建<strong>INSERT触发器</strong>stu_insert,要求在student表中插入记录时(要求每次只能插入一条记录),这个触发器都将更新class表中的class_nun列。并测试触发器stu_insert。
create trigger stu_insert
on student
for insert
as
update class set class_num=class_num + 1
where class_id=(select class_id from inserted)
作用:
1、过多的触发器使得数据逻辑变得复杂
2、数据操作比较隐含,不易进行调整修改
3、触发器的功能逐渐在代码逻辑或事务中替代实现,更符合OO思想。
DDL 触发器使用场合:
要防止对数据库架构进行某些更改。
希望数据库中发生某种情况以响应数据库架构中的更改。
要记录数据库架构中的更改或事件。
在这里我们只讲述DML触发器。DML触发器又分以下分类:
1、 After触发器
After触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。
1)insert触发器
2)update触发器
3)delete触发器
2、Instead of 触发器 (并不执行其操作,只执行触发器)
Instead of 触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。