因為公司基本都是用存盤程序所以本來寫的干歡訓本都是存盤程序的,
SELECT TOP 1 Code,Invitation,Num,Typ FROM SignLog WITH(NOLOCK) WHERE UserId=@userId AND TaskId=2 AND AddTime>=@stime AND AddTime<@etime
用以上陳述句來說一下例子:
查詢 一定要指定欄位就算你要查全部欄位也不要用*號來代替 ,以及 能用TOP盡量TOP
避免沒必要的鎖 必須加 WITH(NOLOCK) 避免產生沒有必要的鎖出來,

因為欄位多,資料多一個索引沒有走,

加了欄位后就會快很多比你查全部的快很多,精準的查詢,
------------------------------------------------------------------------------------------------------------
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
像這樣寫正常會快點,而且也不會產生沒有必要的鎖出來,而且該走的索引都走了,
能走索引就走索引,索引肯定比你正常的快丶丶,
-------------------------------------------------------------------------------------------------------------
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/36987.html
標籤:SQL Server
上一篇:隨機姓名生成方法
