sql - एक बेहतर विकल्प की आवश्यकता है-32 बार एक ही तालिका में शामिल होने के लिए




join query-optimization (4)

आप ऐसे फ़ंक्शन बना सकते हैं जो VARCHAR (10) एन्कोडेड_वर के पैरामीटर के रूप में लेता है और VARCHAR (50) डिकोडेड_डेस्क वापस लौटाता है, तो आपका चयन कुछ ऐसा होगा:

SELECT TRANS_ID,
     ENCODED_1, somefunc(ENCODED_1) AS DECODED_DESC_1,
     ENCODED_2, somefunc(ENCODED_2) AS DECODED_DESC_2,
     etc.

एक बार में लौटने पर आप जिस पंक्ति की योजना बना रहे हैं, उसके आधार पर यह संभव होगा।

मेरे पास एक गंदा एसक्यूएल क्वेरी समस्या है और मैं एक सुरुचिपूर्ण समाधान के साथ मदद करना चाहूंगा। मैं एक ही मेज पर 32 बाएं बाहरी जुड़ने से बचने की कोशिश कर रहा हूं।

डेटाबेस टेराडाटा है

मेरे पास 14 लाख रिकॉर्ड और 33 कॉलम के साथ एक मेज है। प्राथमिक कुंजी (इसे ट्रांस्_आईडी कहते हैं), और 32 एन्कोडेड फ़ील्ड (चलो इनको एन्कोडेड 1 ... एन्कोडेड_32) कहते हैं। कुछ इस तरह:

CREATE SET TABLE BigTable ,NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT
     (
      TRANS_ID VARCHAR(20) CHARACTER SET LATIN NOT CASESPECIFIC,
      ENCODED_1 VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC,
      ENCODED_2 VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC,
      ENCODED_3 VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC,
      ...
      ENCODED_32 VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC )
PRIMARY INDEX ( TRANS_ID );

मेरे पास कोडित / डीकोड किए गए मानों के साथ एक भी मेज है मान लीजिए कि इस तालिका में 100 रिकॉर्ड हैं।

CREATE SET TABLE LookupTable ,NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT
     (
      UNIQ_PK { just random numbers }
      ENCODED_VAR VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC,
      DECODED_DESC VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC)
PRIMARY INDEX ( UNIQ_PK );

मैं इस तरह एक गंदा सम्बन्ध से बचना चाहता हूं (मैं सभी 32 बाहरी जोड़ों को प्रदर्शित करने के बजाय एलीपर्स का इस्तेमाल करता हूं):

SELECT 
TRANS_ID
, a.ENCODED_1
, b1.DECODED_DESC DECODED_DESC_1
, a.ENCODED_2
, b2.DECODED_DESC DECODED_DESC_2
...
, a.ENCODED_31
, b31.DECODED_DESC DECODED_DESC_31
, a.ENCODED_32
, b32.DECODED_DESC DECODED_DESC_32
FROM BigTable a
LEFT OUTER JOIN LookupTable b1 ON a.ENCODED_1 = b1.ENCODED
LEFT OUTER JOIN LookupTable b2 ON a.ENCODED_2 = b1.ENCODED
...
LEFT OUTER JOIN LookupTable b31 ON a.ENCODED_31 = b31.ENCODED
LEFT OUTER JOIN LookupTable b32 ON a.ENCODED_32 = b32.ENCODED

किसी भी सहायता की सराहना की जाएगी। मुझे लगता है कि 14 एम रिकॉर्ड होने में 32 बार ऐसा करने का सबसे अच्छा तरीका नहीं है!


क्या आप ऐसा नहीं कर सकते हैं:

