2012-02-10 13 views
5

Tengo las siguientes tablas:operaciones bit a bit en Postgres

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

y

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 

me gustaría preguntar ahora:

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 

¿Cuál es el mejor índice posible para las tablas types y vendors en postgres? Es posible que tenga millones de filas en los vendedores. Además, ¿cuáles son las ventajas de utilizar este método bit a bit en comparación con la relación Muchos a muchos usando una tercera tabla? ¿Cual es mejor?

+0

Creo que te refieres a 'tipo & 7 = 0'; si utilizas 'tipo & 7> 0', devolverás cualquier elemento que coincida con 'A', 'B' o 'C', ya que coincidirá cualquier bit dar como resultado una respuesta mayor que 0. (Alex, Bob, David, Ed, Meta, Henry, Iris, Jack) Hacer 'tipo & 7 = 0' da como resultado solo aquellos elementos que coinciden con los tres bits. (Ed, Iris, Jack) –

Respuesta

8

uso puede utilizar índices parciales para evitar el hecho de que "&" no es un operador indexable (que yo sepa):

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

Por supuesto, usted tendrá que añadir un nuevo índice cada vez que se agregar un nuevo tipo. Esta es una de las razones para expandir los datos en una tabla de asociación que luego puede indexarse ​​correctamente. Siempre puede escribir activadores para mantener una tabla de máscara de bits adicionalmente, pero use la tabla de muchos a muchos para mantener los datos normalmente, ya que será mucho más claro.

Si toda su evaluación de la escala y el rendimiento es decir "puedo tener millones de filas", no ha hecho lo suficiente para comenzar a utilizar este tipo de optimización. Primero cree un modelo claro estructurado adecuadamente, luego optimícelo sobre la base de estadísticas reales sobre cómo funciona.

Cuestiones relacionadas