Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Ограничить кол-во записей, возвращаемых Query


Автор: petlyura 12.6.2008, 16:30
Привет, Форумчане!
Есть таблицы неимоверных размеров. Из них я получаю запросом некоторые записи путем задания условий WHERE и IN. Но этих записей может вернуться сотня тысяч, а мне столько даром не надо, тем более запрос много времени занимает.
Подскажите, как-то можно заставить Query возвращать не более определенного кол-ва записей, например, 1000?

P/S. Таблицы Paradox7

Автор: Dmi3ev 12.6.2008, 20:52
Есть такой предикат в SQL TOP, приведу пример:
SELECT TOP 5 field1, field2,field3, ... FROM MyTable;
Будет взято только пять записей из таблицы, в билдере не пробовал, но должно работать.

Автор: JayTi 13.6.2008, 06:59
Смотря какая СУБД, на фаербёрде есть такой указатель фёрст в запросе
Код

select first 1000 * from data

это запрос выдаст первых 1000 записей а если 
Код

select first 1000 * from data order by id desc

то вернёт последние 1000 записей
если такой вариант не подходит, то делай в своём квери к примеру
Код

short ResCount = 0;
Query->Last();
while( !Query->Bof || ResCount==1000) {
 Query->Prev();
}


Автор: petlyura 13.6.2008, 12:05
Dmi3ev, вот не работает у меня с TOP и с FIRST и с RECNO(). Не дружит Парадокс у меня с этими предикатами, функциями.

JayTi 
Код

short ResCount = 0;
Query->Last();
while( !Query->Bof || ResCount==1000) {
 Query->Prev();
}
 сам подобное делаю. Но это уже на этапе прохода по полученной выборке. Но ведь много времени тратится на выполнение самого запроса (Query->Open). И поэтому надо в SQL-выражении указать нужные вещи типа TOP, FIRST и т.п.

 Может, у кого были такие проблемы, и знаете решение, подскажите. 


Автор: fish9370 13.6.2008, 13:45
попробуй:

Код

SELECT * FROM table1 LIMIT 1000

Автор: petlyura 13.6.2008, 15:23
Не выходит и с LIMIT. Может кто-то попробует у себя создать мини-проект с таблицей Paradox и запросом к нему с TOP, FIRST или LIMIT?
И если все работает, сообщите, пожалуйста. У меня постонно ругается Token not found и т.п.

Автор: gather 15.6.2008, 09:13
Код

SELECT * FROM table1 LIMIT 0,1000

Вот так попробуйте.

Автор: jonie 15.6.2008, 11:29
если есть автоинкрементируемое поле int тогда можно так (пример, требует доработки).
Код

select * from tab where id<1000

Автор: gather 15.6.2008, 19:46
jonie, не подойдет Ваш способ, ибо он будет выбирать постоянно ПЕРВЫЕ 1000 записей. А топикастеру необходимо ОГРАНИЧИТЬ количество записей в resultset.
Кстати вот http://64.233.183.104/search?q=cache:rMVF7vUbb6gJ:forum.sources.ru/index.php%3Fact%3DPrint%26client%3Dwordr%26f%3D13%26t%3D217259+Paradox+LIMIT&hl=ru&ct=clnk&cd=8&gl=ru&lr=lang_ru схожая проблема у народа.

Автор: jonie 15.6.2008, 22:26
gather я писал что пример требует доработки. однако ничего в нем не вижу такого, чтобы его не переделать... скажем подобное на T-SQL должно прокатить.
Код

With T0 AS
    ( SELECT *
    ROW_NUMBER() as RowNum
    FROM table )
select *
from T0
Where RowNum Between 20 and 30

и вполне себе подойдет

Автор: petlyura 17.6.2008, 15:18
Цитата(gather @ 15.6.2008,  09:13)
Код

SELECT * FROM table1 LIMIT 0,1000

Вот так попробуйте.

И так не получилось. Никто не пробовал у себя создать маленький запрос на выборку с TOP, LIMIT или еще какой-нибудь хренью? У меня не выходит. Пользуюсь только BDE, табл. Paradox.

Решил попытать счастье по-другому. Взял разбил запрос на несколько десятков запросов с помощью условия WHERE. А именно, допустим первоначально возвращалось 100.000 записей, теперь организован цикл, в ходе которого возвращается по несколько тысяч записей. И когда сумма возвращенных записей превысит 32К записей, то выйти из цикла.

Но если сразу время выполнения запроса составляло несколько секунд, то сейчас - около 1,5 минут. Prepare() и индексы использую.
Меня, может, и несколько секунд бы устроило, но это всего лишь тест, в реальности, объемы таблиц могут быть значительнее. Т.е. первый вариант может угнать во времени с геометрической прогрессией, второй - мне кажется, так и останется на уровне 1,5 минут. Но это много. Что делать?

Автор: Fazil6 17.6.2008, 16:46
Цитата(jonie @  15.6.2008,  22:26 Найти цитируемый пост)
скажем подобное на T-SQL должно прокатить. .... и вполне себе подойдет

так в T-SQL есть TOP... Нафиг там выкрутасы не здались  smile 

Автор: jonie 17.6.2008, 18:56
Fazil6 ну а что парадокс не поддерживает подобное?) в плане подзапрос+автоинкримент.
и топ кстати, не даст то что я написал. всмотрись : тут постраничная выборка фактически может быть реализована. с топом так явно не прокатит (это не limit в мускуле)....
например : надо выбрать 5-ую страницу, в страниц по 20 записей. попробуй топом...при условии, например, что ключ guid типа.

Автор: petlyura 18.6.2008, 09:34
Цитата(jonie @ 15.6.2008,  22:26)
gather я писал что пример требует доработки. однако ничего в нем не вижу такого, чтобы его не переделать... скажем подобное на T-SQL должно прокатить.
Код

With T0 AS
    ( SELECT *
    ROW_NUMBER() as RowNum
    FROM table )
select *
from T0
Where RowNum Between 20 and 30

и вполне себе подойдет

Вот и ROW_NUMBER() не понимает.
Project Project1.exe raised exception class EDBEngineError with message 'Invalid use of keyword.
Token: ROW_NUMBER()
Так же он пишет и о всех TOP, LIMIT, FIRST

Автор: jonie 18.6.2008, 11:16
открой хелп и почитай наконец про функции парадокса.

Автор: petlyura 18.6.2008, 13:21
Цитата(jonie @ 18.6.2008,  11:16)
открой хелп и почитай наконец про функции парадокса.

Открывал, ничего толкового не нашел. :( 
Буду искать выход.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)