我需要你的帮助:)。
我在数据库中有一个表(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);
答案 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锁定提示来处理这种情况:
答案 4 :(得分:-1)
如果该表用于作业调度和处理,也许您可以使用MSMQ来解决此问题。你不需要担心锁定等问题。它在企业上也可以更好地扩展,并且具有许多不同的发送/接收模式。
您可以在此处了解详情: http://msdn.microsoft.com/en-us/library/windows/desktop/ms711472(v=vs.85).aspx