2014-08-29 3 views
0

Я пишу приложение. Есть 30 потоков, которые читают одну таблицу для ввода. Например.Увеличение производительности одновременных выборок и обновлений

Select top 1 name from table1 where flag != 1 order by mypriority 

Теперь, когда имя считывается, бит столбца обновляется, чтобы отметить, что строка читается. Например.

Update table1 set flag = 1 where name = 'name' 

Оператор обновления сразу после выбора. Проблема, с которой я столкнулся, что многие потоки читают одну и ту же строку и, таким образом, обрабатывают одно и то же имя, которое является повторяющейся работой.

Я пробовал:

Select top 1 name from table1 with (updlock) where flag != 1 

Это делает одну строку для чтения в то время. И поток ждет завершения одного обновления. Таким образом, они могут читать следующее имя. Таким образом, нет выгоды от нескольких потоков.

Может ли кто-нибудь посоветовать лучший способ/способ использования.

Пожалуйста, спросите, если мой вопрос не очень ясен.

+0

Есть ли причина, по которой вам нужно делать это «чтение» по одной строке за раз? Кроме того, у вас есть запрос с TOP, но не с ORDER BY. Это означает, что каждый раз, когда этот запрос запускается, вы можете получить другое значение для первой строки. –

+0

@SeanLange: Я просто добавил заказ. Таким образом, эти потоки занимают одну строку, выполняют некоторую обработку и сохраняют результат в другой строке. Эта обработка похожа на посещение сайта и получение данных. –

ответ

0

Вы можете использовать транзакции, чтобы каждая строка читалась один раз.

begin transaction t 
Select top 1 name from table1 where flag != 1 order by mypriority 
Update table1 set flag = 1 where name = 'name' 
commit transaction t 

Большая проблема заключается в том, что время обработки каждой строки вашими нитями кажется незначительным. Если все ваши потоки выполняют эти два запроса в цикле, вы не получите никакой производительности, используя mutliple threads.

Есть ли веская причина читать только по одной строке за раз? Есть ли веская причина использовать несколько потоков? Пожалуйста, подробно расскажите, чего вы пытаетесь достичь.

EDIT Вы сказали, что выполняете обработку с помощью записи, которую вы получаете. Сколько времени занимает эта обработка по сравнению с выполнением двух представленных вами запросов? Если время обработки меньше времени выполнения запросов, запуск более двух потоков не имеет смысла.

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