|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Alex G. Bodnar 2:5020/400 18 Apr 2003 15:48:09 To : Evgenij M. Baldin Subject : Re: Проблемы с новым типом данных в PostgreSQL -------------------------------------------------------------------------------- > Добрый день > > Alex G. Bodnar <alex.bodnar@malva.ua> wrote: > > Решил добавить в PostgreSQL новый тип данных. > > А именно guid. > > > Создал таблицу с данным типом, натолкал > > много записей. Завел индексы. > > А вот здесь поподробнее - как создал индексы? Как дал понять Postgresу как > твои данные сортировать? Как Postgres узнаёт какой объёкт больше, > а какой меньше? Создал новый тип следующим образом: CREATE FUNCTION guid_in(cstring) RETURNS guid AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_out(guid) RETURNS cstring AS '$libdir/guid' LANGUAGE 'c'; CREATE TYPE guid (INPUT = guid_in, OUTPUT = guid_out, INTERNALLENGTH = 16); CREATE FUNCTION guid_generate() RETURNS guid AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_compare(guid, guid) RETURNS integer AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_equal(guid, guid) RETURNS bool AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_not_equal(guid, guid) RETURNS bool AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_less(guid, guid) RETURNS bool AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_greater(guid, guid) RETURNS bool AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_less_equal(guid, guid) RETURNS bool AS '$libdir/guid' LANGUAGE 'c'; CREATE FUNCTION guid_greater_equal(guid, guid) RETURNS bool AS '$libdir/guid' LANGUAGE 'c'; CREATE OPERATOR = (leftarg = guid, rightarg = guid, negator = <>, procedure = guid_equal); CREATE OPERATOR <> (leftarg = guid, rightarg = guid, negator = =, procedure = guid_not_equal); CREATE OPERATOR < (leftarg = guid, rightarg = guid, negator = >=, procedure = guid_less); CREATE OPERATOR > (leftarg = guid, rightarg = guid, negator = <=, procedure = guid_greater); CREATE OPERATOR <= (leftarg = guid, rightarg = guid, negator = >, procedure = guid_less_equal); CREATE OPERATOR >= (leftarg = guid, rightarg = guid, negator = <, procedure = guid_greater_equal); CREATE OPERATOR CLASS guid_class DEFAULT FOR TYPE guid USING btree AS OPERATOR 1 < , OPERATOR 2 <= , OPERATOR 3 = , OPERATOR 4 >= , OPERATOR 5 > , FUNCTION 1 guid_compare(guid, guid); До этого был написан модуль к postgresql, где были реализованы эти методы. Создаю таблицу так CREATE TABLE t1 (f1 guid, f2 text); Hаталкиваю туда записей, немеренно (~2000000), так INSERT INTO t1 VALUES (guid_generate(), random()); Создаю индекс: CREATE UNIQUE INDEX i1 ON t1 (f1); Hо когда ввожу такой запрос EXPLAIN SELECT * FROM t1 WHERE f1 = 'c92a8740-f48f-481f-a841-288ed96ff76b'::guid; то получаю --------------------------------------------------------------- Seq Scan on t1 (cost=0.00..1.07 rows=3 width=48) Filter: (f1 = 'c92a8740-f48f-481f-a841-288ed96ff76b'::guid) А если такой SELECT * FROM t1 ORDER BY f1; то индексы используются. Какие есть идеи. > С уважением Евгений > > P.S. Использование индексов может зависить от запроса. --- ifmail v.2.15dev4 * Origin: Unknown (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/913839a59515.html, оценка из 5, голосов 10
|