SELECT занимает слишком много времени - PullRequest
1 голос
/ 25 февраля 2012

Мне нужна ваша помощь:)

У меня есть таблица в базе данных (SQL Server 2008 R2). В настоящее время около 4 миллионов строк.

Потребительские приложения берут строки оттуда (блокируют их и обрабатывают).

Чтобы защитить строки от захвата более чем одним потребителем, я блокирую их, добавив флаг в соответствующий столбец ...

Итак, для «блокировки» записи я делаю

SELECT TOP 1  .....

и затем 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 ]

1 голос
/ 25 февраля 2012

Индексы следует размещать в любых столбцах, которые вы используете в предложении where вашего запроса. Поэтому вы должны добавить индекс к recordLockedBy.

Если вы не знаете об индексах, посмотрите здесь

0 голосов
/ 26 февраля 2012

Если таблица используется для планирования и обработки заданий, возможно, вы можете использовать MSMQ для решения этой проблемы.Вам не нужно беспокоиться о блокировке и подобных вещах.Он также значительно лучше масштабируется на предприятии и имеет много различных режимов отправки / получения.

Подробнее об этом можно узнать здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms711472(v=vs.85).aspx

0 голосов
/ 25 февраля 2012

Это не предотвратит состояние гонки в таблице и не позволит обрабатывать одну и ту же строку несколькими потребителями.

Посмотрите на подсказки блокировки UPDLOCK и READPAST для обработки этого случая:

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

0 голосов
/ 25 февраля 2012

Ваш запрос оператора также запрашивает идентификатор?Если так, это должно быть установлено как первичный ключ с кластеризованным индексом (по умолчанию для PKs, я полагаю).SQL сможет сразу перейти к записи - должно быть почти мгновенно.Без этого будет производиться сканирование таблицы с просмотром каждой записи в той последовательности, в которой они появляются на диске, пока не будет найдена та, которая вам нужна.

0 голосов
/ 25 февраля 2012

Быстрый стартер для вас:

ALTER TABLE myTable
    ADD INDEX IDX_myTable_recordLockedBy (recordLockedBy)
...