2011-05-02 112 views
2

我有一个存储过程,似乎是我的应用程序中的瓶颈。问题在于它所使用的表格更新频繁(每秒大约一次记录一次) - 所以索引不是微不足道的。SQL索引问题

似乎对于SP的每一次X运行 - 有一次运行需要大约1.5秒(其他运行约300-400ms或更少)。在我的解释中,索引树正在更新。

RBDMS是SQL Server 2008 R2。

这里是SP:

的PK存档和现场表“PK1”(例如) - 这是不被用在这里。

的FK是用户ID(这是一个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

@marc_s - 所有表行都在第一条语句中显示。存档和实时表的相同行。 – Roman 2011-05-02 07:53:23

+0

@marc_s - 存档表的数百万行和Live表的数千行。 – Roman 2011-05-02 07:53:53

+0

是的 - 但**类型**是那些列?那些**全**列?哪些指数已经在plcae? – 2011-05-02 07:53:54

回答

0

唯一明显的情况是:有loginiduserid的指数Table_Users

两者都被用于在UPDATE语句的WHERE子句中,也有适用于loginid

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

+0

当然还有:) – Roman 2011-05-02 07:58:46

+0

插入后添加了几个索引后,它不能成为B树吗? – Roman 2011-05-02 07:59:39

+0

@roman:否 - 它可能是更新统计数据或类似的东西 - 偶尔会发生这种情况 – 2011-05-02 08:00:35

1

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

这可能是统计信息更新和编译时间(更新统计信息时计划失效)。统计信息更新(IIRC)是由500行+ 20%的更改引起的。因此,对于如果要插入“每秒几十行的”对表“成千上万”行,你就需要统计刷新

我首先想到的是设置asynchronous statistics禁用它们

+0

ooohh ....那是一个非常糟糕的:)试过 - 在某些场合几乎增加了一倍的查询时间(不知何时)。不知道这是怎么回事... – Roman 2011-05-02 20:11:58