1. 程式人生 > >資料庫 SQL優化和觸發器

資料庫 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觸發器,也可以在檢視上定義。