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

एक्सेस में ओडीबीसी लिंक्ड टेबल के लिए थोक INSERTs के प्रदर्शन को कैसे बढ़ाया जाए?

यह स्थिति असामान्य नहीं है जब एक्सेस में ओडीबीसी लिंक्ड टेबल के लिए थोक INSERTs से निपटते हैं। निम्नलिखित एक्सेस क्वेरी के मामले में

INSERT INTO METER_DATA (MPO_REFERENCE) 
SELECT MPO_REFERENCE FROM tblTempSmartSSP

जहां [METER_DATA] एक ODBC लिंक्ड टेबल है और [tblTempSmartSSP] एक स्थानीय (मूल) एक्सेस टेबल है, ODBC कुछ हद तक सीमित है कि यह कितना चतुर हो सकता है क्योंकि इसे लक्ष्य डेटाबेस की एक विस्तृत श्रृंखला को समायोजित करने में सक्षम होना चाहिए जिनकी क्षमताएं भिन्न हो सकती हैं बहुत। दुर्भाग्य से, इसका अक्सर मतलब होता है कि सिंगल एक्सेस SQL ​​स्टेटमेंट के बावजूद जो वास्तव में रिमोट (लिंक्ड) डेटाबेस को भेजा जाता है, वह एक अलग INSERT (या समकक्ष) होता है स्थानीय तालिका में प्रत्येक पंक्ति के लिए . स्वाभाविक रूप से, यह बहुत धीमा साबित हो सकता है यदि स्थानीय तालिका में बड़ी संख्या में पंक्तियाँ हों।

विकल्प 1:दूरस्थ डेटाबेस में नेटिव बल्क इंसर्ट्स

डेटा के बल्क लोडिंग के लिए सभी डेटाबेस में एक या अधिक नेटिव मैकेनिज्म होते हैं:Microsoft SQL सर्वर में "bcp" और BULK INSERT होता है। , और Oracle में "SQL*Loader" है। ये तंत्र थोक संचालन के लिए अनुकूलित हैं और आमतौर पर महत्वपूर्ण गति लाभ प्रदान करेंगे। वास्तव में, यदि डेटा को एक्सेस में आयात करने और दूरस्थ डेटाबेस में स्थानांतरित होने से पहले "मालिश" करने की आवश्यकता होती है, तो संशोधित डेटा को वापस टेक्स्ट फ़ाइल में डंप करना और फिर इसे दूरस्थ डेटाबेस में थोक आयात करना तेज़ हो सकता है।

विकल्प 2:एक्सेस में पास-थ्रू क्वेरी का उपयोग करना

यदि थोक आयात तंत्र एक व्यवहार्य विकल्प नहीं है, तो एक और संभावना है कि एक समय में एक से अधिक पंक्तियों को सम्मिलित करने वाले INSERT कथनों का उपयोग करके डेटा अपलोड करने के लिए एक्सेस में एक या अधिक पास-थ्रू क्वेरीज़ का निर्माण किया जाए।

उदाहरण के लिए, यदि दूरस्थ डेटाबेस SQL ​​सर्वर (2008 या बाद का) था तो हम इस तरह एक एक्सेस पास-थ्रू (T-SQL) क्वेरी चला सकते थे

INSERT INTO METER_DATA (MPO_REFERENCE) VALUES (1), (2), (3)

एक INSERT कथन के साथ तीन पंक्तियाँ सम्मिलित करने के लिए।

एक अन्य पहले के प्रश्न के उत्तर के अनुसार यहाँ Oracle के लिए संगत सिंटैक्स होगा

INSERT ALL
    INTO METER_DATA (MPO_REFERENCE) VALUES (1)
    INTO METER_DATA (MPO_REFERENCE) VALUES (2)
    INTO METER_DATA (MPO_REFERENCE) VALUES (3)
SELECT * FROM DUAL;

मैंने 10,000 पंक्तियों वाली एक देशी [tblTempSmartSSP] तालिका का उपयोग करके SQL सर्वर (क्योंकि मेरे पास Oracle डेटाबेस तक पहुंच नहीं है) के साथ इस दृष्टिकोण का परीक्षण किया। कोड ...

Sub LinkedTableTest()
    Dim cdb As DAO.Database
    Dim t0 As Single

    t0 = Timer
    Set cdb = CurrentDb
    cdb.Execute _
            "INSERT INTO METER_DATA (MPO_REFERENCE) " & _
            "SELECT MPO_REFERENCE FROM tblTempSmartSSP", _
            dbFailOnError
    Set cdb = Nothing
    Debug.Print "Elapsed time " & Format(Timer - t0, "0.0") & " seconds."
End Sub

... मेरे परीक्षण वातावरण में निष्पादित होने में लगभग 100 सेकंड लगे।

इसके विपरीत निम्न कोड, जो ऊपर वर्णित अनुसार बहु-पंक्ति INSERT बनाता है (जिसे Microsoft टेबल वैल्यू कंस्ट्रक्टर कहता है) ...

Sub PtqTest()
    Dim cdb As DAO.Database, rst As DAO.Recordset
    Dim t0 As Single, i As Long, valueList As String, separator As String

    t0 = Timer
    Set cdb = CurrentDb
    Set rst = cdb.OpenRecordset("SELECT MPO_REFERENCE FROM tblTempSmartSSP", dbOpenSnapshot)
    i = 0
    valueList = ""
    separator = ""
    Do Until rst.EOF
        i = i + 1
        valueList = valueList & separator & "(" & rst!MPO_REFERENCE & ")"
        If i = 1 Then
            separator = ","
        End If
        If i = 1000 Then
            SendInsert valueList
            i = 0
            valueList = ""
            separator = ""
        End If
        rst.MoveNext
    Loop
    If i > 0 Then
        SendInsert valueList
    End If
    rst.Close
    Set rst = Nothing
    Set cdb = Nothing
    Debug.Print "Elapsed time " & Format(Timer - t0, "0.0") & " seconds."
End Sub

Sub SendInsert(valueList As String)
    Dim cdb As DAO.Database, qdf As DAO.QueryDef

    Set cdb = CurrentDb
    Set qdf = cdb.CreateQueryDef("")
    qdf.Connect = cdb.TableDefs("METER_DATA").Connect
    qdf.ReturnsRecords = False
    qdf.sql = "INSERT INTO METER_DATA (MPO_REFERENCE) VALUES " & valueList
    qdf.Execute dbFailOnError
    Set qdf = Nothing
    Set cdb = Nothing
End Sub

... समान परिणाम देने में 1 से 2 सेकंड का समय लगा।

(टी-एसक्यूएल टेबल वैल्यू कंस्ट्रक्टर्स एक बार में 1000 पंक्तियों को सम्मिलित करने तक सीमित हैं, इसलिए उपरोक्त कोड इससे थोड़ा अधिक जटिल है।)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अपवाद उठाए जाने पर Oracle में निरंतर सम्मिलित करना

  2. मैं Oracle में किसी तालिका को उपनाम कैसे दे सकता हूं?

  3. TO_CHAR(संख्या) Oracle में कार्य

  4. ऑरैकल पर हाइबरनेट अनुक्रम, @GeneratedValue(strategy =GenerationType.AUTO)

  5. Oracle® . से SQL सर्वर संग्रहीत कार्यविधियाँ