Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

दिनांक सीमा दी गई इस क्वेरी के लिए सबसे तेज़ तरीका (सबसे अच्छी रणनीति क्या है)

अपडेट करें:

परिकलित स्तंभों का उपयोग करके अपनी क्वेरी के लिए कुशल अनुक्रमण रणनीति के लिए मेरे ब्लॉग में यह लेख देखें:

मुख्य विचार यह है कि हम केवल गोल 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर 2008 को जावा से कनेक्ट करना:उपयोगकर्ता त्रुटि के लिए लॉगिन विफल रहा

  2. डेटाबेस से डेटा को टेक्स्टबॉक्स में कैसे प्रदर्शित करें, और इसे अपडेट करें

  3. SQL सर्वर में IF स्टेटमेंट कैसे काम करता है

  4. रजिस्ट्री के माध्यम से एसक्यूएल सर्वर इंस्टेंस का संस्करण और संस्करण कैसे खोजें

  5. स्केलर फ़ंक्शन पर उपयोगकर्ता परिभाषित तालिका प्रकार पैरामीटर को खाली सूची पास करना