Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
SaorDual Member Откуда: Сообщений: 34 |
Добрый день! При выполнении продолжительного запроса в MSMS к большой таблице select top 1000000 * from <таблица в 100 млн.записей> результат начинает выводится сразу, но в строке состояние отображается "Выполнение запроса..." и меняется на "Запрос успешно выполнен" через 10-20 секунд. Т.е. часть данных была передана и отображена раньше чем выполнился сам запрос. С чем это связано? И как можно сделать, чтобы отображение (передача данных) началась только после выполнения запроса? |
28 авг 18, 11:18 [21655860] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
|
||
28 авг 18, 11:27 [21655878] Ответить | Цитировать Сообщить модератору |
SaorDual Member Откуда: Сообщений: 34 |
invm, Нет, дело в том, что у меня есть код на shell. Смысл в следующем - отправляем запрос в БД (*), получаем данные, в цикле в shell-е начинаем обработку каждой записи и удаляем эту запись из таблицы к которой ранее был запрос (*). Так вот у нас при определенных условиях (select top 2500 ... работает, а вот select top 3250... уже нет) начинает вылезать взаимоблокировка. Идем на сервер и видим, что команда на удаление записи заблокирована сеансом (*). Получается, что часть данных передалось и началась обработка, но запрос ещё не завершился и при попытке удалитьзапись которую отобрали он взаимоблокируется. Сам не понимаю как так происходит, но факт в этом |
28 авг 18, 11:39 [21655903] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
SaorDual, А что, удалять сразу нельзя? Надо обязательно построчно на клиенте? |
28 авг 18, 11:47 [21655916] Ответить | Цитировать Сообщить модератору |
SaorDual Member Откуда: Сообщений: 34 |
invm, нет нельзя. скажем так, у нас дайлер, т.е. 1 запись это звонок клиенту, надо посмотреть есть ли у нас свободные линии, произвести набор звонка на номер,и лишь после набора из колл-листа удалить данную запись |
28 авг 18, 11:51 [21655931] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
SaorDual,if object_id('tempdb..#t', 'U') is not null drop table #t; select top (100000) * into #t from <таблица в 100 млн.записей>; select * from #t; ЗЫ: Ваш подход нежизнеспособен. Убедитесь в этом, как только возникнет потребность в нескольких обработчиках для "надо посмотреть есть ли у нас свободные линии, произвести набор звонка на номер,и лишь после набора из колл-листа удалить данную запись". |
28 авг 18, 12:00 [21655944] Ответить | Цитировать Сообщить модератору |
SaorDual Member Откуда: Сообщений: 34 |
А первоначальный вопрос, можно ли каким либо, например, SET ... указать, чтобы данные начали передаваться по завершению запроса? |
28 авг 18, 12:10 [21655961] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
|
||
28 авг 18, 12:12 [21655967] Ответить | Цитировать Сообщить модератору |
SaorDual Member Откуда: Сообщений: 34 |
invm, Спасибо |
28 авг 18, 12:23 [21655981] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6149 |
На shell - на powershell? Как получаете данные? Классами ADO.Net? Если да - эти классы не умеют делать пейджинг, и отдавать данные порциями по мере поступления.
Вообще в случаях дедлоков в первую очередь смотрят дедлок-графы. Без этого выстраивать свои собственные "получается" - это гадать на кофейной гуще. |
||||
28 авг 18, 12:30 [21655993] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31817 |
Но МС оставила возможность делать так, как вы хотите, то есть начинать обрабатывать записи после выполнения всего запроса и снятия блокировок. Для этого нужно просто считать полученный рекордсет в память, закрыть его, а потом уже начать обрабатывать. Вообще говоря, это метод больше подходит для OLTP систем, так что мы всегда использовали его. |
||
28 авг 18, 12:35 [21655999] Ответить | Цитировать Сообщить модератору |
SaorDual Member Откуда: Сообщений: 34 |
Сон Веры Павловны, спасибо большое, дедлок-графы действительно помогли |
28 авг 18, 15:08 [21656342] Ответить | Цитировать Сообщить модератору |
AndrF Member Откуда: Сообщений: 2194 |
Вам же не нужно именно отображение. Вам нужно чтобы SELECT не блокировал таблицу при выполнении. Ну и скажите ему (NOLOCK) SELECT * FROM Таблица (NOLOCK) |
||
28 авг 18, 15:16 [21656367] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
ещё, как вариант, можно в запросе сортировку добавить не по индексу :) |
||
28 авг 18, 18:31 [21656759] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31817 |
А чтение в память не повышает нагрузку ни на сервер, ни на клиент. |
||||
28 авг 18, 21:38 [21656926] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
понимаю, это было скорее из области вредных советов ) хотя эффекта, требуемого автору, достичь можно |
||||
29 авг 18, 12:47 [21657490] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |