sql ओरेकल 10 जी पहले से कनेक्ट-प्रदर्शन मुद्दे




oracle plsql (4)

मेरे पास निम्न SQL कथन है:

SELECT 
    CONNECT_BY_ROOT ANIMAL_ID "ORIGINAL_ANIMAL" ,
    ANIMAL_ID, LINE_ID, SIRE_ANIMAL_ID, DAM_ANIMAL_ID,
    LEVEL -1 "LEVEL" FROM ANIMALS 
START WITH ANIMAL_ID IN( '2360000002558' )
CONNECT BY
  ((PRIOR SIRE_ANIMAL_ID = ANIMAL_ID and LEVEL < 5) OR (PRIOR DAM_ANIMAL_ID = ANIMAL_ID AND LEVEL < 5))

यह लगभग 1.6 लाख जानवरों के साथ एक टेबल में है प्रत्येक रिकॉर्ड में Animal_Id, Sire_Animal_Id, और Dam_Animal_Id (पिता = पिता, बांध = माँ) है

मैं पूर्ण पशु वंश प्रदर्शित करने के लिए इस एसक्यूएल का उपयोग करता हूं परिणाम पशु, 2 अभिभावक, 4 दादा दादी, आदि दिखाएंगे।

मेरा मुद्दा यह है कि यह कथन एक जानवर के लिए 15 सेकंड लेता है। इस को अनुकूलित करने का एक तरीका होना चाहिए। कोई विचार?


मेरे पास यह परीक्षण करने के लिए बहुत समय नहीं था, इसलिए उत्तर में डाइर का थोड़ा सा है, लेकिन इनलाइन दृश्य सहायता का उपयोग करना होगा?

जैसा कि आपने एक स्पष्टीकरण योजना पोस्ट नहीं की है, मैं बहुत ज्यादा मदद नहीं कर सकता मैं डरता हूं और नीचे दिए गए समाधान में, आपको मिल सकता है कि आप के साथ क्लोन में संघ आपको प्रदर्शन के मुद्दों का कारण बनता है, लेकिन यह आपके रास्ते पर आपकी मदद कर सकता है उपाय।

WITH ani
  AS (SELECT animal_id, 
             line_id, 
             sire_animal_id, 
             dam_animal_id, 
             sire_animal_id AS generic_id
        FROM animals
      UNION
      SELECT animal_id, 
             line_id, 
             sire_animal_id, 
             dam_animal_id, 
             dam_animal_id AS generic_id
        FROM animals)
SELECT CONNECT_BY_ROOT animal_id "ORIGINAL_ANIMAL",
       animal_id,
       line_id,
       sire_animal_id,
       dam_animal_id,
       LEVEL - 1 "LEVEL"
  FROM ani
 START WITH animal_id = '2360000002558'
 CONNECT BY (PRIOR generic_id = animal_id AND LEVEL < 5 )

हाँ, अनुक्रमित हैं।


क्या sire_animal_id और dam_animal_id पर अनुक्रमित हैं? यह पूरी मेज स्कैन कर रहा हो सकता है


मैंने अपनी स्थिति को पुनः बनाने की कोशिश की और मुझे ऑरेकल को सुगमता से उपयोग करने में सक्षम नहीं था I मुझे यकीन है कि ऐसा करने के लिए कुछ चतुर तरीका है। लेकिन अगर यहां कोई और नहीं समझ सकता है, तो नीचे मूक, बदसूरत रास्ता है।

चूंकि आपको केवल निश्चित स्तरों की संख्या मिल रही है, इसलिए आप मैन्युअल रूप से कनेक्ट बना सकते हैं। दूसरे स्तर पर (जो पहली क्वेरी की एक कॉपी से परिणाम प्राप्त होता है) पहला स्तर प्राप्त होता है, संघ जो तीसरे स्तर पर होता है (जो दूसरी क्वेरी की प्रतिलिपि का परिणाम होता है) आदि। केवल तीन स्तर यहां, लेकिन आप चौथे को बनाने के लिए कॉपी और पेस्ट कर सकते हैं। मूल आईडी को इतने बार दोहराया जाता है, इसलिए इसका उपयोग करना कठिन होता है, लेकिन यह सुपर फास्ट है (मेरे मशीन पर 1.6 लाख रिकॉर्ड के साथ 0.005 सेकंड।)

--Original animal
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 0 "level" from animals where animal_id = '101'
union all
--Parents
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
where animal_id = (select sire_animal_id from animals where animal_id = '101')
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
where animal_id = (select dam_animal_id from animals where animal_id = '101')
union all
--Grand parents
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
  select sire_animal_id from animals
  where animal_id = (select sire_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
  select dam_animal_id from animals
  where animal_id = (select sire_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
  select sire_animal_id from animals
  where animal_id = (select dam_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
  select dam_animal_id from animals
  where animal_id = (select dam_animal_id from animals where animal_id = '101')
);




hierarchical-query