Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничить кол-во записей, возвращаемых Query 
:(
    Опции темы
petlyura
Дата 12.6.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



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

P/S. Таблицы Paradox7
PM MAIL   Вверх
Dmi3ev
Дата 12.6.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



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


--------------------

PM MAIL   Вверх
JayTi
Дата 13.6.2008, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 22.5.2008

Репутация: нет
Всего: нет



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

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();
}



Это сообщение отредактировал(а) JayTi - 13.6.2008, 07:03
PM MAIL   Вверх
petlyura
Дата 13.6.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



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

JayTi 
Код

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

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


PM MAIL   Вверх
fish9370
Дата 13.6.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



попробуй:

Код

SELECT * FROM table1 LIMIT 1000



--------------------
undefined
PM MAIL WWW ICQ   Вверх
petlyura
Дата 13.6.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



Не выходит и с LIMIT. Может кто-то попробует у себя создать мини-проект с таблицей Paradox и запросом к нему с TOP, FIRST или LIMIT?
И если все работает, сообщите, пожалуйста. У меня постонно ругается Token not found и т.п.
PM MAIL   Вверх
gather
Дата 15.6.2008, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 13.6.2007
Где: Russia, Lipetsk

Репутация: нет
Всего: 4



Код

SELECT * FROM table1 LIMIT 0,1000

Вот так попробуйте.
PM MAIL WWW Skype GTalk Jabber   Вверх
jonie
Дата 15.6.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



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

select * from tab where id<1000



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
gather
Дата 15.6.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 13.6.2007
Где: Russia, Lipetsk

Репутация: нет
Всего: 4



jonie, не подойдет Ваш способ, ибо он будет выбирать постоянно ПЕРВЫЕ 1000 записей. А топикастеру необходимо ОГРАНИЧИТЬ количество записей в resultset.
Кстати вот ТУТ схожая проблема у народа.
PM MAIL WWW Skype GTalk Jabber   Вверх
jonie
Дата 15.6.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



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

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

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

Это сообщение отредактировал(а) jonie - 15.6.2008, 22:27


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
petlyura
Дата 17.6.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



Цитата(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 минут. Но это много. Что делать?
PM MAIL   Вверх
Fazil6
Дата 17.6.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



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

так в T-SQL есть TOP... Нафиг там выкрутасы не здались  smile 
PM MAIL   Вверх
jonie
Дата 17.6.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
petlyura
Дата 18.6.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



Цитата(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
PM MAIL   Вверх
jonie
Дата 18.6.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



открой хелп и почитай наконец про функции парадокса.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.