由於公司基本都是用存儲過程因此原本寫的乾貨基本都是存儲過程的。sql
SELECT TOP 1 Code,Invitation,Num,Typ FROM SignLog WITH(NOLOCK) WHERE UserId=@userId AND TaskId=2 AND AddTime>=@stime AND AddTime<@etime
用以上語句來講一下例子:spa
查詢 必定要指定字段就算你要查所有字段也不要用*號來代替 ,以及 能用TOP儘可能TOPcode
避免不必的鎖 必須加 WITH(NOLOCK) 避免產生沒有必要的鎖出來。blog
由於字段多,數據多一個索引沒有走。索引
加了字段後就會快不少比你查所有的快不少,精準的查詢。it
------------------------------------------------------------------------------------------------------------io
UserId=@userId AND TaskId=2 AND AddTime>=@stime AND AddTime<@etime 若是UserId和AddTime是索引,TaskId不是,那像上面這樣只會走一個索引。
UserId=@userId AND AddTime>=@stime AND AddTime<@etime AND TaskId=2 若是改爲上面這樣就會走兩個索引。
UPDATE SignLog SET NUM+=1 WHERE UserId=@userId AND AddTime>=@stime AND AddTime<@etime AND TaskId=2
像上面這樣的更改語句這樣寫是沒有什麼的,若是是在存儲過程寫的話像下面同樣寫會比你上面寫法快。
DECLARE @ID INT=0 SELECT TOP 1 @ID=ID FROM SignLog WITH(NOLOCK) WHERE UserId=@userId AND AddTime>=@stime AND AddTime<@etime AND TaskId=2 UPDATE SignLog SET NUM+=1 WHERE ID=@ID
像這樣寫正常會快點,並且也不會產生沒有必要的鎖出來,並且該走的索引都走了。class
能走索引就走索引,索引確定比你正常的快丶丶。im
-------------------------------------------------------------------------------------------------------------d3
UPDATE dbo.Activity_RoomActivity SET ActivityState=2 WHERE ActivityState=0 AND StartTime<DATEADD(hh,-1,GETDATE())
這樣更新一個索引沒有走上,並且還一條一條改。
能夠改爲如下差很少的。
SELECT Id INTO #temp FROM dbo.Activity_RoomActivity WITH(NOLOCK) WHERE ActivityState=0 AND StartTime<DATEADD(hh,-1,GETDATE()) UPDATE t1 SET t1.ActivityState=2 FROM dbo.Activity_RoomActivity t1,#temp t2 WHERE t1.Id=t2.Id
這樣修改的時候就會走索引去修改。
SELECT DATEDIFF(S,'1970-01-01 8:00:00', @addTime)