Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2011, 11:39   #1
$T@LKER
Форумчанин
 
Аватар для $T@LKER
 
Регистрация: 28.03.2009
Сообщений: 393
Вопрос Постепенное получение результата запроса

Добрый день. Подскажите пожалуйста, можно ли получать резулуьтат запроса как то частями а не весь сразу? Например:

Код:
select * from TABLE1
Например в базе 500000 объектов, а в результате предположительно получаем 10-30 тысяч объектов. + если еще использовать условия для выборки это занимает немало времени, а хочется как то ускорить этот процесс или например получать результат запроса постепенно если это возможно, а не весь сразу.

Заранее спасибо за ответы!
""Сериалы и компьютерные игры это словно вторая жизнь, которою ты проживаешь, во главе главного героя или персонажа, параллельно своей!""
$T@LKER вне форума Ответить с цитированием
Старый 12.08.2011, 11:49   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

А и не надо получать столько.

Ограничивайте количество отбираемых записей.
в некоторых СУБД для этого можно указать границы прямо в самом запросе (например, см. LIMIT в MySQL), в некоторых можно получить первую заданную порцию через select TOP NN ).
А вообще, подобная выборка - это обычно ошибка либо клиентской части (не надо ничего выбирать, пока не заданы условия отбора), либо пользовательская - нажал на кнопку "Показать ВСЁ" - ну и разгребай сам эту кучу ...

смотрите, допустим кто-то отобрал 500000 записей. Допустим он очень быстро их обрабатывает (просматривает). 10 записей в секунду (хотя сомневаюсь, что реально человек на такое способен...).
Тогда ему потребуется всего "навсего" 13 часов 53 минуты непрерывной работы...

Последний раз редактировалось Serge_Bliznykov; 12.08.2011 в 11:52.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.08.2011, 11:49   #3
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

Код:
SELECT
  *
FROM
  TABLE1
LIMIT 0 , 10000
Gulik вне форума Ответить с цитированием
Старый 12.08.2011, 11:49   #4
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

если бы Вы указали какую СУБД используете было бы проще, а так - посмотрите:

http://programmersforum.ru/showthrea...ighlight=limit
http://programmersforum.ru/showthrea...ighlight=limit
http://www.sql.ru/forum/actualthread.aspx?tid=492
astecenko вне форума Ответить с цитированием
Старый 12.08.2011, 11:58   #5
$T@LKER
Форумчанин
 
Аватар для $T@LKER
 
Регистрация: 28.03.2009
Сообщений: 393
По умолчанию

Использую MS SQL Server 2008.

Serge_Bliznykov, Вы наверное меня неправильно поняли). Мне не нужно ограничивать количество получаемых данных, если пользователю надо получать 50 000 объектов из базы пусть получает но процесс этот не быстрый и хотелось как то решит это проблему. Не буду ж я делать, что бы вместо 50 000 пользователь получал скажем тока 5 000 ).
""Сериалы и компьютерные игры это словно вторая жизнь, которою ты проживаешь, во главе главного героя или персонажа, параллельно своей!""
$T@LKER вне форума Ответить с цитированием
Старый 12.08.2011, 12:15   #6
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Цитата:
Not all DBMSes support the mentioned window functions, and non-standard syntax has to be used. Below, variants of the simple limit query for different DBMSes are listed:
SELECT * FROM T LIMIT 10 OFFSET 20 Netezza, MySQL, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2
SELECT * from T WHERE ROWNUM <= 10 Oracle (also supports the standard, since Oracle8i)
SELECT FIRST 10 * from T Ingres
SELECT FIRST 10 * FROM T order by a Informix
SELECT SKIP 20 FIRST 10 * FROM T order by c, d Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack)
SELECT TOP 10 * FROM T MS SQL Server, Sybase ASE, MS Access
SELECT TOP 10 START AT 20 * FROM T Sybase SQL Anywhere (also supports the standard, since version 9.0.1)
SELECT FIRST 10 SKIP 20 * FROM T Interbase, Firebird
SELECT * FROM T ROWS 20 TO 30 Firebird (since version 2.1)
SELECT * FROM T
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY DB2
SELECT * FROM T
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY DB2 (new rows are filtered after comparing with key column of table T)
Взято из http://en.wikipedia.org/wiki/Select_...H_FIRST_clause
astecenko вне форума Ответить с цитированием
Старый 12.08.2011, 12:21   #7
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

как видите постраничной отдачи в mssql нету, можно ограничивать отдачу только первых n-записей с помощью TOP. Какие существуют альтернативные варианты реения данной проблемы читайте тут http://www.arbinada.com/main/node/463
astecenko вне форума Ответить с цитированием
Старый 12.08.2011, 12:23   #8
$T@LKER
Форумчанин
 
Аватар для $T@LKER
 
Регистрация: 28.03.2009
Сообщений: 393
По умолчанию

То есть в моем случаи такой вариант

Код:
Код:
SELECT TOP 10 * FROM T
типо ограничение количество выводимых объектов. Ну у меня инная цель я же не писал, что мне надо ограничить количество. Надо как то либо ускорить процесс выборки, а еще лучше, не знаю возможно ли это, получать результат запроса не весь зараз а постепенно. Ограничение это ведь тока может выввести скажем первый TOP(25 000) а как же остальные 25 000 ? Здесь же нельзя как то разбить запрос что бы скажем из этих 50 000 выводились данные постепенно или частями.
""Сериалы и компьютерные игры это словно вторая жизнь, которою ты проживаешь, во главе главного героя или персонажа, параллельно своей!""
$T@LKER вне форума Ответить с цитированием
Старый 12.08.2011, 12:23   #9
$T@LKER
Форумчанин
 
Аватар для $T@LKER
 
Регистрация: 28.03.2009
Сообщений: 393
По умолчанию

Ясно. Очень плохо конечно(
""Сериалы и компьютерные игры это словно вторая жизнь, которою ты проживаешь, во главе главного героя или персонажа, параллельно своей!""
$T@LKER вне форума Ответить с цитированием
Старый 12.08.2011, 12:23   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Serge_Bliznykov, Вы наверное меня неправильно поняли
Что касается отображения выбранных данных, то он очень правильно вас понял. А если проблема стоит в выборке такого кол-ва инфы для некоторых расчетов, то максимально используйте для этого MSSQL. Не получается всё запросами решить - пользовательские процедуры пишите, дабы минимизировать объем передаваемой клиенту инфы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение результата из dll Alexandr555 Работа с сетью в Delphi 7 16.04.2011 20:56
Вывод результата запроса в файл vladtr Microsoft Office Access 3 30.03.2011 15:13
Вывод результата после запроса Hamsi БД в Delphi 1 07.12.2010 17:00
Присвоение результата запроса, переменной Droid БД в Delphi 3 13.04.2010 16:34
сохранение результата запроса в таблицу БД stepchild БД в Delphi 11 13.06.2008 11:20