数据库 SQL优化和触发器

常见的SQL优化

  1. SQL语句嵌套一般不超过三层,SQL语句不能写得过长,过于冗余且容易出错。
  2. 临时表:使用临时表加快查询和索引的效率。
  3. 巧妙使用OR或者AND:数量相差过大的情况下则可以分开运行语句。
  4. 只在必要情况下使用begin tran:begin tran 标记事务的开始 commit tran提交事务  优点是保证了数据的一致性,缺点是容易出错,如果出错则回滚到begin tran之前的部分
  5. 部分查询上加上nolock,使用插删改的不能加noclock,查询的表属于频繁发生分裂的慎用,使用临时表一样可以保存“数据前影”
  6. 合理使用like模糊查询:like‘%exmaple%’
  7. 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触发器,也可以在视图上定义。

 

猜你喜欢

转载自blog.csdn.net/sinat_20744625/article/details/85063182