Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: Проблемы с новым типом данных в PostgreSQL   Alex G. Bodnar   18 Apr 2003 15:48:09 
Архивное /ru.linux/913839a59515.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional