Выполнение SQL-запроса - получение тайм-аута - PullRequest
3 голосов
/ 01 ноября 2010
SELECT TOP 1 * 
FROM URLForPosting WITH(nolock) 
WHERE status = 0 
ORDER BY newid()

Это запрос, когда я запускаю в коде тайм-аут, даже когда я запускаю его на SQL Server, я получаю таймаут.

Однако, когда я делаю это

SELECT TOP 1 * 
FROM URLForPosting WITH(nolock) 
WHERE status = 0 

Работает отлично.

Кроме того, первый запрос работал нормально, пока в записях для первых 6 не было записей, которых в общей сложности 8, теперь он дает время ожидания? Я создал индекс по статусу.

Есть предложения?

Ответы [ 2 ]

4 голосов
/ 01 ноября 2010

Альтернативный способ вернуть случайную запись - использовать TABLESAMPLE.Посмотрите, как это выполняется:

SELECT TOP 1 * 
FROM URLForPosting TABLESAMPLE(1) WITH(nolock) 
WHERE status=0 
ORDER BY newid()

TABLESAMPLE доступно в SQL Server 2005 и более поздних версиях.

0 голосов
/ 01 ноября 2010

Поскольку он работал нормально, когда у вас было 600К записей, а зависал на 800К, вполне вероятно, что вставки привели к фрагментации ваших индексов.Заставьте своего администратора БД (или кого-либо с правами db_owner) запустить DBCC DBREINDEX(URLForPosting).

Или для версий 2005 года и выше вы можете использовать ALTER INDEX REBUID .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...