मैं एक साथ जुड़े हुए कई तालिकाओं को क्वेरी कर रहा हूँ

SELECT a.column, b.column, c.column 
FROM t1 AS a, t2 AS b, t3 AS c
WHERE a.column = b.column AND a.column = b.column AND a.column = b.column

क्या स्कैन किए गए डेटा की मात्रा को सीमित करने का कोई तरीका है, इसलिए यह संपूर्ण डेटासेट को क्वेरी नहीं करता है? ध्यान दें कि दिनांक/समय या किसी अन्य शर्त के अनुसार फ़िल्टर करने की संभावना नहीं है।

मुझे पता है कि यदि आप LIMIT 100 डालते हैं तो यह अभी भी पूरे परिणाम सेट को क्वेरी कर सकता है। क्या सचमुच 100 पंक्तियों के एक यादृच्छिक सेट को क्वेरी करने और उन्हें वापस करने का कोई तरीका है (क्वेरी समय और कार्यभार में कटौती)

0
cloudycider 1 पद 2020, 14:30

1 उत्तर

सबसे बढ़िया उत्तर

LIMIT का समर्थन करने वाले डेटाबेस में, LIMIT परिणाम सेट पर लागू होता है स्कैन किए जा रहे डेटा पर नहीं। SQL अनुकूलक जो भी निष्पादन योजना चाहता है उसे चुनने के लिए स्वतंत्र है। यह LIMIT को ध्यान में रख सकता है, इसलिए क्वेरी को "समय से अंतिम पंक्ति" के बजाय "पहली पंक्ति का समय" के लिए अनुकूलित किया गया है।

इसके बाद, आपको उचित, स्पष्ट, मानक, पढ़ने योग्य JOIN सिंटैक्स का उपयोग करना चाहिए। यदि आप पढ़े गए डेटा की मात्रा को सीमित करना चाहते हैं, तो आप एक सबक्वायरी में सीमा लगा सकते हैं:

SELECT a.column, b.column, c.column 
FROM (SELECT t1.*
      FROM t1 
      LIMIT 100
     ) a JOIN
     t2 b
     ON a.column = b.column JOIN
     t3 c
     ON c.column = b.column  -- or whatever;

नोट: यह 100 पंक्तियों को वापस करने की गारंटी नहीं है, लेकिन इसे t1 की स्कैनिंग को सीमित करना चाहिए - जो प्रासंगिक हो भी सकता है और नहीं भी। साथ ही, आपका एक मूल टैग BigQuery था और केवल स्कैन की गई पंक्तियों की संख्या को सीमित करने से प्रदर्शन पर कोई प्रभाव नहीं पड़ता है (जैसा कि विभाजन को काटने के विपरीत)।

मुझे यह भी ध्यान रखना चाहिए कि LIMIT आमतौर पर ORDER BY के साथ प्रयोग किया जाता है, इसलिए परिणाम सेट स्थिर है। यानी, ORDER BY एक अनिश्चित (लेकिन यादृच्छिक नहीं) 100 पंक्तियों को वापस करने के बजाय इसे एक रन से दूसरे रन के अनुरूप बना देगा।

2
Gordon Linoff 1 पद 2020, 11:40