2010-11-01 2 views
3
SELECT TOP 1 * 
FROM URLForPosting WITH(nolock) 
WHERE status = 0 
ORDER BY newid() 

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

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

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

Она работает прекрасно.

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

Любые предложения?

+0

Порядок по newid() - это не-go. Вы сортируете значение, которое является полностью случайным и не может быть проиндексировано! Чего вы пытаетесь достичь? –

+0

Я выбираю ссылки из базы данных, и я хочу получить их случайным образом, и когда после завершения моей задачи я установил там статус 1 ... –

+0

Что вы предлагаете мне делать, если я хочу случайным образом выбирать значения из базы данных не в order –

ответ

4

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

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

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

+0

+1, потому что я никогда не знал об этом **, но **: 'Если вы укажете небольшое число, например 5, вы не могли бы получить результаты в sample.' – egrunin

+0

хорошо я использовал это вместо NEWID(), и она решена проблема ВЫБОР сверху 1 * оТ URLForPosting когда статус = 0 и (АБС (CAST ( (BINARY_CHECKSUM (*) * RAND()) as int))% 100) <1 –

0

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

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

+0

Я использовал это вместо newid(), и он решил проблему SELECT top 1 * FROM URLForPosting WHERE status = 0 и (ABS (CAST ((BINARY_CHECKSUM (*)) * RAND()) как int))% 100) <1 –

Смежные вопросы