Skip to content

Instantly share code, notes, and snippets.

@mche
Last active September 23, 2020 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mche/3108419bb3733399f1c90be9a59aede4 to your computer and use it in GitHub Desktop.
Save mche/3108419bb3733399f1c90be9a59aede4 to your computer and use it in GitHub Desktop.
select id
into temp table t1
FROM generate_series(1,100000000) as g(id);
create unique index idx_t1 on t1 (id);
SET random_page_cost = 0;
--- или random_page_cost tablespace параметр для таблицы
---delete from t1 where id in (
select t1.id
from t1
join (
select (random() * (100000000/*max значение брать последнее значение секвенции*/ - 1/*min значение*/)+ 1/*min занчение*/)::int as rand
from generate_series (1, 10/*если в таблице много удалений нужно увеличивать*/) g
) r on t1.id=r.rand
limit 1
---)
;
--- НЕ НУЖНО
CREATE OR REPLACE FUNCTION "random_t1"("max" int, "min" int default 1, "emp" int default 100)
RETURNS SETOF t1 AS
$BODY$
/***
Функция "random_t1"(max, min, emp) сдучайная строка из конкретной таблицы t1 с уникальной колонкой id(integer)
max - максимальное сейчас значение колонки id таблицы (если секвенция, то легко получить)
min - предполагается колонка id таблицы началась с 1, поэтому по умолчанию 1
emp - фактор "пустотности" таблицы, т.е. наличие удаленных строк, если мало удалялось - малое значение, если много пустот - больше, увеличивать когда функция перестанет возвращать запись (или добавить еще цикл генераций случайных чисел)
Можно переделать подавать на вход название таблицы
Можно переделать на возврат нескольких записей
***/
DECLARE
g RECORD;--- цикл нескольких случайных чисел на случай удаленных строк
r t1%rowtype; --- возврат
BEGIN
FOR g IN
select (random() * ("max" - "min")+ "min")::int as id
from generate_series (1, "emp")
LOOP
select into r * from t1 where id=g.id;
IF r is not null THEN
RETURN NEXT r;
EXIT;
END IF;
END LOOP;
RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment