-
TRANSACTION議題
-
將大型交易拆成數個小型交易
-
增刪修之間如果有包含大量查詢語法,一樣造成transaction等待
ex. 下列語法table1 新增的資料會被lock 直到 commit =5秒後
Begin transaction
insert into table1 (1,1,1,1) --// 1ms
select * from tableX --// 5000ms
update table1 set col1=2 where id = 1 --//1ms
Commit transacton
-
-
VIEW 議題
-
加工後的view可能會影響索引查詢
-
適合靜態資料
-
-
TEMP TABLE 議題
-
無法以單一查詢取得結果集,需要經過複數的處理,才能得到結果,這時後才使用temp table
-
temp table 的內容要量少質精
-
-
WHERE 議題
-
減少子查詢,以JOIN 取代,目的是過濾資料
-
以true , false 結果取代所有資料集
ex1.
Select * from table1 where m_id in (select id from table2)
Select * from table1 a where exists (select 1 from table2 where id = a.m_id)
-
-
避免負向查詢 (NOT, != , <> , !> , !<, NOT EXISTS , NOT IN, NOT LIKE)
-
避免WHERE欄位進行加工運算 ex. WHERE RTRIM(user_nm) = @user_nm
-
索引議題
-
一定要建立foreign key 的index
-
儘量使用數字型態的欄位作為索引
-
索引如果是文字型態,儘量不超過20byte
-
索引數量不可超過6個
-
like '%DDD' 不會使用索引 , 'DDD%' 會使用索引
-
如果有用到OR, 則所有欄位都要有索引才有作用 (不如查詢兩次後UNION)
-
-
NULL議題
-
比空字串占空間
-
存成NULL 比存成空字串更耗時
-
-
其他
-
使用資料庫物件,儘量寫 schema.object => 不寫schema 一律先找dbo
-