Текущий архив: 2003.11.17;
Скачать: CL | DM;
ВнизКак быстро найти запись с заданным порядковым номером Найти похожие ветки
← →
Виталя (2003-10-27 13:55) [0]Нужно найти запись в табл. с заданным порядковым номером, пишу запрос
select ID
from Tabl Q1
where :RECNO = (select count(*)
from Tabl Q2
where Q2.ID <= Q1.ID)
into :ID;
Но на моей табл. на 2000 записей это зависает секунд на 15. Может есть другие средства, чтобы скорость увеличить ?
← →
Oleon (2003-10-27 15:26) [1]А зачем тебе номер записи? О чем он тебе может рассказать?
← →
Zacho (2003-10-27 15:29) [2]Есть. SELECT * FROM MY_TABLE WHERE ID=:ID
Если это не то, то объясни подробно, что такое "порядковый номер".
Hint: таблица в RDBMS - это неупорядоченное множество.
← →
Виталя (2003-10-27 15:49) [3]>> Oleon
Просто нужно чтобы пользователь мог видеть на каком номере записи он находится и мог перейти к записи с зад. номером.
(специфика такая что это очень надо)
>> Zacho
ID получается с исп. генератора, значит если вначале создали записи с ID 1 2 3 4 5 6 7, а потом удалили с ID = 4 , то последов. ID будет 1 2 3 5 6 7, а мне нужно чтобы были порядковые номера 1(ID=1) 2(ID=2) 3(ID=3) 4(ID=5) 5(ID=6) 6(ID=7).
← →
Mike Kouzmine (2003-10-27 15:50) [4]Делай ХП
← →
Виталя (2003-10-27 15:57) [5]>>Mike Kouzmine
Ну так я ее и делаю !- тот код что вначале это и есть кусок ХП!
И вот такие вот результаты ...
← →
Sandman25 (2003-10-27 16:02) [6]Можно попробовать так:
i = :RecNo;
for select id from table order by id
i = i - 1;
if i = 0 then
exit for;
end if
end for
PS. Написал на сам-не-знаю-чем, но идея должна быть понятна.
← →
Виталя (2003-10-27 16:17) [7]>> Sandman25
Если ты имел ввиду это
for select ID
from quetionsletter
order by ID
into :ID
do
begin
if (:ID = :RECNO) then
SUSPEND;
end
то супер работает и правда очень быстро!
← →
Sandman25 (2003-10-27 16:24) [8][7] Виталя © (27.10.03 16:17)
Нет, я имел ввиду не это. Таким образом Вы находите, то же, что и
select id from tables where id = :recno, или еще точнее, всегда получаете :recno.
А в моем посте я писал о том, как найти N-ую (=:RecNo) по порядку id запись.
Возможно, так будет понятнее моя идея:
with Table do
begin
First;
for I := 1 to N do
Next;
end;
← →
Danilka (2003-10-27 16:27) [9]1. это на самом деле не нужно - постановка задачи хромает
:))
2. как ни крути, а если учитывать [3] то индексы участвовать не будут, сабж возможен только перебором всех записей, до нужного номера, а значит, надо править п.1
← →
stud (2003-10-27 16:51) [10]это точно. пользователь и не подозревает на какой записи он находится и ему знать этого не надо
← →
Johnmen (2003-10-27 17:08) [11]i=1
for select .... do
if (i=myno) then begin suspend exit end
else i=i+1
знаки препинания расставь сама :)
← →
Zacho (2003-10-27 21:24) [12]2 Виталя © : Поверьте мне, это не нужно. Абсолютно. Лучше забудьте вообще про какие-либо "номера записей". Нет их. И не нужны они.
А "бездырочная нумерация" - это совсем другая проблема, решаемая с помощью SNAPSHOT TABLE STABILITY WAIT с явным резервированием таблицы.
← →
Виталя (2003-10-28 14:47) [13]В общем прошу прощения за молчание - в итоге я сделала такое
1. создала ХП
CREATE PROCEDURE SREZ_Tabl (
RECNO INTEGER)
RETURNS (
ID INTEGER)
AS
declare variable DIAP INTEGER;
BEGIN
select max(ID)-count(ID)
from Tabl
into :DIAP;
for select ID
from Tabl
where (ID >= :RECNO)and(ID<=:RECNO+:DIAP)
into :ID
do
SUSPEND;
END
2. а после этого написала то что вначале
CREATE PROCEDURE Tabl_RECNO (
RECNO INTEGER)
RETURNS (
ID INTEGER)
AS
BEGIN
select ID
from srez_Tabl(:RECNO) A1
where :RECNO = (select count(*)
from Tabl A2
where A2.ID <= A1.ID)
into :ID;
SUSPEND;
END
так как теперь программе не нужно склеивать 2 табл по 2000 записей, а нужно склеить одну на 2000 , а другую на 10-20(думаю в ближ. будущем большей разницы не предвидется)
то она работает очень быстро.
Всем спасибо за конструктивные советы.
>> Zacho
может скажешь где можно почитать про "бездырочную нумерацию" ?
← →
Zacho (2003-10-28 15:20) [14]
> может скажешь где можно почитать про "бездырочную нумерацию"
> ?
В архиве этого форума. Неоднократно уже было, и я несколько раз подробно описывал способ с SNAPSHOT TABLE STABILITY
Страницы: 1 вся ветка
Текущий архив: 2003.11.17;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.01 c