Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.02 c
1-56761
Narayan
2003-11-06 12:31
2003.11.17
application-defined exception


1-56740
Aleksandr
2003-11-06 16:50
2003.11.17
Как отправить потоку сообщение?


7-56929
enty
2003-09-07 13:36
2003.11.17
Как програмно выключить копьютер


6-56804
BlackSun
2003-09-21 19:11
2003.11.17
Ras+определение скорости коннекта


1-56582
Игоряныч
2003-11-06 09:21
2003.11.17
Есть у кого нибудь исходник - как печатать из делфи через Word.