SQL索引问题

时间:2011-05-02 07:47:56

标签: sql sql-server-2008

我有一个存储过程,在我的应用程序中似乎是我的瓶颈。问题在于它所应用的表格经常更新(大约每秒一次,有几十条记录) - 因此索引并非易事。

似乎对于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以下运行。

2 个答案:

答案 0 :(得分:1)

不是正在更新的索引树:这是ACID的一部分。当DML完成时,所有内部结构(包括索引,检查,外键检查等)也将完成。 SQL Server

中没有推迟此类检查

这可能是统计更新和编译时间(更新统计信息时计划无效)。统计信息更新(IIRC)由500行+ 20%的更改引起。因此,如果您在具有“数千”行的表上插入“每秒数十行”,则需要刷新统计信息

我的第一个想法是设置asynchronous statistics禁用它们

答案 1 :(得分:0)

唯一明显的事情是:loginid中的useridTable_Users上是否有指数?

两者都用于UPDATE语句中的WHERE子句,并且还有一个MAX()函数应用于loginid

另一件有用的东西:实际上不删除存储过程中的行。这会为你节省很多时间。尝试异步更新 - 与数据库分开。例如。将@userid值写入“命令​​表”并让SQL作业删除这些行,例如每小时一次。

相关问题