Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с остановкой запроса  [new]
Shev
Member

Откуда: с холодного севера
Сообщений: 93
Здравствуйте!

Проблема уже не раз обсуждавшаяся, но хорошого ответа я так и не нашел.

Есть большая таблица (более 300 млн записей). Требуется, чтобы пользователь мог отменить запрос, посланный ранее.

Запускаю TADODataSet в асинхронном режиме. Смотрю в диспетчер задач - начинает увеличиваться размер потребляемой памяти (вообщем, все ок - данные идут). Вызываю метод Cancel - увеличение памяти прекратилось. Типа все завершилось как надо, записи перестали бежать. Подтверждение тому - событие OnFetchProgress - перестало срабатывать.
Но! Сервер продолжает усиленно работать (это по мигающим лампочкам винчестера видно). Проверяю в Enterprase Manager - у процесса статус runnable. Спустя нескольких минут, когда запрос все же отработает приходит сообщение OnFetchComplete.

Если попытаться еще раз послать запрос (до OnFetchComplete), то выскакивает Exception "Object was open".

DataSet: TADODataSet;

procedure TForm1.btnStartClick(Sender: TObject);
begin
if DataSet.Active then
DataSet.Close;

DataSet.ExecuteOptions:=[eoAsyncExecute, eoAsyncFetch];

DataSet.CommandText:='select * from table1';
DataSet.Open;
end;

procedure TForm1.btnStopClick(Sender: TObject);
begin
if DataSet.Recordset<>nil then
begin
DataSet.Recordset.Cancel;
DataSet.Recordset.Close;
end;
end;

procedure TForm1.DataSetFetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
begin
EventStatus:=esOK;
memResult.Lines.Add('Выполнение запроса окончено');
end;

procedure TForm1.DataSetFetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
StatusBar.Panels[0].Text:='Записей: '+IntToStr(Progress);
end;

В чем проблема?!
27 ноя 03, 17:01    [436775]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Сервер, скорее всего, освобождает ресурсы, выделенные для выполнения запроса - дропает временные таблицы, откатывает транзакции и т.д.
27 ноя 03, 17:05    [436783]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор писал:
...
более 300 млн записей
...
'select * from table1'
...


Интересно - это чисто научные исследования или...

автор писал:
Но! Сервер продолжает усиленно работать (это по мигающим лампочкам винчестера видно). Проверяю в Enterprase Manager - у процесса статус runnable.


Ну так может он там подчишал за вами в tempdb или еще что-нибудь делал. Файл подкачки чистил, может быть.
27 ноя 03, 17:07    [436787]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
Shev
Member

Откуда: с холодного севера
Сообщений: 93
>'select * from table1'

Запрос чисто условный, дабы не засорять головы лишней информацией. Естественно в оригинале стоят условия для небольшой выборки.

Самое что интересное, это то что длительность от начала запуска запроса и до OnFetchComplete одинаковое, независимо от того вызывается метод Cancel или нет. Хотя еще раз напомню, что при вызове Cancel записи действительно прекращают поступать на клиента. При этом, если абсолютно такой же запрос послать из QA и там прекратить его, то сервер мгновенно прекращает работу.

Такую же проблему я обнаружил на форуме RSDN, но там вопрос остался без ответа.
27 ноя 03, 17:39    [436846]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
Shev
Member

Откуда: с холодного севера
Сообщений: 93
Приподнимаю тему...
28 ноя 03, 08:30    [437415]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
А тип курсора у тебя какой?
28 ноя 03, 08:42    [437429]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
Shev
Member

Откуда: с холодного севера
Сообщений: 93
CursorType:=ctKeyset
CursorLocation:=clUseClient

Но вообще, провобал разные варианты CursorType и CursorLocation
28 ноя 03, 08:58    [437449]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
Shev
Member

Откуда: с холодного севера
Сообщений: 93
Еще информация, полученная мной после исследования запросов Profiler'ом.

Запрос:
select * from rcCalls (index=idx_date) where cl_date between
'21/09/2003 00:00:00' and '25/09/2003 12:00:00'

Вот что оказывается реально посылается серверу:

Из QA:
select * from rcCalls (index=idx_date) where cl_date between
'21/09/2003 00:00:00' and '25/09/2003 12:00:00'

Т.е. мой запрос и ничего лишнего.


Из клиента через АДО:

declare @P1 int
set @P1=1
exec sp_prepare @P1 output, NULL, N'select * from rcCalls (index=idx_date) where cl_date between
''21/09/2003 00:00:00''
and ''25/09/2003 12:00:00''
', 1
select @P1

Что за sp_prepare? В BOL про нее кратко написано, что предназначена для подготовки запроса.
28 ноя 03, 10:06    [437536]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
Вы четко себе представляете, что такое ctKeySet? Попробуйте CursorType:=ctStatic;
28 ноя 03, 12:00    [437834]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
ЗЫ
Guest
Попробуй грязное чтение (nolock)
28 ноя 03, 13:08    [438029]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
Shev
Member

Откуда: с холодного севера
Сообщений: 93
Вот что еще отловил профайлером:

На реально посылаемый запрос в АДО сильно влияет параметр CommandType.

В предыдущем моем после я запускал с CommandType=cmdText. Вот АДО и лепила для него кучу дополнительных строк.
Если запустить с CommandType=cmdUnknown, то АДО ничего своего к запросу не добавляет, но все равно метод Cancel всего-лишь отменяет запрос у клиента, на сервере запрос как продолжал выполнятся, так и продолжает....
28 ноя 03, 15:46    [438510]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с остановкой запроса  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Не это ли часом?
http://support.microsoft.com/default.aspx?scid=kb;en-us;325338&Product=sql2k
3 дек 03, 13:18    [444340]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить