Мне нужна ваша помощь :)SELECT занимает слишком много времени
У меня есть таблица в базе данных (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);
не делать '' выбрать *, его быстрее явно перечислить столбцы, даже если вы хотите, чтобы все из них. –
@ Muad'Dib, в то время как я согласен на 100% с настроением и блогами и часто говорю об этом (например, http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick -using-select-omitting-the-column-list.aspx), разница в скорости - если вам действительно нужны все столбцы - настолько минимальна, что она не существует для всех целей и задач. Этот аргумент похож на то, что падение капли воды на вашем капот повлияет на аэродинамику и приведет к ухудшению газового пробега.В то время как академически верно, трудно доказать (и многое, намного сложнее оправдать выход и вытирать его). –
@Aaron Я полностью согласен с очевидными исключениями из большого столбца BLOB/CLOB/XML/etc, который будет болотовать соединение, но не нужен –