2012-02-10 37 views
5

tôi có các bảng sau:hoạt động Bitwise trong Postgres

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 

Tôi muốn truy vấn bây giờ:

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 

chỉ số tốt nhất có thể cho các bảng là gì typesvendors trong postgres? Tôi có thể có hàng triệu hàng trong các nhà cung cấp. Hơn nữa, sự cân bằng của việc sử dụng phương pháp bitwise này so với quan hệ Nhiều Để Nhiều bằng cách sử dụng một bảng thứ 3 là gì? Cái nào tốt hơn?

+0

Tôi nghĩ bạn có nghĩa là 'type & 7 = 0', nếu bạn sử dụng 'type & 7> 0' bạn sẽ trả về bất kỳ mục nào khớp với 'A', 'B' hoặc 'C', vì khớp với bất kỳ bit nào kết quả trong một câu trả lời lớn hơn 0. (Alex, Bob, David, Ed, Mục tiêu, Henry, Iris, Jack) Làm 'loại & 7 = 0' kết quả chỉ trong những mục phù hợp với tất cả ba bit. (Ed, Iris, Jack) –

Trả lời

8

Sử dụng có thể sử dụng chỉ số một phần để làm việc xung quanh thực tế là "&" không phải là một nhà điều hành lập chỉ mục (afaik):

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

Tất nhiên, bạn sẽ cần phải thêm một chỉ số mới mỗi khi bạn thêm một loại mới. Đó là một trong những lý do để mở rộng dữ liệu thành một bảng liên kết mà sau đó có thể được lập chỉ mục đúng cách. Bạn luôn có thể viết trình kích hoạt để duy trì bảng bitmask bổ sung, nhưng sử dụng bảng nhiều người để thực sự duy trì dữ liệu bình thường, vì nó sẽ rõ ràng hơn nhiều.

Nếu toàn bộ đánh giá của bạn về mở rộng quy mô và hiệu suất là để nói "Tôi có thể có hàng triệu hàng", bạn chưa thực hiện đủ để bắt đầu thực hiện loại tối ưu hóa này. Tạo một mô hình rõ ràng có cấu trúc đúng trước tiên, tối ưu hóa nó sau này trên cơ sở các thống kê thực sự về cách nó thực hiện.

Các vấn đề liên quan