資料庫 SQL優化和觸發器
阿新 • • 發佈:2018-12-19
常見的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觸發器,也可以在檢視上定義。