Re: [pgsql-ru-general] Re: [pgsql-ru-general] Частично уникальное поле - Mailing list pgsql-ru-general

From Nikolay Samokhvalov
Subject Re: [pgsql-ru-general] Re: [pgsql-ru-general] Частично уникальное поле
Date
Msg-id AANLkTikcbYvJC4y5vYgZ5zmMh9bG0KkCSheJeTE-07wx@mail.gmail.com
Whole thread Raw
In response to Re: [pgsql-ru-general] Re: [pgsql-ru-general] Частично уникальное поле  (Dmitriy Igrishin <dmitigr@gmail.com>)
Responses Re: [pgsql-ru-general] Re: [pgsql-ru-general] Частично уникальное поле
Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Частично уникальное поле
List pgsql-ru-general
2011/3/13 Dmitriy Igrishin <dmitigr@gmail.com>
Приветствую,

13 марта 2011 г. 2:54 пользователь Nikolay Samokhvalov <samokhvalov@gmail.com> написал:
Уникальный индекс -- это уже и есть ограничение целостности. Можно ещё раз повторю? И ещё, на ночь, чтобы запомнилось.
... 
or group of columns used in the constraint.". Надеюсь, что после этого Вы не станете
утверждать, что ограничение уникальности является уникальным (btree) индексом.
Я всегда ратовал и буду ратовать за корректность.

Ни разу такого не утверждал.
Раз любите корректность, включите ещё логику)
Из "А является Б" вовсе не следует утверждение "Б является А".
 

Для новичков нужно запоминать именно так, чтобы как раз и не возникало вопросов "а как создать constraint". 
Ой, да ладно про "спец курсы для новичков". :-) 

Не смешно. Порог входа у Постгреса очень высокий. И чем больше мы стараемся умничать, тем выше он становится.
 

Про размер индекса -- верно, частичный индекс экономит место, если NULL-ов ожидается много. Но при этом надо понимать, что будут последствия для оптимайзера (всё же это индекс и он может пригодиться не только как ограничение целостности).
Какие такие последствия?

Берём две таблички

m=# \d a
       Table "public.a"
 Column |  Type   | Modifiers 
--------+---------+-----------
 num    | integer | 
 txt    | text    | 
Indexes:
    "a_txt_key" UNIQUE, btree (txt)

m=# \d b
       Table "public.b"
 Column |  Type   | Modifiers 
--------+---------+-----------
 num    | integer | 
 txt    | text    | 
Indexes:
    "u_b" UNIQUE, btree (txt) WHERE txt IS NOT NULL

Заполняем данными
m=# insert into a select 1, random()::text from generate_series(1, 10000);
INSERT 0 10000
m=# insert into a select 1, NULL from generate_series(1, 1000);
INSERT 0 1000
m=# insert into b select 1, random()::text from generate_series(1, 10000);
INSERT 0 10000
m=# insert into b select 1, NULL from generate_series(1, 1000);
INSERT 0 1000


Ну и финальное, перед сном)

m=# explain select * from a order by txt limit 10;
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Limit  (cost=0.00..0.84 rows=10 width=36)
   ->  Index Scan using a_txt_key on a  (cost=0.00..711.56 rows=8487 width=36)
(2 rows)

m=# explain select * from b order by txt limit 10;
                             QUERY PLAN                             
--------------------------------------------------------------------
 Limit  (cost=416.71..416.73 rows=10 width=36)
   ->  Sort  (cost=416.71..444.21 rows=11000 width=36)
         Sort Key: txt
         ->  Seq Scan on b  (cost=0.00..179.00 rows=11000 width=36)
(4 rows)

pgsql-ru-general by date:

Previous
From: Dmitriy Igrishin
Date:
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Частично уникальное поле
Next
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Частично уникальное поле