SELECT花费的时间太长

本文关键字:时间 SELECT | 更新日期: 2023-09-27 18:25:58

我需要你的帮助:)

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

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

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

所以,为了"锁定"记录,我做

SELECT TOP 1  .....

然后用一些特定的ID对记录进行CCD_ 1操作。

此操作现在最多需要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);

SELECT花费的时间太长

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

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

更快速的入门软件:

ALTER TABLE myTable
    ADD INDEX IDX_myTable_recordLockedBy (recordLockedBy)

您的select语句也按id查询吗?如果是这样,则应该将其设置为具有聚集索引的主键(我认为这是PK的默认值)。SQL将能够直接跳转到记录——应该是接近即时的。如果没有它,它将对磁盘上出现的序列中的每一条记录进行表扫描,直到找到你想要的记录。

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

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

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

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

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