簡體   English   中英

SELECT花費的時間太長

[英]SELECT takes too long

我需要你的幫助 :)

我在數據庫(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);

索引應放在查詢的where子句中使用的任何列上。 因此,您應該向recordLockedBy添加一個索引。

如果您不了解索引,請點擊此處

為您更快的入門:

ALTER TABLE myTable
    ADD INDEX IDX_myTable_recordLockedBy (recordLockedBy)

您的select語句也通過id查詢嗎? 如果是這樣,則應將其設置為具有聚集索引的主鍵(我認為是PK的默認鍵)。 然后,SQL將能夠直接跳轉到記錄-應該接近即時。 如果沒有它,則將進行表掃描,以按照它們在磁盤上出現的順序查看每個記錄,直到找到您要查找的記錄為止。

這不會阻止表上的爭用條件,並允許多個使用者處理同一行。

查看UPDLOCK和READPAST鎖定提示來處理這種情況:

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

如果該表用於作業調度和處理,也許您可​​以使用MSMQ解決此問題。 您無需擔心鎖定之類的事情。 它還可以在企業上更好地擴展,並具有許多不同的發送/接收模式。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM