Пока 2 вопроса общего плана

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
WAKE-UP
Сообщения: 20
Зарегистрирован: 17 ноя 2004, 12:26

Пока 2 вопроса общего плана

Сообщение WAKE-UP » 03 дек 2004, 13:17

1. Как прервать текущий запрос (select)
а) с получением уже обработанных данных
б) без получения уже обработанных данных
2. После большого select-а машина находится в состоянии "напряга" - много свопится и т.п. Как избавить?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Пока 2 вопроса общего плана

Сообщение Merlin » 03 дек 2004, 13:52

Пока 2 ответа не менее общего плана.
WAKE-UP писал(а):1. Как прервать текущий запрос (select)
а) с получением уже обработанных данных
б) без получения уже обработанных данных
Завалить сервер целиком если это супер или этот процесс если это классика. С риском повредить базу. В буфере клиента останутся уже переданные на него записи, если таковые есть. Возможность их посмотреть зависит целиком и полностью от клиентских компонентофф.
WAKE-UP писал(а): 2. После большого select-а машина находится в состоянии "напряга" - много свопится и т.п. Как избавить?
Не писать плохие запросы и следить за тем, чтоб в базе не копился мусор тоннами.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Пока 2 вопроса общего плана

Сообщение kdv » 03 дек 2004, 14:30

WAKE-UP писал(а):1. Как прервать текущий запрос (select)
а) с получением уже обработанных данных
это как это? пока данные не обработаны целиком, серверу и выдавать нечего.
в момент обработки данных прервать текущий запрос могут только IB6.5 через IB API и IB 7.x через tmp$statements.
б) без получения уже обработанных данных
тут и прерывать нечего. просто не выбираешь данные (fetct), а закрываешь запрос.
2. После большого select-а машина находится в состоянии "напряга" - много свопится и т.п. Как избавить?
много свопится куда и чего?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Пока 2 вопроса общего плана

Сообщение Merlin » 03 дек 2004, 15:46

kdv писал(а): это как это? пока данные не обработаны целиком, серверу и выдавать нечего.
Дим, поселекть isql без ордер бай какую-нить таблицу-миллионник (чтоб успеть процесс грохнуть до завершения) и таки грохни его. Если фетч уже пошёл, то часть передана. С какого объёма он начинает формировать сетевые пакеты и выпихивать я толком не знаю, но точно не после формирования всего курсора, если он не требует натуральной сортировки.
kdv писал(а): в момент обработки данных прервать текущий запрос могут только IB6.5 через IB API и IB 7.x через tmp$statements.
А, ну да, про этих забыл :)

WAKE-UP
Сообщения: 20
Зарегистрирован: 17 ноя 2004, 12:26

Сообщение WAKE-UP » 03 дек 2004, 15:58

SQL = SELECT * FROM TABLE1

SQLClientDataSet.Open (SQLQuery.Open);

Как закрыть-то? Оно же синхронно работает!
Одним потоком открыть, а другим если что - закрывать?

Имеено сделать SQLQuery.Close?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 дек 2004, 11:05

to Merlin - под выполнением запроса я имею в виду от excecute до ответа сервера, что можно делать fetch. это может быть считывание одной страницы, сортировка в памяти, на диске, буферизация и т.п. (хотя вроде больше ничего). Поэтому про "прервать запрос с получением данных" - я не понимай.

to WAKE-UP. SQLQuery.Open по-моему ничего не выбирает, ну разве что выполняет запрос и выбирает одну запись. SQLClientDataSet использовать НЕ РЕКОМЕНДУЕТСЯ. ClientDataSet при открытии открывает то, из чего он будет брать данные, и делает fetchall. Поэтому тут "прервать" нельзя.

В общем, учите матчасть.

Ответить