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

परिणाम उपलब्ध होने तक एकाधिक चयनों को आजमाने का तरीका?

LIKE वाइल्डकार्ड के बिना वर्ण = . के बराबर है . मान लें कि आपका वास्तव में मतलब था name = 'text'

सूचकांक प्रदर्शन की कुंजी हैं।

परीक्षण सेटअप

CREATE TABLE image (
  image_id serial PRIMARY KEY
, group_id int NOT NULL
, name     text NOT NULL
);

आदर्श रूप से, आप दो इंडेक्स बनाते हैं (प्राथमिक कुंजी के अतिरिक्त):

CREATE INDEX image_name_grp_idx ON image (name, group_id);
CREATE INDEX image_grp_idx ON image (group_id);

दूसरा मई डेटा वितरण और अन्य विवरणों के आधार पर आवश्यक नहीं है। यहां स्पष्टीकरण:

  • क्या पहले फ़ील्ड पर प्रश्नों के लिए एक समग्र अनुक्रमणिका भी अच्छी है?

क्वेरी

यह सबसे तेज़ संभव होना चाहिए आपके मामले के लिए क्वेरी:

SELECT * FROM image WHERE name = 'name105' AND group_id = 10
UNION ALL
SELECT * FROM image WHERE name = 'name105'
UNION ALL
SELECT * FROM image WHERE group_id = 10
LIMIT  1;

एसक्यूएल फिडल.

LIMIT खंड पूरी क्वेरी पर लागू होता है। पोस्टग्रेज काफी स्मार्ट है निष्पादित करने के लिए नहीं UNION ALL . के बाद के चरण जैसे ही उसे LIMIT . को संतुष्ट करने के लिए पर्याप्त पंक्तियां मिलती हैं . नतीजतन, पहले . में एक मैच के लिए SELECT क्वेरी का, EXPLAIN ANALYZE . का आउटपुट ऐसा दिखता है (दाईं ओर स्क्रॉल करें! ):

Limit  (cost=0.00..0.86 rows=1 width=40) (actual time=0.045..0.046 rows=1 loops=1)
  Buffers: local hit=4
  ->  Result  (cost=0.00..866.59 rows=1002 width=40) (actual time=0.042..0.042 rows=1 loops=1)
        Buffers: local hit=4
        ->  Append  (cost=0.00..866.59 rows=1002 width=40) (actual time=0.039..0.039 rows=1 loops=1)
              Buffers: local hit=4
              ->  Index Scan using image_name_grp_idx on image  (cost=0.00..3.76 rows=2 width=40) (actual time=0.035..0.035 rows=1 loops=1)
                    Index Cond: ((name = 'name105'::text) AND (group_id = 10))
                    Buffers: local hit=4
              ->  Index Scan using image_name_grp_idx on image  (cost=0.00..406.36 rows=500 width=40) (never executed)
                    Index Cond: (name = 'name105'::text)
              ->  Index Scan using image_grp_idx on image  (cost=0.00..406.36 rows=500 width=40) (never executed)
                    Index Cond: (group_id = 10)
Total runtime: 0.087 ms

बोल्ड जोर मेरा।

नहीं करें एक ORDER BY . जोड़ें खंड , यह प्रभाव शून्य हो जाएगा। फिर पोस्टग्रेज़ को शीर्ष पंक्ति पर लौटने से पहले सभी पंक्तियों पर विचार करना होगा।

अंतिम प्रश्न

<ब्लॉकक्वॉट>

क्या इसका कोई सामान्य समाधान है?

यह है सामान्य समाधान। अधिक से अधिक SELECT जोड़ें बयान जैसा आप चाहते हैं।

<ब्लॉकक्वॉट>

बेशक यह तब काम आएगा जब खोज परिणाम को उसकी प्रासंगिकता के अनुसार क्रमबद्ध किया जाएगा।

परिणाम में केवल एक पंक्ति है LIMIT 1 . के साथ . छँटाई के प्रकार।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्प्रिंग बैच - पोस्टग्रेज पर मेटाडेटा टेबल बनाने और वास्तविक डेटा को mysql में लोड करने में असमर्थ

  2. हेरोकू पोस्टग्रेस त्रुटि:PGError:त्रुटि:संबंध संगठन मौजूद नहीं है (ActiveRecord ::StatementInvalid)

  3. टुपल्स क्रमिक रूप से डेटाबेस तालिका में सम्मिलित नहीं हैं?

  4. सम्मिलित करें ... चयन से ... रिटर्निंग आईडी मैपिंग

  5. PostgreSQL के लिए कैशिंग का अवलोकन