SELECT花费的时间太长了

时间:2012-02-25 17:57:12

标签: c# performance sql-server-2008 select

我需要你的帮助:)。

我在数据库中有一个表(SQL Server 2008 R2)。目前大约有4M行。

消费者应用程序从那里获取行(锁定它们并处理它们)。

为了保护行不被多个消费者占用,我通过在适当的列中添加一些标志来锁定它......

所以,要“锁定”我做的记录

SELECT TOP 1  .....

然后使用某个特定ID记录UPDATE操作。

此操作现在最多需要5秒钟(我在SQL Server Management Studio中尝试过):

SELECT TOP 1 * 
FROM testdb.dbo.myTable 
WHERE recordLockedBy is NULL;

如何加快速度?

这是表结构:

CREATE TABLE [dbo].[myTable](
[id] [int] IDENTITY(1,1) NOT NULL,
[num] [varchar](15) NOT NULL,
[date] [datetime] NULL,
[field1] [varchar](150) NULL,
[field2] [varchar](150) NULL,
[field3] [varchar](150) NULL,
[field4] [varchar](150) NULL,
[date2] [datetime] NULL,
[recordLockedBy] [varchar](100) NULL,
[timeLocked] [datetime] NULL,
[field5] [varchar](100) NULL);

5 个答案:

答案 0 :(得分:1)

索引应放在查询的where子句中使用的任何列上。因此,您应该为recordLockedBy添加索引。

如果您不了解索引,请查看here

答案 1 :(得分:0)

快速入门:

ALTER TABLE myTable
    ADD INDEX IDX_myTable_recordLockedBy (recordLockedBy)

答案 2 :(得分:0)

你的select语句是否也按id查询?如果是这样,那么应将其设置为具有聚簇索引的主键(我相信PK的默认值)。然后SQL将能够直接跳转到记录 - 应该是即时的。没有它会进行表扫描,查看它们出现在磁盘上的序列中的每个记录,直到它找到你所追踪的那个。

答案 3 :(得分:0)

这不会阻止表上的竞争条件,并允许多个消费者处理同一行。

查看UPDLOCK和READPAST锁定提示来处理这种情况:

http://www.mssqltips.com/sqlservertip/1257/processing-data-queues-in-sql-server-with-readpast-and-updlock/

答案 4 :(得分:-1)

如果该表用于作业调度和处理,也许您可​​以使用MSMQ来解决此问题。你不需要担心锁定等问题。它在企业上也可以更好地扩展,并且具有许多不同的发送/接收模式。

您可以在此处了解详情: http://msdn.microsoft.com/en-us/library/windows/desktop/ms711472(v=vs.85).aspx