Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
Помогите пожалуйста! Необходимо ограничить количество выводимых записей,
допустим в таком запросе:

данный запрос возвратит 1000 записей:
select count(*) from table1 group by 1;

задача заключается, узнать возвратит ли запрос больше 10 записей, и при превышении лимита прекратить выборку.
17 ноя 04, 15:05    [1113520]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Enlighten me
Member

Откуда:
Сообщений: 172
win-kim
Помогите пожалуйста! Необходимо ограничить количество выводимых записей,
допустим в таком запросе:

данный запрос возвратит 1000 записей:
select count(*) from table1 group by 1;

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

Если не использовать возможности клиента, то:
select first 10  from table1
или, если запрос неизменен по количеству столбцов и часто повторяется, написать хранимую процедуру.
17 ноя 04, 15:12    [1113553]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
Помогите пожалуйста! Необходимо ограничить количество выводимых записей,
допустим в таком запросе:

данный запрос возвратит 1000 записей:
select count(*) from table1 group by 1;

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

Данный запрос вернет 1 запись.

Но то что ты хочешь очень похоже на select first 10 * from mytable
PS: запрос с first обычно используют с order by, иначе вернуться любые 10 записей
17 ноя 04, 15:13    [1113561]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
Дело в том, что мне не нужно первые десять записей, которые вернет запрос. Мне нужно узнать, возвратит ли запрос больше 10 записей.

select count(*) from table1 group by 1;

группировка занимает продолжительное время, и,
может быть можно сделать, что если при выполнении запроса сервер информикс собрал уже 10 записей, то прекратить выборку или что нибудь вроде этого.
17 ноя 04, 15:21    [1113596]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
Журавлев Денис

PS: запрос с first обычно используют с order by, иначе вернуться любые 10 записей

Еще минуту подумал и вспомнил что недавно написал кучу запросов select first 500, без order by, а сортировал на клиенте и при recordcount=500 пользователю показывал предупреждение о том что он видит не все :).
17 ноя 04, 15:21    [1113599]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
Дело в том, что мне не нужно первые десять записей, которые вернет запрос. Мне нужно узнать, возвратит ли запрос больше 10 записей.

select count(*) from table1 group by 1;

группировка занимает продолжительное время, и,
может быть можно сделать, что если при выполнении запроса сервер информикс собрал уже 10 записей, то прекратить выборку или что нибудь вроде этого.


select first 11 * from mytable where mycodition

если вернет 11 значит true :).
17 ноя 04, 15:23    [1113621]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
Журавлев Денис
win-kim
Дело в том, что мне не нужно первые десять записей, которые вернет запрос. Мне нужно узнать, возвратит ли запрос больше 10 записей.

select count(*) from table1 group by 1;

группировка занимает продолжительное время, и,
может быть можно сделать, что если при выполнении запроса сервер информикс собрал уже 10 записей, то прекратить выборку или что нибудь вроде этого.


select first 11 * from mytable where mycodition

если вернет 11 значит true :).


а еще лучше select first 11 1 from mytable where mycodition
17 ноя 04, 15:26    [1113640]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
У меня идет группировка(!). Группировка 4 млн. записей занимает время (!). При выполнении запроса (select count(*) from mytable group by field) окажется, что запрос возвратил 100 тыс. записей. Я же хочу чтобы информикс прекратил выполнение запроса, если уже (при выборке) записей больше 5000.

best regards,
win-kim
17 ноя 04, 15:29    [1113660]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
Дело в том, что мне не нужно первые десять записей, которые вернет запрос. Мне нужно узнать, возвратит ли запрос больше 10 записей.

select count(*) from table1 group by 1;

группировка занимает продолжительное время, и,
может быть можно сделать, что если при выполнении запроса сервер информикс собрал уже 10 записей, то прекратить выборку или что нибудь вроде этого.


Чего-то ты не договариваешь. В данном запросе группировка не может занимать продолжительное время, т.к. группируется 1 запись, фактически это эквивалентно:
select distinct count(*) from table1
17 ноя 04, 15:32    [1113683]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
У меня идет группировка(!). Группировка 4 млн. записей занимает время (!). При выполнении запроса (select count(*) from mytable group by field) окажется, что запрос возвратил 100 тыс. записей. Я же хочу чтобы информикс прекратил выполнение запроса, если уже (при выборке) записей больше 5000.

