वैचारिक प्रश्न: क्या व्यक्तिगत प्रश्न जुड़ने की तुलना में तेज हैं, या: क्या मुझे ग्राहक की ओर से वांछित प्रत्येक जानकारी को एक सेलेक्ट स्टेटमेंट में निचोड़ने की कोशिश करनी चाहिए या केवल उतना ही उपयोग करना चाहिए जितना सुविधाजनक लगता है?
टीएल; डीआर : अगर मेरी क्वेरी व्यक्तिगत प्रश्नों को चलाने में अधिक समय लेती है, तो क्या यह मेरी गलती है या यह उम्मीद की जानी चाहिए?
सबसे पहले, मैं बहुत डेटाबेस प्रेमी नहीं हूं, इसलिए यह सिर्फ मेरे लिए हो सकता है, लेकिन मैंने देखा है कि जब मुझे कई तालिकाओं से जानकारी प्राप्त करनी होती है, तो व्यक्तिगत तालिकाओं पर कई प्रश्नों के माध्यम से इस जानकारी को प्राप्त करने के लिए "अक्सर" तेज़ होता है (शायद एक साधारण आंतरिक जुड़ाव वाले) और क्लाइंट पक्ष पर डेटा को एक साथ पैच करें जो कि एक (जटिल) क्वेरी में शामिल होने का प्रयास करने के लिए जहां मैं एक क्वेरी में सभी डेटा प्राप्त कर सकता हूं।
मैंने एक अत्यंत सरल उदाहरण को एक साथ रखने की कोशिश की है:
स्कीमा सेटअप :
CREATE TABLE MASTER
( ID INT NOT NULL
, NAME VARCHAR2(42 CHAR) NOT NULL
, CONSTRAINT PK_MASTER PRIMARY KEY (ID)
);
CREATE TABLE DATA
( ID INT NOT NULL
, MASTER_ID INT NOT NULL
, VALUE NUMBER
, CONSTRAINT PK_DATA PRIMARY KEY (ID)
, CONSTRAINT FK_DATA_MASTER FOREIGN KEY (MASTER_ID) REFERENCES MASTER (ID)
);
INSERT INTO MASTER values (1, 'One');
INSERT INTO MASTER values (2, 'Two');
INSERT INTO MASTER values (3, 'Three');
CREATE SEQUENCE SEQ_DATA_ID;
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 1, 1.3);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 1, 1.5);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 1, 1.7);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 2, 2.3);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 3, 3.14);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 3, 3.7);
क्वेरी A :
select NAME from MASTER
where ID = 1
परिणाम :
| NAME |
--------
| One |
क्वेरी B :
select ID, VALUE from DATA
where MASTER_ID = 1
परिणाम :
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
क्वेरी C :
select M.NAME, D.ID, D.VALUE
from MASTER M INNER JOIN DATA D ON M.ID=D.MASTER_ID
where M.ID = 1
परिणाम :
| NAME | ID | VALUE |
---------------------
| One | 1 | 1.3 |
| One | 2 | 1.5 |
| One | 3 | 1.7 |
बेशक, मैंने इनमें से किसी भी प्रदर्शन को नहीं मापा, लेकिन कोई भी निरीक्षण कर सकता है:
- क्वेरी A + B क्वेरी सी के रूप में उपयोग करने योग्य जानकारी की एक ही राशि लौटाता है।
- A + B को क्लाइंट को 1 + 2x3 == 7 "डेटा सेल" वापस करना होगा
- C को क्लाइंट को 3x3 == 9 "डेटा सेल्स" वापस करना होगा, क्योंकि जॉइन के साथ मैं स्वाभाविक रूप से परिणाम सेट में कुछ अतिरेक शामिल करता हूं।
इससे सामान्यीकरण (जहाँ तक यह है):
एक ज्वाइन की गई क्वेरी को हमेशा अलग-अलग प्रश्नों की तुलना में अधिक डेटा वापस करना होता है जो समान जानकारी प्राप्त करते हैं। चूंकि डेटाबेस को डेटा को एक साथ मिलाना होता है, बड़े डेटासेट के लिए कोई यह मान सकता है कि डेटाबेस को व्यक्तिगत की तुलना में एकल सम्मिलित क्वेरी पर अधिक काम करना होगा, क्योंकि (कम से कम) इसके लिए क्लाइंट को अधिक डेटा वापस करना होगा।
क्या इससे इसका अनुसरण होगा, कि जब मैं देखता हूं कि ग्राहक क्वेरी को कई प्रश्नों में विभाजित करने से बेहतर प्रदर्शन मिलता है, तो यह सिर्फ जाने का तरीका है, या इसका मतलब यह होगा कि मैंने सम्मिलित क्वेरी को गड़बड़ कर दिया है?