यह इस पर निर्भर करता है कि आप कैसे खोजते हैं।
अगर आप इस तरह खोजते हैं:
/* Given a value from table1, find all related values from table2 */
SELECT *
FROM table1 t1
JOIN table_table tt ON (tt.table_1 = t1.id)
JOIN table2 t2 ON (t2.id = tt.table_2)
WHERE t1.id = @id
तो आपको चाहिए:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
इस मामले में, table1
NESTED LOOPS
में अग्रणी होगा और आपकी अनुक्रमणिका तभी प्रयोग योग्य होगी जब table1
पहले अनुक्रमित किया जाता है।
अगर आप इस तरह खोजते हैं:
/* Given a value from table2, find all related values from table1 */
SELECT *
FROM table2 t2
JOIN table_table tt ON (tt.table_2 = t2.id)
JOIN table1 t1 ON (t1.id = tt.table_1)
WHERE t2.id = @id
तो आपको चाहिए:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
उपरोक्त कारणों से।
आपको यहां स्वतंत्र सूचकांकों की आवश्यकता नहीं है। एक समग्र सूचकांक का उपयोग हर जगह किया जा सकता है जहां पहले कॉलम पर एक सादा सूचकांक का उपयोग किया जा सकता है। यदि आप स्वतंत्र सूचकांकों का उपयोग करते हैं, तो आप दोनों मूल्यों के लिए कुशलता से खोज नहीं कर पाएंगे:
/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
AND table_2 = @id2
इस तरह की क्वेरी के लिए, आपको दोनों स्तंभों पर कम से कम एक अनुक्रमणिका की आवश्यकता होगी।
दूसरे क्षेत्र के लिए एक अतिरिक्त अनुक्रमणिका रखना कभी भी बुरा नहीं होता:
ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)
खोजों के लिए प्राथमिक कुंजी का उपयोग किया जाएगा on both values
और table_1
. के मान पर आधारित खोजों के लिए , table_2
. के मान के आधार पर खोजों के लिए अतिरिक्त अनुक्रमणिका का उपयोग किया जाएगा ।