best regards,
win-kim

Ты нас запутал group by 1 <> group by field

т.е. уникальных значений в поле field > 5000
тогда select first 5001 distinct field from mytable и индекс по field

или на любое значение field count(*)>5000, тогда только твой вариант с группировкой но индекс по field поможет.
17 ноя 04, 15:41    [1113728]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
ты меня подтолкнул к мысли,
ладно я домой, сенкс большой!


best regards,
win-kim
17 ноя 04, 15:42    [1113731]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
Извини за глупый возможно вопрос:
Мне информикс позволит выполнить
select first 10 count(*) from mytable group by 1,2
в процедуре?

Я сделал так
if exists(select first 10 count(*) from mytable group by 1,2) then ...
информикс ругается.

best regards,
win-kim
17 ноя 04, 16:07    [1113870]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
Извини за глупый возможно вопрос:
Мне информикс позволит выполнить
select first 10 count(*) from mytable group by 1,2
в процедуре?

Я сделал так
if exists(select first 10 count(*) from mytable group by 1,2) then ...
информикс ругается.

best regards,
win-kim


group by 1,2 -- это чего такое? 1 = count(*), а 2 = чего такое?

Поля надо явно писать select first 10 a,b,count(*) from mytable group by 1,2
17 ноя 04, 16:12    [1113911]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
Я ведь могу написать так:
select count(*) from mytable group by a,b;

------------
у меня получается:
select count(*) from t1 group by a,b;
и
select first 1000 count(*) from t1 group by a,b;
выполняются одинаковой продолжительностью по времени.

best regards,
win-kim
17 ноя 04, 16:23    [1113970]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
Я ведь могу написать так:
select count(*) from mytable group by a,b;

------------
у меня получается:
select count(*) from t1 group by a,b;


но не group by 1,2
17 ноя 04, 16:52    [1114149]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
я согласен это я для скорости :), извини за неточность.
Так все таки как мне быть?

best regards,
win-kim
17 ноя 04, 16:57    [1114170]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
я согласен это я для скорости :), извини за неточность.
Так все таки как мне быть?

зависит от того чего ты хочешь.

автор

1. уникальных значений в поле field > 5000
тогда select first 5001 distinct field from mytable и индекс по field

2. или на любое значение field count(*)>5000, тогда только твой вариант с группировкой но индекс по field поможет.
17 ноя 04, 16:59    [1114185]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
win-kim
Member

Откуда: Астана
Сообщений: 60
Мне нужно быстро проверить сколько записей возвратит мой запрос.

как я пониманию:
select first 100 count(*) from t1 group by a,b;
информикс сначала группирует все данные, а потом показывает первые 100, или я ошибаюсь?

best regards,
win-kim
17 ноя 04, 17:04    [1114205]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
win-kim
Мне нужно быстро проверить сколько записей возвратит мой запрос.

как я пониманию:
select first 100 count(*) from t1 group by a,b;
информикс сначала группирует все данные, а потом показывает первые 100, или я ошибаюсь?

best regards,
win-kim


Да. Индекс t1(a,b) есть?

Но это тоже самое что select first 100 distinct a,b from t1 ?
17 ноя 04, 17:07    [1114215]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить количество записей при выборке?  [new]
Vybegallo
Guest
Your idea of count(*) is incorrect. Check this :


create table t1 (col1 int);
insert into t1 values (1);
insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (2);

select count(*) from t1 group by col1
(count(*))

2
2

You need to use temp table for "group by" results, or you can use
select count(unique col1) from t1

I doubt there is a standard way to stop query after N records are selected.
"first N" does not work in stored procedures.
I testes something like this :
select case when count(unique col1) > 1
then 1
else 0
end
from t1

in a hope that optimizer would stop query processing after condition "count(unique col1 ) > 1" is met. Unfortunately, it doesn't.

What you can do is
1. insert into t2 select ...group ..
2. from another session, run monitoring script
select count(*) from t2

when that select returns more then 5000, you can interrupt the first session.
17 ноя 04, 17:46    [1114377]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить