अपडेट करें:
परिकलित स्तंभों का उपयोग करके अपनी क्वेरी के लिए कुशल अनुक्रमण रणनीति के लिए मेरे ब्लॉग में यह लेख देखें:
मुख्य विचार यह है कि हम केवल गोल length
. की गणना करते हैं और startDate
आपके लिए श्रेणियां हैं और फिर समानता शर्तों का उपयोग करके उन्हें खोजें (जो B-Tree
. के लिए अच्छे हैं अनुक्रमणिका)
MySQL
. में और SQL Server 2008
. में आप SPATIAL
. का उपयोग कर सकते हैं इंडेक्स (R-Tree
)।
वे "रिकॉर्ड की सीमा के अंदर दिए गए बिंदु के साथ सभी रिकॉर्ड का चयन करें" जैसी स्थितियों के लिए विशेष रूप से अच्छे हैं, जो कि सिर्फ आपका मामला है।
आप start_date
स्टोर करते हैं और end_date
LineString
. की शुरुआत और अंत के रूप में (उन्हें UNIX
. में परिवर्तित करना किसी अन्य संख्यात्मक मान के टाइमस्टैम्प), उन्हें SPATIAL
. के साथ अनुक्रमित करें अनुक्रमणिका और ऐसे सभी LineString
. की खोज करें s जिसका न्यूनतम बाउंडिंग बॉक्स (MBR
) में MBRContains
. का उपयोग करते हुए, विचाराधीन दिनांक मान शामिल है ।
मेरे ब्लॉग में इस प्रविष्टि को MySQL
में इसे कैसे करें, इस पर देखें :
और SQL Server
के लिए एक संक्षिप्त प्रदर्शन सिंहावलोकन :
किसी दिए गए IP
. को खोजने के लिए एक ही समाधान लागू किया जा सकता है डेटाबेस में संग्रहीत नेटवर्क श्रेणियों के विरुद्ध।
यह कार्य, आपकी क्वेरी के साथ, ऐसी स्थिति का एक और अक्सर उपयोग किया जाने वाला उदाहरण है।
सादा B-Tree
यदि श्रेणियां ओवरलैप हो सकती हैं तो अनुक्रमणिकाएँ अच्छी नहीं हैं।
यदि वे नहीं कर सकते (और आप इसे जानते हैं), तो आप @AlexKuznetsov
द्वारा प्रस्तावित शानदार समाधान का उपयोग कर सकते हैं
यह भी ध्यान दें कि यह क्वेरी प्रदर्शन पूरी तरह से आपके डेटा वितरण पर निर्भर करता है।
अगर आपके पास B
. में बहुत सारे रिकॉर्ड हैं और A
. में कुछ रिकॉर्ड , आप बस B.dates
. पर एक अनुक्रमणिका बना सकते हैं और TS/CIS
. दें A
. पर जाओ।
यह क्वेरी हमेशा A
. से सभी पंक्तियों को पढ़ेगी और Index Seek
. का उपयोग करेगा B.dates
. पर नेस्टेड लूप में।
यदि आपका डेटा दूसरे तरीके से वितरित किया जाता है, i. इ। आपके पास A
. में बहुत सारी पंक्तियाँ हैं लेकिन कुछ B
. में , और श्रेणियां आम तौर पर छोटी होती हैं, तो आप अपनी तालिकाओं को थोड़ा नया स्वरूप दे सकते हैं:
A
start_date interval_length
, A (interval_length, start_date)
. पर एक कंपोजिट इंडेक्स बनाएं
और इस क्वेरी का उपयोग करें:
SELECT *
FROM (
SELECT DISTINCT interval_length
FROM a
) ai
CROSS JOIN
b
JOIN a
ON a.interval_length = ai.interval_length
AND a.start_date BETWEEN b.date - ai.interval_length AND b.date