powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как выбрать последние N записей в Interbase?
25 сообщений из 33, страница 1 из 2
Как выбрать последние N записей в Interbase?
    #32214634
-= Demon =-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как выбрать последние N записей в Interbase?
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32214655
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напрямую - никак нельзя, но можно попытаться через ХП.
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32214723
Vagoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда анализ значения праймери кей помогает ( id > max(id)-n )
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32214734
Timujin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Vagoo
Именно иногда: только тогда, когда выборка из одной таблицы, в выборке присутствует ID, и ID идут по порядку (без дырок - удаленных записей)
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215063
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В firebird я делаю так select first N ... order by ... desc
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215343
SergeyNew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>В firebird я делаю так select first N ... order by ... desc

Это конечно хорошо, а представьте ситуацию, когда в таблице более миллиона записей, тогда выборка типа select first x skip y работает весьма и весьма долго и чем дальше от начала, тем дольше. Собственно вопрос: как можно ускорить данный процесс?
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215362
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для каких-же таких целей необходимо выбирать N последних записей?
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215368
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем skip если "последних"?
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215403
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что-то такое похожее на последниее N записей :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROCEDURE NEW_PROCEDURE (
    N INTEGER)
RETURNS (
    ID VARCHAR( 10 ),
    DT DATE)
AS
DECLARE VARIABLE NN INTEGER;
DECLARE VARIABLE Q INTEGER;
DECLARE VARIABLE I INTEGER;
begin
 SELECT COUNT(*) FROM table1 INTO :Q;

 NN = Q - N;

 I =  0 ;
 FOR SELECT ID, DT FROM table1 INTO :ID, :DT DO BEGIN
   I = I +  1 ;
   if (I >= NN) then
   suspend;
 END
end


... Вот только скорость ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Query Time
 ------------------------------------------------
 
Prepare       :  16 , 00  ms
Execute       :  2   313 , 00  ms
Avg fetch time:  2   313 , 00  ms

Memory
 ------------------------------------------------
 
Current:  27   071   885 
Max    :  30   897   293 
Buffers:  2   048 

Operations
 ------------------------------------------------
 
Read   :  11   290 
Writes :  2 
Fetches:  1   481   908 


Enchanced Info:
+ --------------------------+-----------+-----------+---------+---------+---------+
 
|        Table Name        |   Index   | Non-Index | Updates | Deletes | Inserts |
|                          |   reads   |   reads   |         |         |         |
+ --------------------------+-----------+-----------+---------+---------+---------+
 
|                  table1  |          0  |     604158  |        0  |        0  |        0  |
+--------------------------+-----------+-----------+---------+---------+---------+
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215414
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dnico, а как же "first", почему бы им не воспользоваться? с ордер бай деском... ну и индекс должен быть desc тоже, ессно.
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215447
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedd

Согласен, работает быстрее в два раза ... это я ради интереса попробовал ...
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32215581
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче, нечего на сервер пенять, коли руки кривы...
нормально first/skip работает. и приэтом, это имхо единственный грамотный способ
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217211
SergeyNew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>короче, нечего на сервер пенять, коли руки кривы...
нормально first/skip работает. и приэтом, это имхо единственный грамотный способ

На сервер никто не пеняет и first/skip хорошо работает, просто н-р при страничном отображении данных через first/skip при большом количестве данных чем дальше от начала таблицы, т.е. при росте числа skip процесс выборки становится все медленне и медленнее. Н-р при выборке skip = 500000
first=20 5 полей varchar(100) выборка делается около 7 минут. Сервер FireBird 1.0.2.978 . Машина Celeron 2000/256 RAM.
Поэтому я и спросил как можно ускорить данный процесс. Если кто знает, помогите.
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217234
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверно никто не знает, и никак нельзя. внутри себя серверу приходится все записи пробегать и скипать.

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

однако, Демон сказал "последних". поэтому ему не надо ничего скипать :)

Днико: зачем - могу представить: например, на этом сайте если многостраничный топик, чтобы показать вторую страницу, надо поскипать все посты первой страницы. и по данным никак не отсечешь: врядли на sql.ru они сделали поле "порядковыйномерпоставтопикебездыр"
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217252
SergeyNew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот интересно, есть команда обратная first, т.е. выбрать не первые записи после какой-то записи, а выбрать определенное кол-во записей перед какой-то записью, н-р: id = 500000 и надо выбрать 20 записей, у которых id<500000,
т.е. в случае без дыр в id это №499980-500000. А для случая, когда есть дыры в id как раз подобная команда очень нужна.
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217256
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select first 20 * from table where id<500000 order by id desc

пазор! :)
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217257
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или я чего-то не понял опять...
"команда обратная first"...
СергейНью, я правильно тебя понял?
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217277
SergeyNew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>select first 20 * from table where id<500000 order by id desc

Данная операция выберет записи c id=1-20, а надо id=499980-500000
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217284
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видимо я что-то не догоняю...........................
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217298
SergeyNew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошу прощения, DESC не заметил, но это понятно, что выберет по убыванию 20 штук с конца, но при этом сервер сначала перелопатит все записи, т.е. выигрыша по времени опять нет. Вот если указывать граничные id, тог выборка идет за секунду, не важно номер id.
Н-р: select *
from table
where id >= 500000 and id <= 500020
Время выборки 0,0037 мин

а вот:
SELECT FIRST 20 *
FROM TABLE
WHERE ID <= 500000
ORDER BY ID DESCENDING
время выборки 3,48 мин
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217302
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
индекс тоже должен быть desc, насколько мне объясняли
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217306
SergeyNew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно можно узнать для каждой страницы № граничного id, но это тоже время, поэтому я и интересуюсь, может есть какая-нибудь команда которая сделает это за меня и сделает побыстрее, чем мой алгоритм? т.е. команда выбирающая не следующие записи, а предыдущие записи.
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217314
SergeyNew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А по поводу DESC на индекс я не знаю, но статистику я привел
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217399
__Edward
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если попробовать не в одном запросе:
1. ХП которая выбирает
select first 20 * from table order by id desc
2. собственно сам запрос
select * from ХП order by id asc

За синтаксис не ручаюсь, но раньше я этим пользовался.
...
Рейтинг: 0 / 0
Как выбрать последние N записей в Interbase?
    #32217412
__Edward
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и еще: индексы по id должны быть туда и обратно, а то что-то у меня возникли сомнения по поводу обратного индекса, судя по этому запросу:

--SELECT FIRST 20 *
--FROM TABLE
--WHERE ID <= 500000
--ORDER BY ID DESCENDING
--время выборки 3,48 мин
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как выбрать последние N записей в Interbase?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]