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);
索引应该放在查询的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