我有一个存储过程,在我的应用程序中似乎是我的瓶颈。问题在于它所应用的表格经常更新(大约每秒一次,有几十条记录) - 因此索引并非易事。
似乎对于SP的每个X运行 - 有一个运行大约需要1.5秒(其他运行大约300-400ms或更短)。在我的理解中,它正在更新索引树。
RBDMS是SQL Server 2008 R2。
这是SP:
存档和实时表的PK是“pk1”(例如) - 这里没有使用它。
FK是userid(Table_Users中的PK)
INSERT INTO Table_Archive
SELECT userid, longitude, latitude, direction, RcvDate
FROM Table_Live
WHERE userid = @userid
DELETE FROM Table_Live WHERE userid = @userid
-- write down the new location
INSERT INTO
Table_Live (userid, longitude, latitude, direction)
VALUES (@userid, @lon, @lat, @dir)
UPDATE Table_Users
SET location = 'true'
WHERE loginid = (SELECT MAX(loginid) as loginid
FROM Logins
WHERE userid = @userid)
知道如何才能让它以最佳状态运行?优选地,它应该在200ms以下运行。
答案 0 :(得分:1)
不是正在更新的索引树:这是ACID的一部分。当DML完成时,所有内部结构(包括索引,检查,外键检查等)也将完成。 SQL Server
中没有推迟此类检查这可能是统计更新和编译时间(更新统计信息时计划无效)。统计信息更新(IIRC)由500行+ 20%的更改引起。因此,如果您在具有“数千”行的表上插入“每秒数十行”,则需要刷新统计信息
我的第一个想法是设置asynchronous statistics:不禁用它们
答案 1 :(得分:0)
唯一明显的事情是:loginid
中的userid
和Table_Users
上是否有指数?
两者都用于UPDATE语句中的WHERE子句,并且还有一个MAX()
函数应用于loginid
另一件有用的东西:实际上不删除存储过程中的行。这会为你节省很多时间。尝试异步更新 - 与数据库分开。例如。将@userid
值写入“命令表”并让SQL作业删除这些行,例如每小时一次。