Форум FAQ О команде
Поиск по сайту:
 
Sybase
Sybase ASA  
Sybase ASE  
Sybase IQ  
Sybase PowerDesigner  
Sybase PowerBuilder  

Продукты
Наши продукты  
Продукты партнеров портала  

Сообщества
Alef community  

Меню
Регистрация  
Почта  

Вход

Рассылка
Рассылка 'РСУБД Sybase ASA 9 - мощность, легкость и надежность'
Почтовая рассылка
"Технологии обработки данных компании Sybase"


Статистика
Яндекс цитирования

Rambler's Top100
Находится в каталоге Апорт

Главная -> Статьи
Функция поиска дырок в последовтельности 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 phpMS. Все права защищены.
hosted on pets-tree