PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Django - postgres:Cách tạo chỉ mục trên trường JsonB

t=# create table d(i bigserial, j jsonb);
CREATE TABLE
t=# insert into d(j) select ('{"foreign_data":{
      "some_key": '||g||',
      "src_data": {
              "VEHICLE": {
                  "title": "615",
                  "is_working": true,
                  "upc": "85121212121",
                  "dealer_name": "CryptoDealer",
                  "id": '||g||'
              }
        }
 }}')::jsonb from generate_series(1,1222600) g;
INSERT 0 1222600
t=# create index ji on d (cast (j->'foreign_data'->'src_data'->'VEHICLE'->>'id' as int));
CREATE INDEX

để sử dụng chỉ mục dựa trên fn () như vậy, bạn phải có hàm "lặp lại" trong truy vấn:

t=# explain analyze select * from d 
where cast (j->'foreign_data'->'src_data'->'VEHICLE'->>'id' as int) = 1222551;
                                                          QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
 Index Scan using ji on d  (cost=0.43..8.45 rows=1 width=215) (actual time=0.021..0.021 rows=1 loops=1)
   Index Cond: ((((((j -> 'foreign_data'::text) -> 'src_data'::text) -> 'VEHICLE'::text) ->> 'id'::text))::integer = 1222551)
 Planning time: 1.585 ms
 Execution time: 0.045 ms
(4 rows)

như bạn thấy chi phí rất nhỏ và thực thi rẻ hơn chỉ số. nhưng nếu bạn "bỏ qua" các thủ tục và chạy:

t=# explain analyze select * from d 
where j->'foreign_data'->'src_data'->'VEHICLE'->>'id' = '1222551';
                                                         QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..50122.31 rows=6113 width=215) (actual time=335.996..336.000 rows=1 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   ->  Parallel Seq Scan on d  (cost=0.00..48511.01 rows=2547 width=215) (actual time=223.548..332.213 rows=0 loops=3)
         Filter: (((((j -> 'foreign_data'::text) -> 'src_data'::text) -> 'VEHICLE'::text) ->> 'id'::text) = '1222551'::text)
         Rows Removed by Filter: 407533
 Planning time: 0.096 ms
 Execution time: 343.090 ms
(8 rows)

chỉ mục sẽ không được sử dụng




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chuyển đổi bất kỳ chuỗi ngày nào thành dấu thời gian không có múi giờ

  2. Thay đổi thứ tự cột trong bảng postgres

  3. Chức năng tổng hợp tùy chỉnh

  4. Làm cách nào để chỉ định mật khẩu cho 'psql' không tương tác?

  5. Làm cách nào để tạo kiểu cột tùy chỉnh với Typesafe Slick trong Scala?