क्या ये बराबर हैं? अगर नहीं तो क्यों?
सूचकांक (user_id1, user_id2) और सूचकांक (user_id2, user_id1)
ये समतुल्य नहीं हैं और आम तौर पर बोलने वाले सूचकांक (बार, बाज) फॉर्म के प्रश्नों के लिए कुशल नहीं होंगे select * from foo where baz=?
इरविन ने प्रदर्शित किया है कि इस तरह के सूचकांक वास्तव में एक क्वेरी को गति दे सकते हैं लेकिन यह प्रभाव सीमित है और उसी क्रम का नहीं है जैसा कि आप आमतौर पर एक सूचकांक में एक लुकअप में सुधार की उम्मीद करते हैं - यह इस तथ्य पर निर्भर करता है कि सूचकांक का 'पूर्ण स्कैन' अक्सर होता है अनुक्रमणिका में दिखाई नहीं देने वाले तालिका में अतिरिक्त स्तंभों के कारण अनुक्रमित तालिका के 'पूर्ण स्कैन' से तेज।
सारांश: गैर-प्रमुख स्तंभों पर भी अनुक्रमणिका प्रश्नों की मदद कर सकती है, लेकिन दो माध्यमिक और अपेक्षाकृत मामूली तरीकों में से एक में और नाटकीय तरीके से नहीं, आप सामान्य रूप से सूचकांक की अपेक्षा करते हैं क्योंकि यह btree संरचना के कारण मदद करने के लिए है
nb दो तरीकों से अनुक्रमणिका की मदद कर सकता है यदि सूचकांक की एक पूर्ण स्कैन तालिका के पूर्ण स्कैन की तुलना में काफी सस्ती है और या तो: 1. तालिका लुकअप सस्ते हैं (क्योंकि उनमें से कुछ हैं या वे क्लस्टर किए गए हैं), या 2. सूचकांक को कवर किया जा रहा है, इसलिए सभी उफ़ पर कोई तालिका लुकअप नहीं है , यहां इरविन की टिप्पणियों को देखें
testbed:
create table foo(bar integer not null, baz integer not null, qux text not null);
insert into foo(bar, baz, qux)
select random()*100, random()*100, 'some random text '||g from generate_series(1,10000) g;
क्वेरी 1 (कोई सूचकांक नहीं, 74 बफ़र्स को मारना ):
explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Aggregate (cost=181.41..181.42 rows=1 width=32) (actual time=3.301..3.302 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=74
-> Seq Scan on stack.foo (cost=0.00..181.30 rows=43 width=32) (actual time=0.043..3.228 rows=52 loops=1)
Output: bar, baz, qux
Filter: (foo.baz = 0)
Buffers: shared hit=74
Total runtime: 3.335 ms
क्वेरी 2 (इंडेक्स के साथ - ऑप्टिमाइज़र इंडेक्स को अनदेखा करता है - फिर से 74 बफ़र्स को मारता है ):
create index bar_baz on foo(bar, baz);
explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Aggregate (cost=199.12..199.13 rows=1 width=32) (actual time=3.277..3.277 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=74
-> Seq Scan on stack.foo (cost=0.00..199.00 rows=50 width=32) (actual time=0.043..3.210 rows=52 loops=1)
Output: bar, baz, qux
Filter: (foo.baz = 0)
Buffers: shared hit=74
Total runtime: 3.311 ms
क्वेरी 2 (सूचकांक के साथ - और हम इसे उपयोग करने के लिए अनुकूलक को ट्रिक करते हैं):
explain (buffers, analyze, verbose) select max(qux) from foo where bar>-1000 and baz=0;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=115.56..115.57 rows=1 width=32) (actual time=1.495..1.495 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=36 read=30
-> Bitmap Heap Scan on stack.foo (cost=73.59..115.52 rows=17 width=32) (actual time=1.370..1.428 rows=52 loops=1)
Output: bar, baz, qux
Recheck Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
Buffers: shared hit=36 read=30
-> Bitmap Index Scan on bar_baz (cost=0.00..73.58 rows=17 width=0) (actual time=1.356..1.356 rows=52 loops=1)
Index Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
Buffers: shared read=30
Total runtime: 1.535 ms
इसलिए सूचकांक के माध्यम से पहुंच इस मामले में 30 बफर्स को मारते हुए दोगुनी तेजी से होती है - जो कि अनुक्रमण के संदर्भ में 'थोड़ा तेज' है!, और YMMV फ़िल्टर किए गए पंक्तियों और क्लस्टर विशेषताओं की संख्या के साथ तालिका और सूचकांक के सापेक्ष आकार पर निर्भर करता है; तालिका में डेटा का
इसके विपरीत, प्रमुख स्तंभ पर क्वेरीज़ सूचकांक की btree संरचना का उपयोग करती हैं - इस मामले में 2 बफ़र्स मारते हैं :
explain (buffers, analyze, verbose) select max(qux) from foo where bar=0;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=75.70..75.71 rows=1 width=32) (actual time=0.172..0.173 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=38
-> Bitmap Heap Scan on stack.foo (cost=4.64..75.57 rows=50 width=32) (actual time=0.036..0.097 rows=59 loops=1)
Output: bar, baz, qux
Recheck Cond: (foo.bar = 0)
Buffers: shared hit=38
-> Bitmap Index Scan on bar_baz (cost=0.00..4.63 rows=50 width=0) (actual time=0.024..0.024 rows=59 loops=1)
Index Cond: (foo.bar = 0)
Buffers: shared hit=2
Total runtime: 0.209 ms