SELECT 
TRANS_ID
, a.ENCODED_1
, CASE a.ENCODED_1 WHEN b.ENCODED THEN b.DECODED_DESC END DECODED_DESC_1
, a.ENCODED_2
, CASE a.ENCODED_2 WHEN b.ENCODED THEN b.DECODED_DESC END DECODED_DESC_2
...
, a.ENCODED_31
, CASE a.ENCODED_31 WHEN b.ENCODED THEN b.DECODED_DESC END DECODED_DESC_31
, a.ENCODED_32
, CASE a.ENCODED_32 WHEN b.ENCODED THEN b.DECODED_DESC END DECODED_DESC_32
FROM BigTable a
 LEFT JOIN LookupTable b ON (
   a.ENCODED_1 = b.ENCODED OR
   a.ENCODED_2 = b.ENCODED OR
   ...
   a.ENCODED_31 = b.ENCODED OR
   a.ENCODED_32 = b.ENCODED
 )

?

मुझे शामिल होने की शर्त को फिर से लिखने का मोहक हो सकता है:

...ON b.ENCODED IN (a.ENCODED_1, a.ENCODED_2, ... a.ENCODED_31, a.ENCODED_32)

लेकिन मुझे वाकई यकीन नहीं है कि यह पूर्व संस्करण की तुलना में धीमी गति से नहीं हो सकता है दरअसल, मेरा अनुमान है, यह वास्तव में धीमा हो जाएगा, लेकिन मैं अभी भी यह सुनिश्चित करने के लिए पुष्टि करता हूं।


मैं लुकअप तालिका पर पीआई को शुरुआत के लिए एन्कोडेड_पर में बदलूंगा। लुकअप तालिका में शामिल होने के लिए आपको पहले से ही प्रत्येक एन्कोडेड_वर कॉलम पर बड़ी तालिका को पुनर्वितरित करना होगा। प्रत्येक बार लुकअप सारणी को फिर से वितरित करने के लिए परेशान क्यों करना चाहिए

क्या कोई कारण है कि आपका टेबल डिज़ाइन करीब कुछ नहीं है

CREATE SET TABLE BigTable ,NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT
     (
      TRANS_ID    VARCHAR(20) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      ENCODED_VAR VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL
UNIQUE PRIMARY INDEX ( TRANS_ID, ENCODED_VAR );

यह ट्रांस_आईडी और एन्कोडेड_वर के बीच एक और उचित 1: M रिश्ते बनाएगा। जब तक उचित जानकारी नहीं दी जाती है, जो बताती है कि यह क्यों काम नहीं करेगा। वास्तव में, यदि आवश्यक हो तो आप इस टेबल को रिलेशनशिप टेबल के रूप में बना सकते हैं और एक और मेज है जो ऐसा दिखता है:

    CREATE SET TABLE BigTable2 ,NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT
         (
          TRANS_ID    VARCHAR(20) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
          OtherData1  VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
          OtherData2  SMALLINT NOT NULL,
          ....,
          OtherDataN  VARCHAR(10) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL
   UNIQUE PRIMARY INDEX ( TRANS_ID );

उम्मीद है की वो मदद करदे।


यदि आप बार-बार एक ही प्रश्न लिखना नहीं चाहते हैं, तो मैं इसे एक दृश्य में डाल देने का सुझाव देता हूं।

प्रदर्शन के लिए, मैं निम्नलिखित सुझाव देता हूं:

  • जैसा रोब पालर ने सिफारिश की, लुकअपटेबल पर प्राथमिक सूचकांक को एनकोडीडीवीएआर में बदल दिया।
  • लुकअपटेबल में, DECODED_DESC = नल और एनकोडीडीवीवीआर = कुछ मूल्य जो आप कभी भी उपयोग नहीं करेंगे के साथ एक नया रिकॉर्ड जोड़ें। इस मूल्य के साथ सभी रिक्त ENCODED_ * को बदलने के लिए बिगटेबल अपडेट करें फिर आप सभी पूछताछ को बदल सकते हैं ताकि सभी अंदरूनी मिलकर उपयोग किया जा सके और उसी परिणाम प्राप्त कर सकें।






teradata