PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Django - पोस्टग्रेज: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

ऐसे fn() आधारित अनुक्रमणिका का उपयोग करने के लिए आपको क्वेरी में "दोहराना" फ़ंक्शन करना होगा:

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)

जैसा कि आप देखते हैं कि लागत कम है और निष्पादन सूचकांक पर सस्ता है। लेकिन अगर आप औपचारिकताओं को "छोड़" देते हैं और दौड़ते हैं:

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)

अनुक्रमणिका का उपयोग नहीं किया जाएगा




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दृश्य अद्यतन होने पर तालिका को कैसे अपडेट करें?

  2. कैसे Div () PostgreSQL में काम करता है

  3. बाहरी संपादक के साथ कमांड लाइन पर पोस्टग्रेज नहीं चल रहा है क्वेरी

  4. PostgreSQL पूर्ण पाठ खोज और ट्रिग्राम भ्रम

  5. पोस्टग्रेज jsonb_set एकाधिक कुंजियाँ अद्यतन