Побитовые операции в Postgres - PullRequest
6 голосов
/ 10 февраля 2012

У меня есть следующие таблицы:

types | id | name
------+----+----------
         1 | A
         2 | B
         4 | C
         8 | D
         16| E
         32| F

и

vendors | id | name     | type
--------+----+----------+-----
           1 | Alex     | 2     //type B only
           2 | Bob      | 5     //A,C
           3 | Cheryl   | 32    //F
           4 | David    | 43    //F,D,A,B
           5 | Ed       | 15    //A,B,C,D
           6 | Felix    | 8     //D
           7 | Gopal    | 4     //C
           8 | Herry    | 9     //A,D
           9 | Iris     | 7     //A,B,C
           10| Jack     | 23    //A,B,C,E

Я бы хотел запросить сейчас:

select id, name from vendors where type & 16 >0 //should return Jack as he is type E
select id, name from vendors where type & 7 >0 //should return Ed, Iris, Jack
select id, name from vendors where type & 8 >0 //should return David, Ed, Felix, Herry 

Каков наилучший индекс для таблиц types и vendors в postgres? У меня могут быть миллионы строк в поставщиках. Кроме того, каковы недостатки использования этого побитового метода по сравнению с отношением «Многие ко многим», использующим третью таблицу? Что лучше?

1 Ответ

9 голосов
/ 10 февраля 2012

Использование может использовать частичные индексы, чтобы обойти тот факт, что «&» не индексируемый оператор (afaik):

CREATE INDEX vendors_typeA ON vendors(id) WHERE (type & 2) > 0;
CREATE INDEX vendors_typeB ON vendors(id) WHERE (type & 4) > 0;

Конечно, вам нужно будет каждый раз добавлять новый индексВы добавляете новый тип.Что является одной из причин расширения данных в таблицу ассоциаций, которая затем может быть правильно проиндексирована.Вы всегда можете написать триггеры для дополнительной поддержки таблицы битовой маски, но используйте таблицу «многие ко многим», чтобы фактически поддерживать данные в нормальном режиме, поскольку это будет намного понятнее.

Если вся ваша оценка масштабирования и производительностичтобы сказать «у меня могут быть миллионы строк», вы недостаточно сделали, чтобы начать оптимизацию такого рода.Сначала создайте правильно структурированную чистую модель, а затем оптимизируйте ее на основе реальной статистики о том, как она работает.

...