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

Это конечно хорошо, а представьте ситуацию, когда в таблице более миллиона записей, тогда выборка типа select first x skip y работает весьма и весьма долго и чем дальше от начала, тем дольше. Собственно вопрос: как можно ускорить данный процесс?
...
Рейтинг: 0 / 0
23.07.2003, 12:04
    #32215362
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
А для каких-же таких целей необходимо выбирать N последних записей?
...
Рейтинг: 0 / 0
23.07.2003, 12:07
    #32215368
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
зачем skip если "последних"?
...
Рейтинг: 0 / 0
23.07.2003, 12:22
    #32215403
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
Вот что-то такое похожее на последниее 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
23.07.2003, 12:26
    #32215414
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
Dnico, а как же "first", почему бы им не воспользоваться? с ордер бай деском... ну и индекс должен быть desc тоже, ессно.
...
Рейтинг: 0 / 0
23.07.2003, 12:43
    #32215447
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
fedd

Согласен, работает быстрее в два раза ... это я ради интереса попробовал ...
...
Рейтинг: 0 / 0
23.07.2003, 13:28
    #32215581
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
короче, нечего на сервер пенять, коли руки кривы...
нормально first/skip работает. и приэтом, это имхо единственный грамотный способ
...
Рейтинг: 0 / 0
24.07.2003, 16:06
    #32217211
SergeyNew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
>короче, нечего на сервер пенять, коли руки кривы...
нормально 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
24.07.2003, 16:25
    #32217234
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
наверно никто не знает, и никак нельзя. внутри себя серверу приходится все записи пробегать и скипать.

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

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

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

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

Данная операция выберет записи c id=1-20, а надо id=499980-500000
...
Рейтинг: 0 / 0
24.07.2003, 17:01
    #32217284
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
видимо я что-то не догоняю...........................
...
Рейтинг: 0 / 0
24.07.2003, 17:14
    #32217298
SergeyNew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
прошу прощения, 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
24.07.2003, 17:15
    #32217302
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
индекс тоже должен быть desc, насколько мне объясняли
...
Рейтинг: 0 / 0
24.07.2003, 17:22
    #32217306
SergeyNew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
Конечно можно узнать для каждой страницы № граничного id, но это тоже время, поэтому я и интересуюсь, может есть какая-нибудь команда которая сделает это за меня и сделает побыстрее, чем мой алгоритм? т.е. команда выбирающая не следующие записи, а предыдущие записи.
...
Рейтинг: 0 / 0
24.07.2003, 17:27
    #32217314
SergeyNew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
А по поводу DESC на индекс я не знаю, но статистику я привел
...
Рейтинг: 0 / 0
24.07.2003, 18:15
    #32217399
__Edward
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать последние N записей в Interbase?
А если попробовать не в одном запросе:
1. ХП которая выбирает
select first 20 * from table order by id desc
2. собственно сам запрос
select * from ХП order by id asc

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

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


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