Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как быстро найти запись с заданным порядковым номером [D6, IB6.x]


Виталя ©   (2003-10-27 13:55:00) 

Нужно найти запись в табл. с заданным порядковым номером, пишу запрос
select ID
from Tabl Q1
where :RECNO = (select count(*)
from Tabl Q2
where Q2.ID <= Q1.ID)
into :ID;
Но на моей табл. на 2000 записей это зависает секунд на 15. Может есть другие средства, чтобы скорость увеличить ?


Zacho   (2003-10-28 15:20:00) [1]


> может скажешь где можно почитать про "бездырочную нумерацию"
> ?

В архиве этого форума. Неоднократно уже было, и я несколько раз подробно описывал способ с SNAPSHOT TABLE STABILITY


Виталя   (2003-10-28 14:47:00) [2]

В общем прошу прощения за молчание - в итоге я сделала такое

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-27 21:24:00) [3]

2 Виталя © : Поверьте мне, это не нужно. Абсолютно. Лучше забудьте вообще про какие-либо "номера записей". Нет их. И не нужны они.
А "бездырочная нумерация" - это совсем другая проблема, решаемая с помощью SNAPSHOT TABLE STABILITY WAIT с явным резервированием таблицы.


Johnmen   (2003-10-27 17:08:00) [4]

i=1
for select .... do
if (i=myno) then begin suspend exit end
else i=i+1

знаки препинания расставь сама :)


stud   (2003-10-27 16:51:00) [5]

это точно. пользователь и не подозревает на какой записи он находится и ему знать этого не надо


Danilka   (2003-10-27 16:27:00) [6]

1. это на самом деле не нужно - постановка задачи хромает
:))
2. как ни крути, а если учитывать [3] то индексы участвовать не будут, сабж возможен только перебором всех записей, до нужного номера, а значит, надо править п.1


Sandman25   (2003-10-27 16:24:00) [7]

[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;


Виталя   (2003-10-27 16:17:00) [8]

>> Sandman25
Если ты имел ввиду это
for select ID
from quetionsletter
order by ID
into :ID
do
begin
if (:ID = :RECNO) then
SUSPEND;
end
то супер работает и правда очень быстро!


Sandman25   (2003-10-27 16:02:00) [9]

Можно попробовать так:

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 15:57:00) [10]

>>Mike Kouzmine
Ну так я ее и делаю !- тот код что вначале это и есть кусок ХП!
И вот такие вот результаты ...


Mike Kouzmine   (2003-10-27 15:50:00) [11]

Делай ХП


Виталя   (2003-10-27 15:49:00) [12]

>> 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).


Zacho   (2003-10-27 15:29:00) [13]

Есть. SELECT * FROM MY_TABLE WHERE ID=:ID
Если это не то, то объясни подробно, что такое "порядковый номер".
Hint: таблица в RDBMS - это неупорядоченноемножество.


Oleon   (2003-10-27 15:26:00) [14]

А зачем тебе номер записи? О чем он тебе может рассказать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо