|
Sybase
|
|
|
|
|
Продукты
|
|
|
|
|
Сообщества
|
|
|
|
|
Меню
|
|
|
|
|
Вход
|
|
|
|
|
Рассылка
|
|
|
|
|
Статистика
|
|
|
|
|
Функция поиска дырок в последовтельности ID
|
Функция поиска дырок в последовтельности IDВот текст функции:
CREATE FUNCTION "DBA"."FindFreeID"(in StartID integer,in step integer)
returns integer
begin
-- by Alexander Goldun
declare @ID integer;
declare qty integer; -- кол-во в текущем отрезке
set qty=(select count(*) from dba.test_table where id between StartID and StartID+step-1);
if qty < step then
if step = 1 then
set @ID=StartID
else
set @ID=dba.findFreeId(StartId,step/2)
end if
else
set @ID=dba.findFreeId(StartId+step,step)
end if;
return(@ID)
end
Ищет рекурсивно методом половинного деления в диапазоне от StartID до StartID+step. Если не находит там незанятых ID, то берет следующий диапазон того же размера.
Предполагается, что поле ID в таблице test_table уникально и NOT NULL.
Значение шага выбирается таким образом, чтобы с одной стороны уменьшить количество вызовов (глубину рекурсии), с другой - избежать скана таблицы.
Подбирается эмпирическим путем. Вполне нормально, если начальный шаг охватывает примерно 20% записей. Разумеется, желательно наличие индекса по полю ID.
Для тех, кто решит это использовать, на всякий случай напоминаю, что будет нарушена хронология по id. То есть может не выполняться требование бОльших ID для записей, вставленных позднее.
|
Дата публикации: Monday 27 March 2006 17:22:07 Материал прочитан: 14869 раз(а) [ Назад ] |
|
|
|
|
|
|
Copyright©2005 . Все права защищены.
|